簡體   English   中英

使用onRetainCustomNonConfigurationInstance進行服務泄漏

[英]Service Leaking with onRetainCustomNonConfigurationInstance

問題
在我的Activity中,我的綁定服務泄漏。 但這只發生在第一次屏幕方向改變之后。 在屏幕方向的第二次(和以下)更改中,服務不會泄漏。 我無法在onPause取消綁定服務,因為服務需要在前台運行(如果取消綁定服務,前台停止)。 此外,在輪換后,服務仍然有效(我仍然可以調用服務的方法)。

環境
我正在為midSdkVersion=8targetSdkVersion=18我正在使用SupportActionBar


有沒有辦法阻止服務泄漏? 我找不到任何有用的東西了。 我錯過了什么嗎?


從支持庫擴展ActionBarActivity的MainActivity的相關部分:

AbstractPlayerService mService;
private boolean mBound;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.drawer_layout);

    // Abstract Class that extends Service
    AbstractPlayerService service = (AbstractPlayerService) getLastCustomNonConfigurationInstance();

    if(service != null) { 
        this.mService = service;
        mBound = true;
    }else{
        // init..
    }


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

    if(!mBound){
        // following line is line 170
        bindService(new Intent(getApplicationContext(), PlayerService.class), mConnection, Context.BIND_AUTO_CREATE);
    }
}


public ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
        mService = null;
    }
};


@Override
public Object onRetainCustomNonConfigurationInstance () {
    return mService;
}

logcat的

11-27 15:42:31.992: E/ActivityThread(25111): Activity de.malaka.player.MainActivity has leaked ServiceConnection de.malaka.player.MainActivity$1@4053fc20 that was originally bound here
11-27 15:42:31.992: E/ActivityThread(25111): android.app.ServiceConnectionLeaked: Activity de.malaka.player.MainActivity has leaked ServiceConnection de.malaka.player.MainActivity$1@4053fc20 that was originally bound here
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:938)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:833)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ContextImpl.bindService(ContextImpl.java:932)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.content.ContextWrapper.bindService(ContextWrapper.java:347)
11-27 15:42:31.992: E/ActivityThread(25111):    at de.malaka.player.MainActivity.onStart(MainActivity.java:170)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.Activity.performStart(Activity.java:3817)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1624)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.os.Looper.loop(Looper.java:130)
11-27 15:42:31.992: E/ActivityThread(25111):    at android.app.ActivityThread.main(ActivityThread.java:3691)
11-27 15:42:31.992: E/ActivityThread(25111):    at java.lang.reflect.Method.invokeNative(Native Method)
11-27 15:42:31.992: E/ActivityThread(25111):    at java.lang.reflect.Method.invoke(Method.java:507)
11-27 15:42:31.992: E/ActivityThread(25111):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-27 15:42:31.992: E/ActivityThread(25111):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
11-27 15:42:31.992: E/ActivityThread(25111):    at dalvik.system.NativeStart.main(Native Method)

如果您查看FragmentActivity源代碼中的onRetainCustomNonConfigurationInstance ,您將看到調用Activity#onRetainNonConfigurationInstance並且該方法從13級開始不推薦使用。在您的情況下,您可以很好地刪除該方法,因為您無論如何都在onStart綁定。你必須onStop取消綁定:

@Override
protected void onStop() {
    super.onStop();
    unbindService(mConnection);
}

根據服務前台文檔 ,在前台運行服務與將其作為有界或無限制之間沒有直接連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM