문제
내 활동에서 제 서비스가 누출되었습니다. 그러나 이것은 첫 번째 화면 방향 변경 이후에만 발생합니다. 화면 방향의 두 번째 및 이후 변경 사항에서 서비스가 누출되지 않습니다. 에서 서비스를 바인딩 해제 할 수 없습니다. 서비스를 포 그라운드에서 실행해야하기 때문입니다 (서비스 바인딩을 해제하면 포 그라운드가 중지됨). 또한 순환 게재 후에도 서비스가 계속 작동합니다 (서비스 방법을 계속 호출 할 수 있음).onRetainCustomNonConfigurationInstance를 통한 서비스 유출
환경
내가 midSdkVersion=8
및 targetSdkVersion=18
을 위해 개발하고 있는데이 SupportActionBar
을 사용하고 있습니다.
질문
누설하는 서비스를 방지 할 수있는 방법이 있습니까? 나는 아직 도움이되는 것을 찾지 못했습니다. 내가 놓친 게 있니?
지원 라이브러리에서 ActionBarActivity
를 확장 MainActivity의
관련 부품 번호 : 당신이 볼 당신이 FragmentActivity
source code에 onRetainCustomNonConfigurationInstance
에서 살펴 경우
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)
답변 해 주셔서 감사합니다. 나는 지금 그것을 발견 할 수 없다. (...) 그러나 나는 전경과 경계 사이의 연결이 있다고 생각한다. 이를 확인하기 위해 몇 초 후에 서비스를 바인딩 해제하는 코드를 추가했습니다. 결과 : 포어 그라운드가 즉시 중지되었습니다. 그래서 결과는 다시 바인딩 된 후 전경을 다시 시작하는 것입니다. 나에게 맞지 않은 것 같은데 ..? – MalaKa
은 내가 중단의 알고 및 사용되지 않는 방법은''onRetainNonConfigurationInstance''하지''onRetainCustomNonConfigurationInstance'' – MalaKa
FragmentActivity에서'onRetainNonConfigurationInstance' – gunar