对于必须在 onStop() 上完成某项 X 的情况,我有一个解决方法,但如果有配置更改(显然你没有可用的 isChangingConfigurations()),你不希望它完成。
该技术包括在 AsyncTask 上执行此 X 操作并延迟。您在 onStop()/onPause() 中调用 AsyncTask 并在 onRetainCustomNonConfigurationInstance() 中取消该任务。这样,例如,如果用户按下 home 键,X 代码将在后台执行。但是,如果有屏幕旋转,X代码不会被执行,因为任务在执行之前会被取消(这就是延迟的意思)。
例如,我使用它来解决唤醒锁问题:在 onPause() 上释放它们,但如果用户更改屏幕方向则不会。
这是我的代码:
private class ReleaseWakeLockDelayedTask extends AsyncTask<WakeLock, Integer, Integer>{
@Override
protected Integer doInBackground(WakeLock... params) {
try {
// Delay so that onRetainCustomNonConfigurationInstance is in
// time of cancelling the task
Thread.sleep(5000);
} catch (InterruptedException e) {}
if(isCancelled()) return null;
releaseWakeLock(params[0]); // own method that calls the actual release
return null;
}
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
...
if(mReleaseWakeLockTask != null && mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED){
mReleaseWakeLockTask.cancel(true));
}
...
}
@Override
protected void onPause() {
// create and call the task
boolean wRun;
if(mReleaseWakeLockTask != null){
if(mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED) wRun= false;
else wRun= true;
}else wRun = true;
if(wRun){
mReleaseWakeLockTask = new mReleaseWakeLockTask ();
mReleaseWakeLockTask .execute(wakeLock);
}
}
希望能帮助到你!