服务的 onDestroy() 回调

Posted

技术标签:

【中文标题】服务的 onDestroy() 回调【英文标题】:onDestroy() callback of Service 【发布时间】:2014-02-06 22:50:23 【问题描述】:

在我的android项目中,我有一个普通的Service

public class MyService extends Service
  @Override
  public int onStartCommand(...)...

  ...

  @Override
  public void onDestroy() 
    super.onDestroy();
    Log.d("MyApp","MyService onDestroy() is called!");
  

在我的BroadcastReceiver 课程中,我停止MyService 并执行另一项任务:

public static class MyReceiver extends BroadcastReceiver 
   @Override
   public void onReceive(Context context, Intent intent) 
       context.stopService(new Intent(context, MyService.class));
       doAnotherTask();
   

根据我的日志,MyService中的onDestroy()是在doAnotherTask()完成后执行的。

如何保证MyServiceonDestory()doAnotherTask() 被调用之前执行?

P.S.:我想我可以做这样的事情:

boolean isStopped = context.stopService(new Intent(context, MyService.class));
if(isStopped)
   doAnotherTask();

但可能没有服务已启动,这意味着stopService(...) 什么都不做。所以,我不能依赖我上面的代码。

【问题讨论】:

如果 onDestroy 已经在销毁它,那么为什么要手动停止它呢?或者如果你必须阻止它,那么为什么在 onDestroy() 里面? @Saqib,恐怕你没有正确理解我的问题。我只调用 stopService() 之后我才执行另一个任务 (),就是这样。系统调用 onDestroy() 我没有,我只是 stopService() 。但我在 onDestroy() 回调中有一些东西。 你尝试过在两个任务之间稍微延迟一下吗? 不,这不是我想要的方式。 尝试在一个方法中停止你的服务,然后调用你的 anotherTask 方法,看看是否有效果! 【参考方案1】:

调用 startActivityForResult() .... 在你得到 onActivityResult,.... 调用你的方法 doAnotherTask() 我认为这样就可以了

【讨论】:

我没有在 Activity 中停止我的服务,我在 BroadcastReceiver 类中。我更新了我的帖子。【参考方案2】:

如何从 onDestroy() 函数向广播接收器发送特殊意图?当你的接收者得到它,然后调用 doAnotherTask()。 (我假设您不能简单地从 onDestroy() 直接调用 doAnotherTask()。)

【讨论】:

这对我来说不是一个理想的解决方案,因为我的广播接收器用于接收系统广播的意图。此外,不可能在现有的广播接收器中注册另一个广播接收器。 但是您可以为多个操作注册接收器,然后在 onReceive() 中检查 intent.getAction() 以确定是进行正常处理还是进行清理任务。如果没有更多关于 doAnotherTask() 作用的信息,我真的无法提供更好的想法。

以上是关于服务的 onDestroy() 回调的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 onDestroy 之后调用回调方法?

如果不能保证调用 onDestroy() ,为啥要实现它?

Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestr

如何在 Android 中服务 onDestroy 后保持对象变量处于活动状态?

Android:进程优先级

android 怎么打印service生命周期