【问题标题】:How to stop intent service after closing app关闭应用程序后如何停止意图服务
【发布时间】:2015-03-31 06:55:50
【问题描述】:

我在我的应用程序中添加了 Google Now 搜索。它的工作方式是,用户在 EditText 对象中输入一些内容,一旦按下按钮,这个意图就会运行 -

                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                String term = searchInput.getText().toString();
                intent.putExtra(SearchManager.QUERY, term);
                startActivity(intent);

但是,在启动意图后,我在终止服务时遇到了问题。 除非我将意图指向不同的类本身,否则在意图之后调用 finish(); 将不起作用。

这是我的意思的视频预览,您可以清楚地看到我正在按主页关闭应用程序,但是当我重新打开它时。它打开到 Google Now 应用程序。但是当按回时,它会停止。按下 home 键后,我究竟如何才能获得停止的意图?

而且我的应用程序是对话类型的应用程序,因此由于种种原因,我已将其从最近的菜单中排除。一旦用户退出应用程序,应用程序就会在其他任何地方自行终止,但在这里服务会继续运行。

视频 - Video Preview

我也尝试了很多问题的答案,进行了研究,但到目前为止没有任何帮助。我可能做错了什么。有人可以在这里帮助我吗,非常感谢! :)

【问题讨论】:

    标签: java android eclipse android-intent service


    【解决方案1】:

    已启动的服务必须管理自己的生命周期。也就是说,系统不会停止或销毁服务,除非它必须恢复系统内存并且服务在onStartCommand() 返回后继续运行。因此,服务必须通过调用stopSelf() 自行停止,或者其他组件可以通过调用stopService() 来停止它。

    【讨论】:

      【解决方案2】:

      在分配给服务的任务完成后使用 stopSelf()。 而如果你想在应用程序结束的时候结束服务,那么在onDestroy()中,检查它是否运行后调用stopService(),可以使用这样的方法:

      public static boolean isMyServiceRunning(Class<?> serviceClass, Activity pActivity) {
      ActivityManager manager = (ActivityManager) pActivity.getSystemService(Context.ACTIVITY_SERVICE);
      for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
      if (serviceClass.getName().equals(service.service.getClassName())) {
      return true;
      }
      }
      return false;
      }
      

      【讨论】:

        【解决方案3】:

        使用以下代码停止服务活动:

        stopService(new Intent(yourMainActivity.this,yourIntentService.class));
        

        或者您可以在服务中编写条件以停止自身,如下所示:

        if(check your condition here)
           stopSelf();
        

        【讨论】:

          【解决方案4】:

          您不必停止 IntentService - 当它没有更多工作要做时,它会自行终止。

          • 它在单独的工作线程上运行。
          • 多个意图在同一个工作线程上排队。

          因此,即使您的 Activity 从启动此服务的位置被销毁,它也会继续执行其任务,直到所有排队的任务完成,完成后它会自动终止。

          注意:您的应用程序在完成工作后停止其服务非常重要,以避免浪费系统资源和消耗电池电量。如有必要,其他组件可以通过调用 stopService() 来停止服务。即使您为服务启用绑定,如果服务收到 onStartCommand() 调用,您也必须始终自行停止服务。

          stopService() :请求停止给定的应用程序服务。如果服务未运行,则不会发生任何事情。否则将停止。请注意,对 startService() 的调用不计算在内 - 无论服务启动多少次,这都会停止服务。

          注意:如果停止的服务仍然有绑定了 BIND_AUTO_CREATE 设置的 ServiceConnection 对象,那么在所有这些绑定都被删除之前,它不会被销毁。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-02
            • 1970-01-01
            • 1970-01-01
            • 2013-05-15
            • 1970-01-01
            相关资源
            最近更新 更多