2013-11-27 2 views
3

문제
내 활동에서 제 서비스가 누출되었습니다. 그러나 이것은 첫 번째 화면 방향 변경 이후에만 발생합니다. 화면 방향의 두 번째 및 이후 변경 사항에서 서비스가 누출되지 않습니다. 에서 서비스를 바인딩 해제 할 수 없습니다. 서비스를 포 그라운드에서 실행해야하기 때문입니다 (서비스 바인딩을 해제하면 포 그라운드가 중지됨). 또한 순환 게재 후에도 서비스가 계속 작동합니다 (서비스 방법을 계속 호출 할 수 있음).onRetainCustomNonConfigurationInstance를 통한 서비스 유출

환경
내가 midSdkVersion=8targetSdkVersion=18을 위해 개발하고 있는데이 SupportActionBar을 사용하고 있습니다.

질문
누설하는 서비스를 방지 할 수있는 방법이 있습니까? 나는 아직 도움이되는 것을 찾지 못했습니다. 내가 놓친 게 있니?

지원 라이브러리에서 ActionBarActivity를 확장 MainActivity의
관련 부품 번호 : 당신이 볼 당신이 FragmentActivity source codeonRetainCustomNonConfigurationInstance에서 살펴 경우

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; 
} 

로그 캣

11-27 15:42:31.992: E/ActivityThread(25111): Activity de.malaka.player.MainActivity has leaked ServiceConnection [email protected] 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 [email protected] 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) 

답변

2

그 전화는 Activity#onRetainNonConfigurationInstance이고 그 방법은 dep입니다. onStop에 어쨌든 onStart에 결합하고 있기 때문에 당신이 아주 잘 메소드를 제거 할 수 있습니다 귀하의 경우에는 레벨 13부터 recated ... 당신 MUST 때어 :

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

Service foreground documentation에 따르면, 직접적인 없다 포 그라운드에서 서비스를 실행하는 것과 제한된 서비스로 연결하는 것 사이의 연결.

+0

답변 해 주셔서 감사합니다. 나는 지금 그것을 발견 할 수 없다. (...) 그러나 나는 전경과 경계 사이의 연결이 있다고 생각한다. 이를 확인하기 위해 몇 초 후에 서비스를 바인딩 해제하는 코드를 추가했습니다. 결과 : 포어 그라운드가 즉시 중지되었습니다. 그래서 결과는 다시 바인딩 된 후 전경을 다시 시작하는 것입니다. 나에게 맞지 않은 것 같은데 ..? – MalaKa

+1

은 내가 중단의 알고 및 사용되지 않는 방법은''onRetainNonConfigurationInstance''하지''onRetainCustomNonConfigurationInstance'' – MalaKa

+0

FragmentActivity에서'onRetainNonConfigurationInstance' – gunar