Intereting Posts
MediaStore.Audio.Albums.ALBUM_ID अमान्य कॉलम AppPage का उपयोग करने के लिए TimePickerDialog की थीम बदलें Linux एआरएम पर एंड्रॉइड के लिए एआरएम बायनेरिज़ चला रहा है चैट एप्लिकेशन के लिए जीसीएम और ऐप इंजिन आप ईओनिक / कॉर्डोवा के लिए एंड्रॉइड के पुराने वर्शन को कैसे बनाते और तैनात करते हैं एंड्रॉइड 4.3 वर्चुअल डिवाइस सीपीयू / एबीआई – कोई सिस्टम छवि स्थापित नहीं है (ग्रहण) एंड्रॉइड – डेक्स निष्पादित करने में असमर्थ: कई डीएक्स फाइलें परिभाषित करती हैं एंड्रॉइड अधिसूचना दोहन करते समय पिछली गतिविधि कैसे खोलें एंड्रॉइड एक्सपेंडेबल लिस्ट व्यू – ऑनक्लिक लेस्टनर, जिसमें लगातार राज्यों के साथ बच्चे के बटन हैं उपयोगकर्ता इंटरैक्शन एंड्रॉइड के बिना ईमेल भेजना Android कैलेंडर में .vcs फ़ाइल कैसे जोड़ें JSONArray अपवाद: श्रेणी 50 सूचकांक। क्या JsonArray पर कोई सीमा है? एंड्रॉइड के लिए तुल्यकारक कैसे बनाएं यूट्यूब वीडियो की सूची नहीं मिल रही है एंड्रॉइड पर रेट्रोफ़िट में एआरआरई या ऑब्जेक्ट हो सकते हैं पैरामीटर कैसे प्रबंधित करें?

रनटाइम अपवाद एंड्रॉइड हे बूट के साथ

मैं अपने BOOT_COMPLETED रिसीवर के भीतर एक IntentService शुरू करने की कोशिश कर रहा हूं, लेकिन एंड्रॉइड हे (एपीआई 26) में मुझे मिल रहा है:

java.lang.RuntimeException: java.lang.IllegalStateException: Not allowed to start service Intent { act=intent.action.update cmp=packageName.services.OwnService }: app is in background 

(संदेश एक पंक्ति में है, लेकिन इस तरह से यह आसान पठनीय है)

मैं इसे सही तरीके से कैसे कर सकता हूं?

Solutions Collecting From Web of "रनटाइम अपवाद एंड्रॉइड हे बूट के साथ"

यहां कुछ विकल्प दिए गए हैं जो मैंने ब्लॉग पोस्ट में दिए हैं:

वैकल्पिक हल # 1: startForegroundService ()

आपका BroadcastReceiver रिसीवर जो ACTION_BOOT_COMPLETED प्रसारण प्राप्त करता है, ACTION_BOOT_COMPLETED startForegroundService() बजाय startService() बजाय एंड्रॉइड 8.0+ पर startForegroundService() हो सकता है:

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; public class OnBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent i=new Intent(context, TestIntentService.class); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { context.startForegroundService(i); } else { context.startService(i); } } } 

ध्यान दें कि यह एक हद तक काम करता है, भले ही आपकी सेवा वास्तव में कभी भी शुरू नहीं startForeground() आपको शुरू करने के लिए चारों ओर घूमने के लिए समय की एक खिड़की दी जाती है startForeground() , "ऐसा करने के लिए ANR अंतराल के बराबर"। यदि आपका काम एक मिलीसेकेंड से अधिक लंबा है लेकिन कुछ सेकंड से कम है, तो आप Notification और startForeground() कॉल को छोड़ सकते हैं हालांकि, आपको लॉगकैट में एक त्रुटि मिलेगी:

 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.commonsware.myapplication, PID: 5991 android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1775) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

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

वैकल्पिक हल # 2: goAsync ()

BroadcastReceiver goAsync() ने एपीआई स्तर 11 के बाद goAsync() की पेशकश की है। यह आपके रिसीवर को मुख्य एप्लिकेशन थ्रेड से काम करने की अनुमति देता है, ताकि आप पूरी तरह से IntentService से छुटकारा पा IntentService और अपना कोड BroadcastReceiver रिसीवर में ले जा सकें। आपके पास अभी भी काम करने के लिए एएनआर टाइमआउट अवधि है, लेकिन आप अपने मुख्य अनुप्रयोग थ्रेड को बांधने नहीं देंगे। यह पहला कामकाजी से बेहतर है, जैसा कि इसमें एक ही समय सीमा होती है, लेकिन गंदा त्रुटि से बचा जाता है हालांकि, इसमें कुछ मात्रा में सुधार की आवश्यकता होती है

वर्कअराउंड # 3: जॉब शेड्यूलर

यदि आपका कार्य कुछ सेकेंड से अधिक समय लगेगा और आप Notification से बचने के लिए चाहते हैं, तो आप JobService को कार्यान्वित करने के लिए अपने कोड को संशोधित कर सकते हैं और JobService साथ काम कर सकते हैं। इसमें अन्य मानदंडों को पूरा करते समय केवल आपको नियंत्रण देने का अतिरिक्त लाभ होता है (जैसे, एक उपयोगी इंटरनेट कनेक्शन है)। हालांकि, यह केवल एक पुनर्लेखन की आवश्यकता नहीं है, लेकिन JobScheduler केवल एंड्रॉइड 5.0+ पर उपलब्ध है, इसलिए यदि आपका minSdkVersion 21 से कम है, तो आपको पुराने डिवाइसों पर कुछ अन्य समाधान की आवश्यकता होगी।

अद्यतनः यूजीन पीचानेक ने जॉबइंंटेंट सेवा को बताया , जो कि एक दिलचस्प JobService / IntentService मैशप है।

आप एंड्रॉइड के निम्नलिखित खंड की जांच कर सकते हैं। व्यवहार व्यवहार दस्तावेज https://developer.android.com/preview/features/background.html#services

यह अब सीमित है जब ऐप पृष्ठभूमि सेवाओं को शुरू करने में सक्षम है