2012-09-13 15 views
8

को मारने के लिए एप्लिकेशन थ्रेड बंद हो जाता है तो एप्लिकेशन को पुन: आमंत्रित करें। आवेदन को फिर से शुरू करने की आवश्यकता है जैसे कि अन्य एप्लिकेशन या टास्क मैनेजर द्वारा इसकी हत्या। कोई उपाय?एंड्रॉइड: यदि टास्क मैनेजर

उत्तर

0

हां, एक बार स्मृति कम समस्या आने के बाद एंड्रॉइड ओएस आवश्यक स्मृति की क्षतिपूर्ति के लिए आवेदन मारना शुरू कर देता है। सेवाओं का उपयोग करके आप इसे प्राप्त कर सकते हैं, आपकी सेवा को आपके आवेदन के साथ समानांतर चलाना चाहिए, लेकिन देखें कि कुछ मामलों में भी आपकी सेवा भी एक ही समय में मारे जायेगी। अगर स्मृति पर्याप्त है तो हत्या के बाद एंड्रॉइड स्वयं सभी मामलों में आवेदन को पुनरारंभ करने का प्रयास नहीं करता है। अंत में सभी मामलों में ओएस द्वारा मारे जाने के बाद आपके आवेदन को दोबारा शुरू करने के लिए कोई कठोर और तेज़ नियम नहीं है, यह ओएस और आंतरिक व्यवहार पर निर्भर करता है।

+0

हाँ! लेकिन मैंने कुछ आवेदन फिर से शुरू करने के लिए देखा। उदाहरण: [जाओ एसएमएस] (https://play.google.com/store/apps/details?id=com.jb.gosms&hl=hi) मैं जानना चाहता हूं कि कोड या कोड में अभी तक जोड़े जाने की अनुमति है या नहीं दिया हुआ। –

+0

यही वह है जो मैं उपयोग सेवाओं कह रहा हूं .. इन लिंक का संदर्भ लें: http://stackoverflow.com/questions/4339556/how-to-restart-android-plication-from-within- appplication, http://stackoverflow.com/ प्रश्न/3041971/एंड्रॉइड-सेवा-मारे गए, http://stackoverflow.com/questions/7257378/android-how-to-force-restart-service-os-killing-on-low- स्मृति- व्यवहार, http: // stackoverflow.com/questions/9696861/how-can-we-prevent-service-from-killing-by-os-in-android .... बेहतर आप कसरत करने का प्रयास करते हैं, अपने आवेदन को पुनरारंभ करने से बचें क्योंकि आपका एप्लिकेशन बहुत अधिक ले रहा है ओएस द्वारा मारने के लिए पर्याप्त कारण स्मृति है। –

+0

आपके उत्तर और लिंक के लिए धन्यवाद ... क्षमा करें .. मेरी एप्लिकेशन स्मृति की कमी के लिए ओएस द्वारा नहीं मारा गया है। यदि उपयोगकर्ता हर बार मुफ्त मेमोरी के लिए तीसरे पक्ष के आवेदन का उपयोग करता है, तो यह मारे जाते हैं। –

4

आपको START_STICKY आदेश के साथ पृष्ठभूमि सेवा चलाने की ज़रूरत है। बस सेवा प्रदान करता है और इस तरह onCommand ओवरराइड:

@Override 
public int onStartCommand(Intent intent,int flags,int startId) { 
    super.onStartCommand(intent, flags, startId); 

    return START_STICKY; 
} 
इस तरह

अपने सेवा पुनः आरंभ होता है जब वह करीब

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

सादर जिम

+0

यूप कैसे है! बुलाया और अपने स्निपेट का इस्तेमाल किया लेकिन जब मैं मैन्युअल रूप से अपने आवेदन को बंद कर देता हूं और इसे फिर से लागू नहीं किया जाता है। अभी तक –

+0

आपके आवेदन को बंद करने से पहले आपकी सेवा चल रही है?अपनी सेवा की ऑनक्रेट विधि में लॉग इन करें, इस तरह आप देखेंगे कि यह लॉन्च है या नहीं और यदि यह – jaumard

+0

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

3

Bug in Android 2.3 with START_STICKY

मैं अपने सभी बलों के साथ जिंदा एक सेवा रखने के लिए की जरूरत है। यदि सेवा किसी भी समय चल रही है तो आप यूआई पॉप कर सकते हैं।

onDestroy() 

यह फिर से लॉन्च होगा।

ऐप को अनइंस्टॉल नहीं किया जा सकता है, क्योंकि इसमें डिवाइस प्रशासक है।

यह एक तरह का अभिभावकीय नियंत्रण है, उपयोगकर्ता जानता है कि यह वहां है। डिवाइस एडमिन को हटाने और इसे अनइंस्टॉल करने का एकमात्र तरीका है, लेकिन डिवाइस एडमिन को हटाने से फोन को कैस्परस्की के रूप में लॉक कर दिया जाएगा।

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

मुझे आशा है कि आप जानकारी के अच्छे कारण के साथ उपयोग करेंगे!

संपादित करें: पुनः प्रारंभ सेवा कोड का टुकड़ा:

// restart service: 
    Context context = getApplicationContext(); 
    Intent myService = new Intent(context, MyService.class); 
    context.startService(myService); 

EDIT2: यदि सेवा में ... प्रसारण

public static boolean isMyServiceRunning(Context context) { 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (MyService.class.getName().equals(service.service.getClassName())) { 
       Log.d("myTag", "true"); 
       return true; 
      } 
     } 
     Log.d("myTag", "false"); 
     return false; 
    } 

Edit3 अन्य सेवा शुरू की एक लोड चल रहा है की जाँच करने के spippet जोड़ें:

public static void startTheService(Context context) { 
     Intent myService = new Intent(context, MyService.class); 
     context.startService(myService); 
    } 

Android 2 को न भूलें।3 बग:

@Override 
public void onCreate() 

में प्रारंभ करने के लिए तर्क करते हैं और नहीं में:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
+0

धन्यवाद! लेकिन इस [पोस्ट] के अनुसार (http://developer.android.com/reference/android/app/Service.html#ProcessLifecycle) एंड्रॉइड सिस्टम में स्टैक प्रवाह की वजह से इसकी ऑनस्ट्राय() की गारंटी नहीं है। और ऐप को फिर से लॉन्च करने के लिए डीस्ट्रॉय पर नमूना करने की कोशिश की। यह अभी भी वही है। –

+1

onDestroy यह पुन: प्रारंभ करने की कोशिश करने वाले कई लोगों में से 1 है, कोई भी गारंटी नहीं देगा, लेकिन मेरे मामले में आप 2 मिनट से अधिक सेवा –

+0

से अधिक समय तक नहीं मार सकते हैं! और धन्यवाद .. क्या आप डैस्ट्रॉय() पर उपयोग करने के लिए कोड या उदाहरण का स्निपेट प्रदान कर सकते हैं विधि –

2

जबकि गूगल आईओ आधिकारिक उत्पाद स्रोत कोड को देखो मैं पाया है निम्नलिखित

((AlarmManager) context.getSystemService(ALARM_SERVICE)) 
      .set(
        AlarmManager.RTC, 
        System.currentTimeMillis() + jitterMillis, 
        PendingIntent.getBroadcast(
          context, 
          0, 
          new Intent(context, TriggerSyncReceiver.class), 
          PendingIntent.FLAG_CANCEL_CURRENT)); 

URL for code

आप एक चिपचिपा सेवा शुरू कर सकते हैं और एक अलार्म प्रबंधक पंजीकृत कर सकते हैं जो wil मैं बार-बार जांचता हूं कि आपका आवेदन ज़िंदा है यदि नहीं तो यह इसे चलाएगा।

आप एक रिसीवर भी बना सकते हैं और इसे <action android:name="android.intent.action.BOOT_COMPLETED" /> के लिए पंजीकृत कर सकते हैं तो आप अपनी रिसीवर से अपनी सेवा शुरू कर सकते हैं। मुझे लगता है कि ओएस या कुछ सेवा/एप्लिकेशन को मारने पर कुछ प्रसारण संदेश होना चाहिए।

बस आपको मोटा अनुमान देने के लिए मैंने यह किया है और उसके काम करने 1) रजिस्टर रिसीवर रिसीवर कोड:

@Override सार्वजनिक शून्य onReceive (संदर्भ संदर्भ, आशय आशय) {

try { 
     this.mContext = context; 
     startService(intent.getAction()); 

     uploadOnWifiConnected(intent); 

    } catch (Exception ex) { 
     Logger.logException(ex); 
     Console.showToastDelegate(mContext, R.string.msg_service_starup_failure, Toast.LENGTH_LONG); 
    } 
} 

private void startService(final String action) { 
    if (action.equalsIgnoreCase(ACTION_BOOT)) { 

     Util.startServiceSpawnProcessSingelton(mContext, mConnection); 

    } else if (action.equalsIgnoreCase(ACTION_SHUTDOWN)) { 

    } 
} 

सेवा कोड:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Logger.logInfo("Service Started onStartCommand"); 
    return Service.START_STICKY; 
} 

मैं onStartCommand में कुछ नहीं कर पसंद करते हैं क्योंकि यह हर बार जब आप सेवा शुरू करेंगे तो कॉल किया जाएगा लेकिन क्रेट को केवल पहली बार सेवा कहा जाता है, इसलिए मैं क्रिएट में अधिकांश कोड करता हूं, इस तरह मुझे वास्तव में मौसम सेवा की परवाह नहीं है, पहले से ही चल रहा है या नहीं।

+0

intent.getAction() शून्य मूल्य देता है और इसके बजाय ACTION_VIEW का उपयोग करता है लेकिन फिर भी –

+1

+1, शायद यह एक सही कोड नहीं है, लेकिन विचार यह अच्छा है, मैं आपके विचार के लिए धन्यवाद, अलार्म सेवा का उपयोग किया है। जैसा आपने सुझाव दिया है, लेकिन मैं पूरी तरह से मेरी जरूरतों को पूरा करने के लिए गर्म महसूस कर सकता हूं। मुझे मछली की जरूरत नहीं है, सिर्फ मछली पकड़ने के बारे में पता है;) –

1

Google से @RetoMeyer के अनुसार, समाधान ऐप को "चिपचिपा" बनाना है।

इसके लिए, आपको अपने इरादे सेवा प्रबंधन में स्थापित करना होगा START_STICKY।

चेक this reference from developer android

+0

इसे पहले से ही जिम (जौमार्ड) और अल्गो द्वारा परिभाषित किया गया है लेकिन यह काम नहीं करता है –

+0

मेरे पास इस संसाधन का उपयोग करने वाले प्रचलित ऐप्स हैं और वे पूरी तरह से अच्छी तरह से काम करते हैं। रेटो मेयर ने फ्रिगजिन पुस्तक लिखी। सचमुच। :) –