关于android:调用onDestroy()时运行长任务

Run long task when onDestroy() is called

我想从片段中运行onDestroy()的长操作任务。我的目标是呼叫网络呼叫以删除一些数据,以防用户通过从最近的应用程序刷它来关闭应用程序。我希望在调用onDestroy()时启动一个intent。

此刻,每当我尝试启动意图时,我都会在我有机会操作调用之前松开上下文,因为onDestroy()已经杀死了我的应用程序。

我不想使用这个选项:在onDestroy中执行长时间运行的操作,因为运行这样的线程不是正确的方法,而且看起来像是一个危险的黑客。

从活动的onDestroy()调用操作导致相同的错误。

当然,我不希望在ui线程上做任何工作并"推迟"onDestroy()直到我的操作完成。

只是为了清除,当getContext()不为null时,到达SomeService类时,上下文已经为空,因为发送intent是异步操作。

1
2
3
4
5
6
@Override
    public void onDestroy() {
         Intent intent = new Intent(getContext(), SomeService.class);
         getContext().startService(intent);
         super.onDestroy();
    }


我建议在ActivityonCreate()期间启动并绑定服务,然后使用绑定服务,您可以轻松启动放置在Service中的清理实用程序,即您应该将服务启动和清除开始分开。

喜欢:

1
2
3
4
//somewhere in onCreate()
myServiceIntent = new Intent(this.getApplicationContext(), MyService.class);
context.startService(myServiceIntent);
context.bindService(myServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

然后在onDestroy()

1
2
3
4
public void onDestroy() {
     myService.cleanup();
     super.onDestroy();
}

阅读有关服务绑定的更多信


请注意,不保证会调用onDestroy()。

使用应用上下文。

只要任何组件绑定到绑定服务,绑定服务就会生效,因此启动服务的变体更好,只是在作业完成后不要忘记使用stopSelf()。