गतिविधि <ऐप का नाम> ने ServiceConnection <ServiceConnection Name> @ 438030a8 लीक किया है जो मूल रूप से यहाँ था


134

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

अपने सूचनात्मक उत्तर के लिए धन्यवाद BDLS संपादित करें । मैंने अपने कोड कोbindService()स्टैंड-अलोन फ़ंक्शन के रूप मेंउपयोग करने केबाद या उसके बादके अंतर पर आपके स्पष्टीकरण के प्रकाश में फिर से लिखा हैstartService(), और मुझे अब केवल बैक बटन का उपयोग करते समय लीक त्रुटि संदेश मिल जाता है।

मेरी कनेक्शन गतिविधि में निम्नलिखित onCreate()और हैं onDestroy():

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /*
     * Initialize the ServiceConnection.  Note that this is the only place startService() is run.
     * It is also the only time bindService is run without dependency on connectStatus.
     */
    conn = new TelnetServiceConnection();
    //start the service which handles telnet
    Intent i = new Intent();
    i.setClassName( "com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService" );
    startService(i);
    //bind to the service
    bindService(i, conn, 0);

    setContentView(R.layout.connect);
    setupConnectUI();

}//end OnCreate()

@Override
protected void onDestroy() {
    super.onDestroy();

    //unbind the service and null it out
    if (conn != null) {
        unbindService(conn);
        conn = null;
        }

    if(connectStatus == 0) {
        //stop the service
        Intent i = new Intent();
        i.setClassName( "com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService" );
        stopService(i);
        Log.d("LightfactoryRemote", "Connect onDestroy() attempted to stop service");
        }

    Log.d("LightfactoryRemote", "Connect onDestroy()");
    }//end onDestroy()

तो गतिविधि शुरू होने पर सेवा शुरू कर दी जाती है, और जब कोई सफल टेलनेट कनेक्शन नहीं बनाया गया था (तो connectStatus == 0) गतिविधि को नष्ट कर दिया जाता है । अन्य गतिविधियाँ केवल तभी सेवा के लिए बाध्य होती हैं जब एक सफल कनेक्शन बनाया गया था ( connectStatus == 1, एक साझा प्राथमिकताओं को सहेजा गया)। यहाँ उनका है onResume()और onDestroy():

@Override
protected void onResume() {
    super.onResume();

    //retrieve the shared preferences file, and grab the connectionStatus out of it.
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_WORLD_WRITEABLE);
    connectStatus = settings.getInt("connectStatus", 0);

    Log.d("LightfactoryRemote", "Focus onResume with " + connectStatus);

    //if a telnet connection is active, start the service and bind to it
    if (connectStatus == 1) {
        conn = new TelnetServiceConnection();
        Intent i = new Intent();
        i.setClassName("com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService");
        bindService(i, conn, 0);
        //TODO write restore texview code
        }//end if
    }//end onResume

@Override
protected void onDestroy() {
    super.onDestroy();
    //unbind the service and null it out.
    if (conn != null) {
        Log.d("LightfactoryRemote", "Focus onDestroy() attempted to unbind service");
        unbindService(conn);
        conn = null;
        }
    Log.d("LightfactoryRemote", "Focus onDestroy()");
    }//end onDestroy()

तो बाध्यकारी ऐसा होता है onResume()कि यह कनेक्शन गतिविधि से परिवर्तित स्थिति onDestroy()को उठाएगा, और यदि आवश्यक हो, तो फ़ंक्शन में यह अनबाउंड है।

अंत संपादित करें

लेकिन मुझे अभी भी मेमोरी लीक एरर मैसेज मिलता है "एक्टिविटी लीक हो गई है ServiceConnection @ 438030a8 जो मूल रूप से यहां बंधी थी" गतिविधियों को स्विच करते समय रुक-रुक कर। मैं क्या गलत कर रहा हूं?

किसी भी सुझाव या संकेत के लिए अग्रिम धन्यवाद !!!

पूर्ण त्रुटि संदेश इस प्रकार है (संशोधित कोड से):

01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onStop()
01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onDestroy() attempted to unbind service
01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onDestroy()
01-02 22:04:26.672: ERROR/ActivityThread(2024): Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@439e51e8 that was originally bound here
01-02 22:04:26.672: ERROR/ActivityThread(2024): android.app.ServiceConnectionLeaked: Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@439e51e8 that was originally bound here
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:927)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:822)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ApplicationContext.bindService(ApplicationContext.java:842)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.content.ContextWrapper.bindService(ContextWrapper.java:319)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onResume(LightfactoryRemote.java:102)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1225)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.Activity.performResume(Activity.java:3559)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2838)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2866)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.os.Looper.loop(Looper.java:123)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.main(ActivityThread.java:4203)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at java.lang.reflect.Method.invoke(Method.java:521)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at dalvik.system.NativeStart.main(Native Method)
01-02 22:04:26.692: WARN/ActivityManager(558): Unbind failed: could not find connection for android.os.BinderProxy@43c509a8


अपने सुझावों के लिए एक बार फिर 2 धन्यवाद संपादित करें । जैसा कि आपने सुझाव दिया औरonUnBind()सेवा मेंएकओवरराइडजोड़ा। onUnBind()वास्तव में केवल तभी ट्रिगर होता है जब सभी क्लाइंट सेवा से डिस्कनेक्ट हो जाते हैं, लेकिन जब मैं होम बटन को हिट करता हूं, तो इसे निष्पादित किया जाता है, फिर त्रुटि संदेश पॉप अप हो जाता है! इससे मुझे कोई मतलब नहीं है, क्योंकि सभी ग्राहक सेवा से अनबाउंड रहे हैं, इसलिए एक सेवा को कैसे नष्ट किया जा सकता है? इसकी जांच - पड़ताल करें:

01-03 19:38:30.837: DEBUG/LightfactoryRemote(1118): Focus onPause()1
01-03 19:38:31.577: WARN/IInputConnectionWrapper(1118): showStatusIcon on inactive InputConnection
01-03 19:38:31.587: DEBUG/LightfactoryRemote(1118): Focus onStop()
01-03 19:38:31.600: DEBUG/LightfactoryRemote(1118): Focus onDestroy() attempted to unbind service
01-03 19:38:31.607: DEBUG/LightfactoryRemote(1118): Focus onDestroy()
01-03 19:38:31.677: DEBUG/LightfactoryRemote(1125): TelnetService onUnBind()
01-03 19:38:31.727: ERROR/ActivityThread(1118): Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@435baeb0 that was originally bound here
01-03 19:38:31.727: ERROR/ActivityThread(1118): android.app.ServiceConnectionLeaked: Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@435baeb0 that was originally bound here
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:886)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:781)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ApplicationContext.bindService(ApplicationContext.java:820)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.content.ContextWrapper.bindService(ContextWrapper.java:307)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onResume(LightfactoryRemote.java:102)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1225)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.Activity.performResume(Activity.java:3530)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2619)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2287)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.os.Looper.loop(Looper.java:123)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.main(ActivityThread.java:3948)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at java.lang.reflect.Method.invokeNative(Native Method)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at java.lang.reflect.Method.invoke(Method.java:521)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at dalvik.system.NativeStart.main(Native Method)
01-03 19:38:31.777: WARN/ActivityManager(564): Unbind failed: could not find connection for android.os.BinderProxy@4370f8a8

मुझे लगा कि यह कुछ ऐसा हो सकता है जैसा आपने कहा, जहां सेवा के लिए बाध्यता पूरी नहीं होती unbindService()है जब इसे कहा जाता है, हालांकि मैंने सेवा पर एक विधि को कॉल करने की कोशिश की क्योंकि मैं प्रत्येक गतिविधि के माध्यम से यह सत्यापित करने के लिए समर्थन करता हूं कि बंधन पूरा हो गया है, और वे सभी चले गए ठीक के माध्यम से।

सामान्य तौर पर, यह व्यवहार संबंधित नहीं लगता है कि मैं प्रत्येक गतिविधि में कितने समय तक रहता हूं। एक बार जब पहली गतिविधि अपने सेवाकाल को लीक कर देती है, हालांकि, वे सभी उसके बाद मैं उनके माध्यम से वापस आ जाते हैं।

एक अन्य बात, अगर मैं देव टूल्स में "तुरंत नष्ट होने वाली गतिविधियों" को चालू करता हूं, तो यह इस त्रुटि को रोकता है।

कोई विचार?


क्या आप LightfactoryRemote.onCreate () कोड जोड़ सकते हैं? (com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onCreate (LightfactoryRemote.java:97))
tbruyelle

जवाबों:


57

आपने अपना कोई भी कोड प्रदान नहीं किया है LightFactoryRemote, इसलिए यह केवल एक अनुमान है, लेकिन ऐसा लगता है कि आप जिस तरह की समस्या का उपयोग कर रहे हैं, वह उसी तरह की समस्या है जैसा कि आप देख रहे bindServiceहैं।

यह सुनिश्चित करने के लिए कि किसी सेवा को चालू रखा गया है, फिर भी जिस गतिविधि को शुरू किया गया है onDestroy, उसकी विधि कहलाती है, आपको पहले उपयोग करना चाहिए startService

StartService स्थिति के लिए Android डॉक्स :

StartService () का उपयोग करके डिफ़ॉल्ट सेवा जीवनकाल ओवरराइड करता है जिसे bindService (Intent, ServiceConnection, int) द्वारा प्रबंधित किया जाता है: इसे सेवा को तब तक चालू रखने की आवश्यकता होती है जब तक कि कोई ग्राहक इससे जुड़ा नहीं होता है, भले ही stopService (Intent) कहा जाता है।

जबकि bindService के लिए :

सेवा को तब तक आवश्यक माना जाएगा जब तक कि कॉलिंग संदर्भ मौजूद है। उदाहरण के लिए, यदि यह संदर्भ एक गतिविधि है जिसे रोका गया है, तो गतिविधि को फिर से शुरू करने तक सेवा को जारी रखने की आवश्यकता नहीं होगी।


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


उदाहरण

इस उदाहरण में सेवा को चालू रखा जाना चाहिए, भले ही कॉलिंग गतिविधि चल रही हो।

ComponentName myService = startService(new Intent(this, myClass.class));
bindService(new Intent(this, myClass.class), myServiceConn, BIND_AUTO_CREATE);

पहली पंक्ति सेवा शुरू करती है, और दूसरी इसे गतिविधि से बांधती है।


मैं START_STICKY का उपयोग करके सेवा शुरू करता हूं और यह बूट आशय से भी शुरू होता है। अगर मैं StartService को कॉल करता हूं तो यह सेवा का एक और उदाहरण बनाता है और मैं नहीं चाहता कि 2 सेवाएं एक ही समय पर चलें। मैं इस मामले में त्रुटि कैसे ठीक कर सकता हूं?
opc0de

16
@ opc0de, नहीं, जब आप startService () को दो बार कॉल करते हैं तो आप दूसरी सेवा नहीं बना रहे हैं। सेवाएँ तार्किक रूप से स्वभाव से एकल हैं। चाहे आप इसे कितनी भी बार शुरू करें, केवल एक ही सेवा चलती है।
महकी

2
संगीत खिलाड़ी के लिए पृष्ठभूमि में सेवा जारी रखने का क्या उपाय है?
आनंद सावजानी


31

आप में onResumeबंधते हैं, लेकिन में unbind onDestroy। आपको onPauseइसके बजाय unbinding करना चाहिए , ताकि हमेशा बाँध / अनबाइंड कॉल्स के जोड़े मिलें। आपकी रुक-रुक कर गलतियाँ जहाँ आपकी गतिविधि रुकी हुई हैं, लेकिन नष्ट नहीं हुई हैं, और फिर से फिर से शुरू हो जाएंगी।


13

आपको केवल सेवा को खोलना होगा onDestroy()। फिर, चेतावनी जाएगी।

देखें यहाँ

जैसा कि गतिविधि डॉक समझाने की कोशिश करता है, आपके द्वारा उपयोग किए जाने वाले तीन मुख्य बाइंड / अनबाइंड समूह हैं: onCreate () और onDestroy (), onStart () और onStop (), और onResume () और onPause ()।


7
जैसा कि आप अनुभव कर सकते हैं onDestroy बहुत ऑपरेटिंग सिस्टम से कभी नहीं कहा जाता है
martyglaubitz

प्रतिबंधित सामग्री के लिए यहां देखें लिंक -> प्रतिबंधित सामग्री चेतावनी। क्या कोई पहुंच सकता है? "ग्रुप टू ग्रुप" बटन बस पृष्ठ को ताज़ा करता है और मेरे लिए वही चेतावनी दिखाता है।
ब्लेज़ गॉलिक

11

आप बहुत जल्दी गतिविधियों के बीच स्विच करने वाले उपयोगकर्ता का उल्लेख करते हैं। क्या ऐसा हो सकता है कि unbindServiceसेवा कनेक्शन स्थापित होने से पहले आप कॉल कर रहे हों ? यह बंधन को लीक करने में विफल रहने, फिर असफल होने का प्रभाव हो सकता है।

पूरी तरह से निश्चित नहीं है कि आप इसे कैसे संभाल सकते हैं ... शायद जब onServiceConnectedकॉल किया जाता है तो आप कॉल कर सकते हैं unbindServiceयदि onDestroyपहले ही कॉल किया गया हो। यकीन नहीं है कि अगर यह काम करेंगे।


यदि आप पहले से ही नहीं हैं, तो आप अपनी सेवा में एक ऑनबाइंड विधि जोड़ सकते हैं। इस तरह से आप देख सकते हैं कि आपकी कक्षाएं इससे कब बचती हैं, और यह डिबगिंग में मदद कर सकता है।

@Override
public boolean onUnbind(Intent intent) {
    Log.d(this.getClass().getName(), "UNBIND");
    return true;
}

2

OnUserLeaveHint () में unbindService () का उपयोग करने का प्रयास करें। यह ServiceConnection लीक परिदृश्य और अन्य अपवादों को रोकता है।
मैंने अपने कोड में इसका इस्तेमाल किया और ठीक काम करता है।


1

आप बस इसे बूलियन के साथ नियंत्रित कर सकते हैं, इसलिए आप केवल अनइंड को कॉल करें यदि बाइंड बनाया गया है

public void doBindService()
{
    if (!mIsBound)
    {
        bindService(new Intent(this, DMusic.class), Scon, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }
}

public void doUnbindService()
{
    if (mIsBound)
    {
        unbindService(Scon);
        mIsBound = false;
    }
}

यदि आप इसे कनेक्ट करना चाहते हैं तो केवल इसे अनबाइंड करना चाहते हैं

public ServiceConnection Scon = new ServiceConnection() {

    public void onServiceConnected(ComponentName name, IBinder binder)
    {
        mServ = ((DMusic.ServiceBinder) binder).getService();
        mIsBound = true;
    }

    public void onServiceDisconnected(ComponentName name)
    {
        mServ = null;
    }
};

0

गतिविधि में बंधी हर सेवा को ऐप के करीब होना चाहिए।

इसलिए प्रयोग करके देखें

 onPause(){
   unbindService(YOUR_SERVICE);
   super.onPause();
 }

0

मैं बहुत हाल ही में एंड्रॉइड सर्विस के बारे में पढ़ रहा हूं और मुझे इस पर गहन गोता लगाने का मौका मिला। मैंने एक सेवा रिसाव का सामना किया है, मेरी स्थिति के लिए ऐसा हुआ क्योंकि मेरे पास एक अनबाउंड सेवा थी जो एक बाध्य सेवा शुरू कर रही थी , लेकिन इसमें मेरी अनबाउंड सेवा एक गतिविधि द्वारा बदल दी गई है ।

इसलिए जब मैं stopSelf () रिसाव का उपयोग करके अपनी अनबाउंड सेवा को रोक रहा था , तो इसका कारण यह था कि मैं बाध्य सेवा को बंद किए बिना मूल सेवा को रोक रहा था । अब बाउंड सेवा चल रही है और यह नहीं पता है कि यह किससे संबंधित है।

आसान और सीधा फॉरवर्ड फिक्स है, आपको अनबाइंड सर्विस (Your_SERVICE) को कॉल करना चाहिए ; अपने मूल गतिविधि / सेवा के अपने onDestroy () फ़ंक्शन में। इस तरह से जीवनचक्र यह सुनिश्चित करेगा कि आपके माता-पिता की गतिविधि / सेवाओं के नीचे जाने से पहले आपकी बंधी हुई सेवाओं को रोक दिया जाए या उन्हें साफ कर दिया जाए।

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

public void onServiceConnected(ComponentName name, IBinder service) {
            bounded = true;
            // code here
        }

यह यहाँ तक ठीक काम करता है, लेकिन समस्या तब आती है जब हम onServiceDisconnected फ़ंक्शन को unbindService फ़ंक्शन कॉल के लिए कॉलबैक के रूप में मानते हैं, यह केवल प्रलेखन द्वारा कॉल किया जाता है जब किसी सेवा को मार दिया जाता है या दुर्घटनाग्रस्त हो जाता है । और आपको एक ही धागे में यह कॉलबैक कभी नहीं मिलेगा । इसलिए, हम कुछ ऐसा कर रहे हैं:

public void onServiceDisconnected(ComponentName name) {
            bounded = false;
        }

जो कोड में प्रमुख बग बनाता है क्योंकि हमारे बाध्य ध्वज को कभी भी गलत पर रीसेट नहीं किया जाता है और जब यह सेवा फिर से जुड़ी होती है तो यह अधिकांश समय होता है true। तो इस परिदृश्य से बचने के boundलिए आपको उस क्षण को गलत पर सेट करना चाहिए जिसे आप कॉल कर रहे हैंunbindService

यह एरिक के ब्लॉग में अधिक विस्तार से कवर किया गया है ।

आशा है कि जो कभी भी यहाँ आया, उसकी जिज्ञासा को संतुष्ट किया।


0

यह त्रुटि तब होती है जब आप किसी बंधी हुई सेवा को बाँधने वाले होते हैं। इसलिए, सोल होना चाहिए: -

  1. सेवा कनेक्शन में नीचे के रूप में सेवा जोड़ें:

    private final ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // your work here.
    
        serviceBound = true;
    
    }
    
    @Override
    public void onServiceDisconnected(ComponentName name) {
    
        serviceBound = false;
    }

    };

  2. unbind सेवा onDestroy

        if (serviceBound) {
            unbindService(serviceConnection);
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.