2016-03-11 6 views
10

मैंने स्टैक ओवरफ्लो और अन्य वेबसाइट में दिए गए कई तरीकों का प्रयास किया है लेकिन यह वास्तव में काम नहीं करता है।मैं चुपचाप एपीके को प्रोग्रामेटिक रूप से अपडेट कैसे करूं और ऐप को पुनरारंभ करूं?

मेरी समस्या यह है कि मेरे पास यह एप्लिकेशन है जिसे मुझे अद्यतन करने और अद्यतन करने के बाद, इसे स्वचालित रूप से उसी एप्लिकेशन (अपडेटेड) को चालू करना चाहिए।

यह मेरा कोड है: "। त्रुटि यहाँ है"

private synchronized void runRootUpdate() {  
    // Install Updated APK 
    String command = "pm install -r " + downloadPath + apkFile; 
    Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
    int test = proc.waitFor(); // Error is here. 

    if (proc.exitValue() == 0) { 
     // Successfully installed updated app 
     doRestart() 
    } else { 
     // Fail 
     throw new Exception("Root installation failed"); 
    } 
} 

private void doRestart() { 
    Intent mStartActivity = new Intent(context, MainActivity.class); 
    int mPendingIntentId = 123456; 
    PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
    System.exit(0); 
} 

मेरे पर एक नजर डालें मेरा पुराना ऐप एक नया अपडेट किया गया ऐप इंस्टॉल करेगा और खुद को मार देगा, इस प्रकार कोई proc.waitFor() नहीं है और होम स्क्रीन में वापस आ गया है लेकिन नया अपडेट किया गया ऐप इंस्टॉल किया जा रहा है। हालांकि, मुझे इसे अपने आप वापस चालू करने की आवश्यकता है। क्या मैं ऐसा कर सकता हूं?

+0

आप अब किसी भी समाधान है तो फिर आप अलार्म और कर अन्य बातों के लिए सेट करना होगा नहीं है ? –

+0

आप इसे अपडेट करने की योजना बना रहे हैं? यह तब होता है जब आपका एप्लिकेशन सराय अग्रभूमि चला रहा है? –

उत्तर

0

किसी एप्लिकेशन को अपडेट करने से इसकी सभी प्रक्रियाओं को मारना शामिल है। आप (एक 100 से अधिक एमएस देरी के साथ) बजे आदेश की शुरूआत से पहले अलार्म स्थापित करना चाहिए

0

सब आप को पता है, जहां अपने .apk फ़ाइल स्टोर करने के लिए, क्योंकि वह महत्वपूर्ण है, जबकि आवेदन उन्नयन की जरूरत है पहले।

चुपचाप एप्लिकेशन को अपग्रेड और लॉन्च करने के लिए आपको निम्न चरणों का पालन करना होगा।

सुनिश्चित करें कि आप अपने sdcard के क्षेत्र में नवीनतम .apk फ़ाइल है कि जब उन्नयन अपने application.If यह तो रहा है उन्नयन

File file = new File(Environment.getExternalStorageDirectory(), "app-debug.apk"); // mention apk file path here 
       if (file.exists()) { 
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
        startActivity(intent); 
       } else { 
        Toast.makeText(UpdateActivity.this, "file not exist", Toast.LENGTH_SHORT).show(); 
       } 

के लिए नीचे की तरह आशय के माध्यम से इसे लांच कोड से ऊपर डिफ़ॉल्ट के साथ अपने आवेदन में अपग्रेड कर देगा एंड्रॉइड का व्यवहार।

एक प्रसारण रिसीवर जो आप api> 12 उपयोग

<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
        </intent-filter> 

उपयोग कर रहे हैं आप api < = 12 उपयोग

रही है, तो जब उन्नयन

<receiver android:name=".receiver.OnUpgradeReceiver"> 
       <intent-filter> 
// Note: This intent can is available starting from API 12 
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
       </intent-filter> 
      </receiver> 

किया जाता है पता चल जाएगा बनाएं

<action android:name="android.intent.action.PACKAGE_REPLACED" /> 
    <data android:scheme="package" android:path="your.app.package" /> 

अद्यतन और प्रक्षेपण गतिविधि के बाद प्रसारित हो रही के लिए एक प्रसारण रिसीवर बनाएं जो आप चाहते हैं

उदाहरण:

public class OnUpgradeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // launch your fav activity from here. 
    } 
} 

ऊपर प्रसारण रिसीवर आप आवेदन चुपचाप शुरू करने के लिए मदद करता है।

आशा है कि ये आपकी मदद करें।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन ऐप को तत्काल बिना चुपचाप अपडेट करना चाहिए। –

+0

तो उनका कोई तरीका नहीं होना चाहिए क्योंकि यह एंड्रॉइड डिफ़ॉल्ट व्यवहार है। –

7

अलार्म सेट करने के बजाय, विशेष रूप से इस उद्देश्य के लिए एक मैनिफेस्ट पंजीकृत ब्रॉडकास्ट रिसीवर है।यह या तो कर सकते हैं android.intent.action.PACKAGE_REPLACED को सुनने के (ध्यान दें: शब्द कार्रवाई इस निरंतर से लापता है) या android.intent.action.MY_PACKAGE_REPLACED

<receiver android:name="..."> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACED"></action> 
     <data android:scheme="package" android:path="com.your.package" /> 
    </intent-filter> 
</receiver> 

करने के बाद अपने रिसीवर को पुनर्स्थापित यह संदेश प्राप्त होगा और आप एक गतिविधि शुरू करने के लिए सक्षम हो जाएगा

+0

पता नहीं क्यों यह जवाब इतना ऊंचा है क्योंकि प्रसारण रिसीवर को मेरे लिए कभी इरादा नहीं मिला है। –

+0

मैनिफेस्ट में पंजीकृत एक रिसीवर के लिए - एक गतिविधि पर प्रोग्रामेटिक नहीं है? –

+0

हां, इसे मैनिफेस्ट में पंजीकृत किया गया। –

0

हम्म ... जब आप रूट स्थापना का उपयोग कर रहे हैं, तो इस हार्ड मेटोड का उपयोग क्यों करें? ऐप अपडेट करने के लिए सरल खोल स्क्रिप्ट बनाने का प्रयास क्यों न करें?

स्क्रिप्ट (How to pass arguments, How to start app from terminal):

am kill com.myapp.package 
pm install -r $1 
am start -n packageName/pkgName.ActivityName 

अनुप्रयोग कोड:

String command = "sh script.sh " + downloadPath + apkFile; 
Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
+0

'sh script.sh" का अर्थ क्या है, क्या यह स्क्रिप्ट का मार्ग है? क्या इसे बाद में पढ़ने के लिए फ़ाइल के रूप में बनाया जा सकता है? –

+0

sh स्क्रिप्ट को निष्पादित करने के लिए शेल कमांड है script.sh स्क्रिप्ट पर पैच है और हाँ आप इसे फ़ाइल के रूप में बना सकते हैं। –

+0

यह है। धन्यवाद! –

संबंधित मुद्दे