एंड्रॉइड द्वारा फोरग्राउंड सेवा को मारा जा रहा है


85

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

मुझे इस प्रश्न में उतना ही मुद्दा मिल रहा है : वेक लॉक को पकड़ते समय सेवा मारा जा रहा है और डिवाइस (आसुस ट्रांसफॉर्मर) सहित स्टार्टफोरग्राउंड को कॉल करने के बाद , सेवा बंद होने से पहले की अवधि (30-45 मिनट), उपयोग बंद हो गया है वेक लॉक, स्टार्टफोरग्राउंड () का उपयोग, और यह तथ्य कि स्क्रीन के बंद होने पर ऐप ओपन होने पर समस्या उत्पन्न नहीं होती है।

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

लिंक किए गए प्रश्न के उत्तर के अनुसार, स्टार्टफोरग्राउंड () "एक सेवा के मारे जाने की संभावना को कम करता है, लेकिन इसे रोकता नहीं है"। मैं समझता हूं कि मामला होने के लिए, हालांकि मैंने अन्य ऐप के कई उदाहरण देखे हैं जिनमें यह समस्या नहीं है (टस्कर, उदाहरण के लिए)।

उपयोगकर्ता द्वारा रोके जाने तक सेवा की क्षमता के बिना मेरे ऐप की उपयोगिता बहुत कम हो जाएगी। क्या इससे बचने का कोई तरीका है???

जब भी सेवा बंद की जाती है, मैं इसे अपने लोगो में देखता हूं:

ActivityManager: No longer want com.howettl.textab (pid 32321): hidden #16
WindowManager: WIN DEATH: Window{40e2d968 com.howettl.textab/com.howettl.textab.TexTab paused=false
ActivityManager: Scheduling restart of crashed service com.howettl.textab/.TexTabService in 5000ms

संपादित करें: मुझे यह भी ध्यान देना चाहिए, यह अन्य डिवाइस पर नहीं लगता है जो मैं जुड़ा हुआ हूं: एचटीसी लीजेंड सियानोजेन चल रहा है

संपादित करें: यहाँ का आउटपुट है adb shell dumpsys activity services:

* ServiceRecord{40f632e8 com.howettl.textab/.TexTabService}

intent={cmp=com.howettl.textab/.TexTabService}

packageName=com.howettl.textab

processName=com.howettl.textab

baseDir=/data/app/com.howettl.textab-1.apk

resDir=/data/app/com.howettl.textab-1.apk

dataDir=/data/data/com.howettl.textab

app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}

isForeground=true foregroundId=2 foregroundNoti=Notification(contentView=com.howettl.textab/0x1090087 vibrate=null,sound=null,defaults=0x0,flags=0x6a)

createTime=-25m42s123ms lastActivity=-25m42s27ms

 executingStart=-25m42s27ms restartTime=-25m42s124ms

startRequested=true stopIfKilled=false callStart=true lastStartId=1

Bindings:

* IntentBindRecord{40a02618}:

  intent={cmp=com.howettl.textab/.TexTabService}

  binder=android.os.BinderProxy@40a9ff70

  requested=true received=true hasBound=true doRebind=false

  * Client AppBindRecord{40a3b780 ProcessRecord{40bb0098 2995:com.howettl.textab/10104}}

    Per-process Connections:

      ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}

All Connections:

  ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}

और के उत्पादन adb shell dumpsys activity:

* TaskRecord{40f5c050 #23 A com.howettl.textab}

numActivities=1 rootWasReset=false

affinity=com.howettl.textab

intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.howettl.textab/.TexTab}

realActivity=com.howettl.textab/.TexTab

lastActiveTime=4877757 (inactive for 702s)

* Hist #1: ActivityRecord{40a776c8 com.howettl.textab/.TexTab}

    packageName=com.howettl.textab processName=com.howettl.textab

    launchedFromUid=2000 app=ProcessRecord{40bb0098 2995:com.howettl.textab/10104}

    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.howettl.textab/.TexTab }

    frontOfTask=true task=TaskRecord{40f5c050 #23 A com.howettl.textab}

    taskAffinity=com.howettl.textab

    realActivity=com.howettl.textab/.TexTab

    base=/data/app/com.howettl.textab-1.apk/data/app/com.howettl.textab-1.apk data=/data/data/com.howettl.textab

    labelRes=0x7f060000 icon=0x7f020000 theme=0x0

    stateNotNeeded=false componentSpecified=true isHomeActivity=false

    configuration={ scale=1.0 imsi=0/0 loc=en_CA touch=3 keys=2/1/1 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=6}

    launchFailed=false haveState=true icicle=Bundle[mParcelledData.dataSize=1644]

    state=STOPPED stopped=true delayedResume=false finishing=false

    keysPaused=false inHistory=true visible=false sleeping=true idle=true

    fullscreen=true noDisplay=false immersive=false launchMode=2

    frozenBeforeDestroy=false thumbnailNeeded=false

    connections=[ConnectionRecord{40a76920 com.howettl.textab/.TexTabService:@40b998b8}]

...

Proc #15: adj=prcp /F 40e75070 959:android.process.acore/10006 (provider)

          com.android.providers.contacts/.ContactsProvider2<=Proc{40bb0098 2995:com.howettl.textab/10104}

Proc #16: adj=bak+2/F 40bb0098 2995:com.howettl.textab/10104 (foreground-service)

ये दिखाते हैं कि सेवा अग्रभूमि में चल रही है।


इस जवाब पर एक नजर डालें - आप के लिए हो सकता है काम stackoverflow.com/a/21157035/624109
Muzikant

जवाबों:


218

ओके ठीक है। मैं इस समस्या पर नरक और वापस आया हूँ। यहाँ कैसे आगे बढ़ना है। कीड़े हैं। यह पोस्ट वर्णन करता है कि कार्यान्वयन में बग का विश्लेषण कैसे करें और मुद्दों के आसपास काम करें।

बस संक्षेप में, यहाँ बताया गया है कि कैसे काम करना है। हर 30 मिनट या इसके बाद चलने वाली सेवाओं को नियमित रूप से परिमार्जन और समाप्त किया जाएगा। ऐसी सेवाएँ जो इससे अधिक समय तक जीवित रहना चाहती हैं, उन्हें Service.startForeground को कॉल करना होगा, जो सूचना पट्टी पर एक सूचना देता है, ताकि उपयोगकर्ताओं को पता चले कि आपकी सेवा स्थायी रूप से चल रही है और संभवतः बैटरी जीवन को चूस रही है। केवल 3 सेवा प्रक्रियाएं किसी भी समय खुद को अग्रभूमि सेवाओं के रूप में नामांकित कर सकती हैं। यदि तीन से अधिक अग्रभूमि सेवाएं हैं, तो Android मैला ढोने और समाप्त करने के लिए एक उम्मीदवार के रूप में सबसे पुरानी सेवा को नामांकित करेगा।

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

ध्यान दें कि बहुत कम सेवाओं को अग्रभूमि सेवाओं की आवश्यकता होती है। आम तौर पर, आपको केवल एक अग्रभूमि सेवा होने की आवश्यकता होती है यदि आपके पास किसी तरह का लगातार सक्रिय या लंबे समय तक चलने वाला इंटरनेट कनेक्शन है जिसे उपयोगकर्ताओं द्वारा चालू या बंद किया जा सकता है, या रद्द किया जा सकता है। उन सेवाओं के उदाहरण जिन्हें अग्रभूमि स्थिति की आवश्यकता होती है: UPNP सर्वर, बहुत बड़ी फ़ाइलों के लंबे समय तक चलने वाले डाउनलोड, वाई-फाई द्वारा फाइल सिस्टम को सिंक्रनाइज़ करना और संगीत चलाना।

यदि आप कभी-कभार मतदान कर रहे हैं, या सिस्टम ब्रॉडकास्ट रिसीवर, या सिस्टम ईवेंट पर प्रतीक्षा कर रहे हैं, तो आप टाइमर पर या प्रसारण रिसीवर के जवाब में अपनी सेवा को जागृत करना बेहतर होगा, और फिर अपनी सेवा को एक बार पूरा होने देंगे। यह सेवाओं के लिए डिज़ाइन किया गया व्यवहार है। अगर आपको बस जिंदा रहना है, तो आगे पढ़ें।

अच्छी तरह से ज्ञात आवश्यकताओं (जैसे कॉलिंग Service.startForeground) पर बक्से की जाँच करने के बाद, देखने के लिए अगला स्थान Context.bindService कॉल में आपके द्वारा उपयोग किए जाने वाले झंडे पर है। बाँधने के लिए उपयोग किए जाने वाले झंडे विभिन्न प्रकार के अप्रत्याशित तरीकों से लक्ष्य सेवा प्रक्रिया की प्राथमिकता को प्रभावित करते हैं। विशेष रूप से, कुछ बाध्यकारी झंडों के उपयोग से एंड्रॉइड आपकी अग्रभूमि सेवा को गलत तरीके से नियमित सेवा में बदल सकता है। प्रक्रिया को प्राथमिकता देने के लिए उपयोग किए जाने वाले कोड पर काफी जोर दिया गया है। विशेष रूप से, एपीआई 14+ में संशोधन हैं जो पुराने बाध्यकारी झंडे का उपयोग करते समय बग पैदा कर सकते हैं; और 4.2.1 में निश्चित कीड़े हैं।

इस सब में आपका मित्र sysdump उपयोगिता है, जिसका उपयोग यह पता लगाने के लिए किया जा सकता है कि गतिविधि प्रबंधक ने आपकी सेवा प्रक्रिया को क्या प्राथमिकता दी है, और उन मामलों को स्पॉट किया है जहाँ उसने गलत प्राथमिकता दी है। अपनी सेवा प्राप्त करें और चल रहे हैं, और फिर अपने कंप्यूटर पर कमांड प्रॉम्प्ट से निम्नलिखित आदेश जारी करें:

adb शेल डंप्स गतिविधि गतिविधि> tmp.txt

सामग्री की जांच करने के लिए नोटपैड (वर्डपैड / राइट नहीं) का उपयोग करें।

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

APP UID 10068 ProcessRecord {41937d40 2205: ट्यूनिन.सेवा / u0a10068}

सत्यापित करें कि अग्रभूमि सेवा = निम्न अनुभाग में सत्य है। छिपी और खाली सेटिंग्स के बारे में चिंता न करें; वे प्रक्रिया में गतिविधियों की स्थिति का वर्णन करते हैं, और उनमें सेवाओं के साथ प्रक्रियाओं के लिए विशेष रूप से प्रासंगिक नहीं लगते हैं। यदि अग्रभूमि सेवा सच नहीं है, तो आपको इसे सच करने के लिए Service.startForeground को कॉल करना होगा।

अगली चीज़ जिसे आपको देखने की आवश्यकता है वह है "प्रक्रिया LRU सूची (oom_adj द्वारा क्रमबद्ध):" शीर्षक वाली फ़ाइल के अंत के पास का भाग। इस सूची में प्रविष्टियां आपको यह निर्धारित करने की अनुमति देती हैं कि क्या एंड्रॉइड ने वास्तव में आपके एप्लिकेशन को अग्रभूमि सेवा के रूप में वर्गीकृत किया है। यदि आपकी प्रक्रिया इस सूची में सबसे नीचे है, तो यह सारांश नष्ट करने के लिए एक प्रमुख उम्मीदवार है। यदि आपकी प्रक्रिया सूची में सबसे ऊपर है, तो यह वास्तव में अविनाशी है।

आइए इस तालिका में एक पंक्ति देखें:

  Proc #31: adj=prcp /FS trm= 0 2205:tunein.service/u0a10068 (fg-service)

यह एक अग्रभूमि सेवा का एक उदाहरण है जिसने सब कुछ सही किया है। यहाँ प्रमुख फ़ील्ड "adj =" फ़ील्ड है। यह इंगित करता है कि सब कुछ कहे जाने के बाद एक्टिविटी मैनजर सर्विस द्वारा आपकी प्रक्रिया को प्राथमिकता दी गई थी। आप इसे "adj = prcp" (दृश्यमान अग्रभूमि सेवा) चाहते हैं; या "adj = vis" (किसी गतिविधि के साथ दृश्यमान प्रक्रिया) या "अग्र" (अग्रभूमि गतिविधि वाली प्रक्रिया)। यदि यह "adj = svc" (सेवा प्रक्रिया), या "adj = svcb" (विरासत सेवा)?, या "adj = bak" (खाली पृष्ठभूमि प्रक्रिया) है, तो आपकी प्रक्रिया समाप्ति के लिए एक संभावित उम्मीदवार है, और समाप्त हो जाएगी। स्मृति को पुनः प्राप्त करने के लिए कोई दबाव न होने पर भी हर 30 मिनट पर कम बार नहीं। लाइन पर शेष झंडे ज्यादातर Google इंजीनियरों के लिए नैदानिक ​​डिबग जानकारी हैं। समाप्ति के निर्णय adj क्षेत्रों के आधार पर किए जाते हैं। संक्षेप में, / एफएस एक अग्रभूमि सेवा को इंगित करता है; / एफए एक गतिविधि के साथ अग्रभूमि प्रक्रिया को इंगित करता है। / B एक पृष्ठभूमि सेवा को इंगित करता है। अंत में लेबल सामान्य नियम को इंगित करता है जिसके तहत प्रक्रिया को प्राथमिकता दी गई थी। आमतौर पर यह adj = फ़ील्ड से मेल खाना चाहिए; लेकिन adj = मान को कुछ मामलों में अन्य सेवाओं या गतिविधियों के साथ सक्रिय बाइंडिंग पर बाध्यकारी झंडे के कारण ऊपर या नीचे समायोजित किया जा सकता है।

यदि आपने एक झंडे को बाध्यकारी झंडे के साथ फँसाया है, तो डिप्स लाइन इस तरह दिखाई देगी:

  Proc #31: adj=bak /FS trm= 0 2205:tunein.service/u0a10068 (fg-service)

ध्यान दें कि कैसे adj फ़ील्ड का मान गलत तरीके से "adj = bak" (खाली पृष्ठभूमि प्रक्रिया) पर सेट होता है, जो मोटे तौर पर "कृपया मुझे अब समाप्त कर दें ताकि मैं इस निरर्थक अस्तित्व को समाप्त कर सकूं" प्रक्रिया के उद्देश्यों के लिए। लाइन के अंत में (fg-service) ध्वज को भी नोट करें जो इंगित करता है कि "adj" सेटिंग को निर्धारित करने के लिए "forground सेवा नियमों का उपयोग किया गया था। इस तथ्य के बावजूद कि fg- सेवा नियमों का उपयोग किया गया था, इस प्रक्रिया को एक adj सेटिंग असाइन किया गया था। "बक", और यह लंबे समय तक नहीं रहेगा। धीरे-धीरे डाल दिया, यह एक बग है।

तो लक्ष्य यह सुनिश्चित करना है कि आपकी प्रक्रिया हमेशा "adj = prcp" (या बेहतर) हो। और उस लक्ष्य को प्राप्त करने के लिए विधि बाध्यकारी झंडे को ट्विस्ट करना है जब तक कि आप प्राथमिकता असाइनमेंट में बग से बचने के लिए प्रबंधन नहीं करते हैं।

यहाँ मैं के बारे में पता कीड़े हैं। (1) यदि कोई सेवा या गतिविधि कभी भी Context.BIND_ABOVE_CLIENT का उपयोग करते हुए सेवा के लिए बाध्य होती है, तो आप जोखिम को चलाते हैं कि adj = सेटिंग को "bak" में डाउनग्रेड किया जाएगा, भले ही वह बंधन अधिक सक्रिय न हो। यह विशेष रूप से सच है यदि आपके पास सेवाओं के बीच बाइंडिंग भी है। 4.2.1 स्रोतों में एक स्पष्ट बग। (2) निश्चित रूप से सर्विस-टू-सर्विस बाइंडिंग के लिए BIND_ABOVE_CLIENT का उपयोग न करें। गतिविधि-से-सेवा कनेक्शनों के लिए भी इसका उपयोग न करें। BIND_ABOVE_CLIENT व्यवहार को लागू करने के लिए उपयोग किए जाने वाले ध्वज को प्रति-कनेक्शन आधार के बजाय प्रति-प्रक्रिया के आधार पर सेट किया गया लगता है, इसलिए यह सक्रिय गतिविधि-सेवा नहीं होने पर भी सेवा-से-सेवा बाइंडिंग के साथ बग को ट्रिगर करता है ध्वज सेट के साथ बाध्यकारी। सेवा-से-सेवा बाइंडिंग के साथ प्रक्रिया में कई सेवाएँ होने पर प्राथमिकता स्थापित करने में भी समस्याएँ होने लगती हैं। सर्विस-टू-सर्विस बाइंडिंग पर Context.BIND_WAIVE_PRIORITY (API 14) का उपयोग करने से मदद मिलती है। किसी गतिविधि से किसी सेवा के लिए बाध्य होने पर Context.BIND_IMPORTANT एक अधिक या कम अच्छा विचार है। ऐसा करने से आपकी प्रक्रिया की प्राथमिकता एक पायदान ऊपर बढ़ जाती है जब गतिविधि अग्रभूमि में होती है, जब गतिविधि रुकी हुई या समाप्त होने पर कोई स्पष्ट नुकसान किए बिना।

लेकिन कुल मिलाकर, रणनीति यह है कि आपके bindService झंडे को तब तक समायोजित किया जाए जब तक कि sysdump इंगित नहीं करता कि आपकी प्रक्रिया को सही प्राथमिकता मिली है।

मेरे उद्देश्यों के लिए, Context.BIND_AUTO_CREATE का उपयोग करना गतिविधि से सेवा बाइंडिंग के लिए Context.BIND_IMPORTANT, और Context.BIND_AUTO_CREATE | सेवा-से-सेवा बाइंडिंग के लिए संदर्भ। BIND_WAIVE_PRIORITY सही काम करने लगती है। आपका माइलेज अलग हो सकता है।

मेरा ऐप काफी जटिल है: दो पृष्ठभूमि सेवाएं, जिनमें से प्रत्येक स्वतंत्र रूप से अग्रभूमि सेवा राज्यों को पकड़ सकती है, साथ ही एक तिहाई जो अग्रभूमि सेवा राज्य भी ले सकती है; दो सेवाएं सशर्त रूप से एक-दूसरे को बांधती हैं; तीसरा पहले, हमेशा के लिए बांधता है। इसके अलावा, एक्टिविटीज एक अलग प्रक्रिया में चलती हैं (एनीमेशन को स्मूथ बनाता है)। गतिविधियों और सेवाओं को एक ही प्रक्रिया में चलाने से कोई फर्क नहीं पड़ता है।

स्कैवेंजिंग प्रक्रियाओं के लिए नियमों का कार्यान्वयन, (और sddump फ़ाइलों की सामग्री उत्पन्न करने के लिए उपयोग किया जाने वाला स्रोत कोड) कोर android फ़ाइल में पाया जा सकता है

frameworks\base\services\java\com\android\server\am\ActivityManagerService.java.

उत्साहित करना।

पुनश्च: यहाँ Android 5.0 के लिए sysdump तार की व्याख्या है। मैंने उनके साथ काम नहीं किया है, इसलिए उनमें से जो आप करेंगे। मेरा मानना ​​है कि आप 4 को 'ए' या 'एस' चाहते हैं, और 5 को "आईएफ" या "आईबी", और 1 को जितना संभव हो उतना कम होना चाहिए (शायद 3 से नीचे, क्योंकि केवल 3 तीन अग्रभूमि सेवा प्रक्रियाएं सक्रिय रखी गई हैं डिफ़ॉल्ट कॉन्फ़िगरेशन में)।

Example:
   Proc # : prcp  F/S/IF trm: 0 31719: neirotech.cerebrum.attention:blePrcs/u0a77 (fg-service)

Format:
   Proc # {1}: {2}  {3}/{4}/{5} trm: {6} {7}: {8}/{9} ({10}

1: Order in list: lower is less likely to get trimmed.

2: Not sure.

3:
    B: Process.THREAD_GROUP_BG_NONINTERACTIVE
    F: Process.THREAD_GROUP_DEFAULT

4:
    A: Foreground Activity
    S: Foreground Service
    ' ': Other.

5:
    -1: procState = "N ";
        ActivityManager.PROCESS_STATE_PERSISTENT: procState = "P ";
    ActivityManager.PROCESS_STATE_PERSISTENT_UI:procState = "PU";
    ActivityManager.PROCESS_STATE_TOP: procState = "T ";
    ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: procState = "IF";
    ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: procState = "IB";
    ActivityManager.PROCESS_STATE_BACKUP:procState = "BU";
    ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: procState = "HW";
    ActivityManager.PROCESS_STATE_SERVICE: procState = "S ";
    ActivityManager.PROCESS_STATE_RECEIVER: procState = "R ";
    ActivityManager.PROCESS_STATE_HOME: procState = "HO";
    ActivityManager.PROCESS_STATE_LAST_ACTIVITY: procState = "LA";
    ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: procState = "CA";
    ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: procState = "Ca";
    ActivityManager.PROCESS_STATE_CACHED_EMPTY: procState = "CE";

{6}: trimMemoryLevel

{8} Process ID.
{9} process name
{10} appUid 

4
@ रॉबिन डेविस, मेरा छोटा सा सवाल है। bindService()अगर मुझे लगातार चलने वाली सेवा की आवश्यकता है, तो क्या मुझे वास्तव में कॉल करने की आवश्यकता है? क्या यह केवल startForeground()सेवा में कॉल करने के लिए पर्याप्त नहीं है ? EventBus का उपयोग करने वाले सर्वर के साथ संचार के लिए।
अरग-जी

सेवा को पहले स्थान पर चलाने के लिए आप एक गतिविधि से Context.bindService को कॉल करते हैं। Service.startService पद्धति को सेवा में कोड द्वारा बुलाया जाता है ताकि एक सेवा को "अग्रभूमि" स्थिति में शुरू किया जा सके। मुझे लगता है कि EventBus पुस्तकालय सेवा शुरू करने के लिए कुछ बिंदु पर आपकी ओर से Context.bindService बुला रहा है। यदि सेवा शुरू करने का कोई और तरीका है, तो मैं इससे परिचित नहीं हूँ।
रॉबिन डेविस

3
महान पद! Upvoted। एक टुकड़ा मैं इस टिप्पणी में जोड़ना चाहता था, जो मुझे विश्वास है कि प्रासंगिक है। यदि आप लगातार चलने वाली सेवा चाहते हैं, जैसा कि रॉबिन ने उल्लेख किया है कि आपको इसे किसी तरह शुरू करने की आवश्यकता है। BindService () के बजाय सीधे आपकी गतिविधि के अंदर startService (आशय सेवा) को कॉल करना संभव है, और फिर एक बार आपकी सेवा शुरू होने पर आप startForeground () विधि को कॉल कर सकते हैं। मैं इसे सेवा वर्ग के onStartCommand () में कहता हूं। जहां तक ​​मुझे जानकारी है, यह आपकी सेवा को बाध्य नहीं करना चाहिए, लेकिन इसे लंबित संसाधन समस्याओं को चालू रखना चाहिए। उम्मीद है कि यह किसी की मदद करता है।
डेव

अच्छा कार्य!! मैं इसमें एक अपडेट जोड़ना चाहूंगा। पहले अदब का आउटपुट स्वरूप थोड़ा बदला (जनवरी 2016)। मैंने इस प्रक्रिया को दो उपकरणों एलजी वोल्ट 4.4.2 और नेक्सस 5x 6.0.1 पर परीक्षण किया है। दोनों डिवाइस अभी भी बग से पीड़ित हैं। मैं केवल Context.BIND_ABOVE_CLIENT का उपयोग करके समस्या को पुन: उत्पन्न कर सकता हूं: Proc # 4: cch F / S / SF trm: 0 12354: com.test / u0a78 (fg-service) परेशान झंडे का उपयोग करने के कारण पुराने समय में अधिकांश पुराने समय में अधिकांश समय तत्काल मार देता है। गतिविधि से बाहर निकलने के बाद डिवाइस। अन्य सभी झंडे दोनों Android संस्करणों पर ठीक काम करते हैं।
user3259330

1
@ हे डेव, मैं बिल्कुल उस पद्धति का उपयोग करता हूं, साथ ही साथ START_STICKY भी लौटाता हूं, लेकिन मेरी सेवा हमेशा एक या एक घंटे के बाद मर जाती है जब डिवाइस निष्क्रिय होता है। क्या आपके पास कोई विचार है कि क्या हो सकता है
रुचिर बैरोनिया

7

यदि यह कह रहा है कि "अब नहीं चाहता ..." तो उस प्रक्रिया में एक सेवा सक्रिय नहीं है जो वर्तमान में स्टार्टफोरग्राउंड () स्थिति में है। यह सुनिश्चित करने के लिए जांचें कि आपका कॉल वास्तव में सफल हो रहा है - कि आप पोस्ट की गई अधिसूचना देख रहे हैं, उस बिंदु पर लॉग में कोई संदेश नहीं हैं, आदि के बारे में शिकायत करते हुए, आदि "शेल शेल डिप्सिस एक्टिविटी सर्विसेज" का भी उपयोग करें ताकि आप इसे देख सकें आपकी सेवा की स्थिति और सुनिश्चित करें कि यह वास्तव में अग्रभूमि के रूप में चिह्नित है। इसके अलावा अगर यह सही ढंग से अग्रभूमि है तो "एडीबी शेल डंप्स एक्टिविटी" के आउटपुट में आप उन प्रक्रियाओं के OOM adj दिखाते हुए अनुभाग में देखेंगे कि आपकी प्रक्रिया वर्तमान में उस सेवा के कारण अग्रभूमि स्तर पर है।


मदद के लिए धन्यवाद! मैंने अपने प्रश्न को आपके द्वारा उल्लिखित आदेशों के आउटपुट के साथ संपादित किया है। वे इंगित करने लगते हैं कि सेवा अग्रभूमि में चल रही है।
Howettl

क्या कोड की एक धारा है जो मैं पोस्ट कर सकता हूं जो निदान में मदद कर सकता है?
Howettl

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

1
क्या यह संभव है कि कॉलिंग स्टार्टफोरग्राउंड () को कॉल करने के बजाय नोटिफिकेशन () को कॉल करके चल रहे नोटिफिकेशन को फिर से अपडेट किया जा सके? मेरे पास भी FLAG_ALERT_ONLY_ONCE अधिसूचना पर सक्षम है यदि यह मायने रखता है।
Howettl

2
निश्चित रूप से अधिसूचना प्रबंधक के माध्यम से इसे अपडेट न करें। आप इसे सेवा के माध्यम से पोस्ट कर रहे हैं, और सेवा के माध्यम से इसे अपडेट करना जारी रखना चाहिए।
हैकबॉड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.