2010-12-02 9 views
6

जब उपयोगकर्ता प्राथमिकता बदलता है तो मुझे एप्लिकेशन को पुनरारंभ करने की आवश्यकता होती है। ढेर को साफ़ करने से मेरी मदद नहीं होती है क्योंकि यह बैकएंड सेवा कॉल को रद्द नहीं करता है। मैं आवेदन प्रक्रिया को खुद ही मारना चाहता हूं। मैंआवेदन के भीतर से एंड्रॉइड एप्लिकेशन को पुनरारंभ कैसे करें

Process.killProcess(Process.myPid()); 

का उपयोग कर रहा हूं और यह एप्लिकेशन को मारने के लिए मेरे लिए काम करता है। लेकिन मुझे आवेदन को पुनरारंभ करना है। मतलब प्रक्रिया को मारता है और एक नई प्रक्रिया को ट्रिगर करता है ताकि एप्लिकेशन एक बार फिर से ताजा शुरू हो जाए।

क्या ऐसा करने का कोई तरीका है?

अग्रिम धन्यवाद।

+0

अगर यह परीक्षण प्रयोजनों के लिए या अगर इसके कुछ की जरूरत है मैं सोच रहा हूँ कि आपको एक लाइव ऐप में करने की ज़रूरत है? – jcollum

उत्तर

4

एंड्रॉइड ऐसा करने के लिए डिज़ाइन नहीं किया गया है, और यह "आवश्यकता" नहीं है। यह एक कार्यान्वयन है। आवश्यकता क्या है? पुनरारंभ किए बिना वरीयता परिवर्तनों को संभालने के लिए आप अपने ऐप को क्यों डिज़ाइन नहीं कर सकते? यह एक बहुत ही खराब समाधान की तरह लगता है।

+0

मेरे पास कुछ परीक्षण वातावरण हैं और उनके पास पर्यावरण विशिष्ट सर्वर के साथ कनेक्शन स्थापित करने के लिए उनके विशिष्ट गुण हैं। तो जब हम वातावरण के बीच स्विच करते हैं तो मुझे पूरे एप्लिकेशन को नए गुणों के साथ पुनरारंभ करने की आवश्यकता होती है। – AKh

+0

तो यह कोड या उत्पादन कोड परीक्षण के लिए है? यदि यह परीक्षण के लिए है, तो सुनिश्चित करें कि आगे बढ़ें और प्रक्रिया को मार दें। फिर आप इसे अपने परीक्षण कोड में फिर से शुरू कर सकते हैं। – Falmarri

+0

मैंने एप्लिकेशन को पुनरारंभ करने का विचार छोड़ दिया है, इसके बजाय मैं अपना HTTP कनेक्शन रीसेट कर रहा हूं ताकि पहले से समय समाप्त हो सके क्योंकि डिवाइस 20 मिनट से अधिक समय तक निष्क्रिय है। Thats हम अपने सर्वर से कनेक्ट करने के लिए नए कनेक्शन को पुन: स्थापित करने के लिए ऐप को पुनरारंभ करना क्यों चाहते थे। – AKh

2

ओएस डिज़ाइन करना ताकि एक ऐप स्वयं को फिर से शुरू कर सके, एक बहुत बुरा विचार जैसा लगता है। एंड्रॉइड ओएस को पर मुक्त होने की आवश्यकता है स्मृति को मुक्त करने के लिए एक प्रक्रिया को मारें - यदि ऐप स्वयं को फिर से शुरू कर सकता है तो अचानक मुक्त स्मृति का उपयोग किया जाता है। मैं फल्मररी से सहमत हूं, आपको जांच करनी होगी कि क्यों आपका ऐप फ्लाई पर वरीयता परिवर्तन से निपट नहीं सकता है।

+0

मैंने फल्मररी को विस्तृत आवश्यकता दी। क्या आप इसे देख सकते हैं और देख सकते हैं कि कोई ऐसा तरीका है जिसे हम कर सकते हैं। लेकिन वैसे भी मुझे आवेदन के भीतर से पुनरारंभ करने के लिए आवेदन की आवश्यकता है। यह निश्चित रूप से है और यह req बदला नहीं जा सकता है। – AKh

+0

तो यह अनिवार्य रूप से क्यूए प्रक्रिया को तेज करने की एक विधि है? – jcollum

+0

आप कभी नहीं जानते कि किसी एप्लिकेशन के लिए कौन सी आवश्यकताएं हो सकती हैं। उदाहरण के लिए, एक दुकान प्रदर्शन पर एक टैबलेट एक फिल्म गैर-स्टॉप खेल रहा है। जब कोई ग्राहक एंड्रॉइड होम स्क्रीन तक पहुंचने का प्रबंधन करता है, तो ऐप को तुरंत पुनः प्रारंभ करना चाहिए। – Yar

5

यह ऐसा कुछ नहीं है जिसे किसी को परीक्षण वातावरण के बाहर करने का प्रयास करना चाहिए।

जिसके अनुसार, दो विचारों:

1) बहुत निकट भविष्य में कुछ समय के लिए एक अलार्म सेट करें और फिर मारने अपनी प्रक्रिया

2) कुछ और (शायद एक छोटे से देशी प्रक्रिया या खोल शुरू स्क्रिप्ट) जो आपकी मौत का पता लगाएगा और आपको

के माध्यम से आपको पुनरारंभ करेगा, आप स्वयं को शुरू करने के लिए एक इरादे से फायरिंग करने का प्रयास कर सकते हैं और फिर जल्दी से मर रहे हैं, लेकिन यह कार्यान्वयन के आधार पर संभावित दौड़ की स्थिति की तरह लगता है। यदि आपने बाइंडर एफडी को/proc से बाहर निकाला है और देशी कोड में बुरी चीजें की हैं, तो आप इस तरह से इस तरह से इरादा बंद कर सकते हैं कि आपका एप्लिकेशन ioctl से वापसी पर क्रैश हो ...

0

यहां एक विचार:

ऐसी सेवा है जिसमें आपके शेष घटकों (गतिविधियों, सेवाओं, ...) की तुलना में एक अलग प्रक्रिया है।

ऐप को पुनरारंभ करने के लिए, इस सेवा को कॉल करें और ऐप के अन्य घटकों की प्रक्रियाओं को मारने के लिए यह क्या होगा, और उसके बाद उस गतिविधि को एक इरादा भेजें जिसे आप जाना चाहते हैं।

यह सिर्फ एक विचार है, क्योंकि मैंने कभी इसका परीक्षण नहीं किया है। कृपया मुझे बताएं कि क्या यह वास्तव में काम करता है तो जवाब शामिल करने के लिए प्रश्न को काम करता है और अपडेट करता है।

2

जब से तुम प्रक्रिया की मौत हो गई, आवेदन इस कोड का उपयोग को पुनः आरंभ करने के साथ किया जाता है:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName()); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 
+0

अच्छा समाधान !!! –

1

तुम सच में वर्तमान प्रक्रिया का एक मारने सहित अपना गतिविधि को पुनः आरंभ करना चाहते हैं, कोड निम्न का प्रयास करें। इसे एक हेल्पर क्लास में रखें या जहां आपको इसकी आवश्यकता है।

public static void doRestart(Context c) { 
     try { 
      //check if the context is given 
      if (c != null) { 
       //fetch the packagemanager so we can get the default launch activity 
       // (you can replace this intent with any other activity if you want 
       PackageManager pm = c.getPackageManager(); 
       //check if we got the PackageManager 
       if (pm != null) { 
        //create the intent with the default start activity for your application 
        Intent mStartActivity = pm.getLaunchIntentForPackage(
          c.getPackageName() 
        ); 
        if (mStartActivity != null) { 
         mStartActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         //create a pending intent so the application is restarted after System.exit(0) was called. 
         // We use an AlarmManager to call this intent in 100ms 
         int mPendingIntentId = 223344; 
         PendingIntent mPendingIntent = PendingIntent 
           .getActivity(c, mPendingIntentId, mStartActivity, 
             PendingIntent.FLAG_CANCEL_CURRENT); 
         AlarmManager mgr = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE); 
         mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
         //kill the application 
         System.exit(0); 
        } else { 
         Log.e(TAG, "Was not able to restart application, mStartActivity null"); 
        } 
       } else { 
        Log.e(TAG, "Was not able to restart application, PM null"); 
       } 
      } else { 
       Log.e(TAG, "Was not able to restart application, Context null"); 
      } 
     } catch (Exception ex) { 
      Log.e(TAG, "Was not able to restart application"); 
     } 
    } 

यह जेनी कक्षाओं और सभी स्थिर उदाहरणों को फिर से शुरू करेगा।

0

यदि यह एक एंटरप्राइज़ प्रोजेक्ट है जहां आपके पास डिवाइस का नियंत्रण है, तो आप आसानी से दूसरे एप्लिकेशन को इंस्टॉल कर सकते हैं जो पहले वॉचडॉग के रूप में कार्य करता है। मेरे क्लाइंट में से एक रात के अनुप्रयोग रीबूट (अजीब, गैर-तकनीकी कारणों के लिए) और स्वयं-सेवा (गैर प्ले स्टोर) एप्लिकेशन अपडेट की जांच और स्थापित करने के लिए ऐसी निगरानी करने के लिए ऐसे वॉचडॉग एप्लिकेशन का उपयोग करता है।

यदि आपको वास्तव में अपने एप्लिकेशन में होने से यह करना चाहता था, आप (ऊपर अपने मारने प्रक्रिया सहित) निम्न कर सकते हैं:

Process.killProcess(Process.myPid()); 
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 500 /* half a second*/, 
     PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()), 
           Intent.FLAG_ACTIVITY_NEW_TASK));