【问题标题】:Stop the Service on Destroy of Application销毁应用程序时停止服务
【发布时间】:2017-04-02 08:14:06
【问题描述】:

我现在很困惑,关于运行和停止的服务概念:

我想做什么:

  • 在应用程序一开始就启动定位服务。

  • 不断获取位置更新并将其存储以共享偏好

  • onDestroy of Application范围内停止服务!

到目前为止,我已经搜索和研究了我们只能通过服务做以下事情(如果我错了,请纠正我):

  • 通过绑定到相关的activity/fragments/views来自动停止服务,当所有这些都被销毁时服务会自动解除绑定,这样我们就可以在unbind中调用stopself方法

  • 在 onStartCommand 中返回 START_NOT_STICKY 告诉操作系统不要重新创建它,并创建 Intent 本地服务,完成一些工作后它会自行销毁。

  • 手动停止服务,通过在某种静态范围内声明其意图并在 Application 类的 onActivityDestroyed 上停止服务 [我不确定会发生什么? ,也许每次活动都会被破坏时服务会破坏?还是只有在整个应用程序被销毁时才会被销毁?]

不管怎样,我有点困惑和打败,2 天来一直试图用给定的细节调整我的Location service

【问题讨论】:

  • 应用范围没有onDestroy的概念

标签: android service location


【解决方案1】:

如果您使用START_NOT_STICKY 启动您的服务,那么一旦您的整个应用程序从后台关闭,即您从主屏幕清理您的应用程序,您的应用程序就会终止您的服务。

这里START_NOT_STICKY 声明你不需要重新创建服务,以防它被杀死。

如果不是这种情况,那么您必须自己手动杀死它。

喜欢

Intent lintent = new Intent(context, LocationService.class);
context.stopService(lintent);

您可以在应用程序终止时使用此代码。

就是这样。你很好。

【讨论】:

    【解决方案2】:

    首先,在您的应用启动时启动“LocationService”:

    public class MyApp extends Application {
    
        private static final String TAG = "MyApp";
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "App started up");
            startService(new Intent(this, MyLocationService.class));
        }
    }
    

    第二: 正如你所说,服务最好使用“START_NOT_STICKY”标志运行

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return START_NOT_STICKY;
        }
    

    第三:

    一旦系统杀掉你的应用,Service就会自动被杀掉,所以完全没有问题。

    Application 对象上没有onDestroy() 方法,唯一类似的事件是onTerminated(),它没有在生产设备上启动。

    onTerminate

    在 API 级别 1 中添加了 void onTerminate() 该方法用于 模拟过程环境。它永远不会在生产中被调用 Android 设备,通过简单地杀死它们来删除进程;不 执行此操作时会执行用户代码(包括此回调)。

    更多信息: https://developer.android.com/reference/android/app/Application.html#onTerminate()

    顺便说一句,如果您希望 MyLocationService 将位置更新发送到您的应用程序(当它打开时),您应该考虑使用 Otto 或 EventBus(我推荐您使用最后一个,因为它使用起来很简单)。如果需要,您甚至可以配置 @Suscriber 以接收旧检索位置的更新。

    【讨论】:

      【解决方案3】:

      我会尽量用最简单的方式解释:) 有两种服务 IntentServiceService IntentService 启动时会在处理完 onHandleIntent 方法的内容后自行杀死 至于 Service 好吧,即使您使用活动的上下文启动它,在您向它发出命令之前,它也不会结束。当应用程序在极端情况下停止时(由系统(设置/应用程序/YourApp/停止应用程序或应用程序崩溃)),它也会停止

      【讨论】:

        【解决方案4】:

        最简单的方法是首先在某个重复时间(10 分钟)使用 AlarmManager 启动 IntentService,然后在 onHandleIntent() 中获取位置并存储到偏好中。

        无需绑定到您的活动,IntentService 在保存在首选项后会自动停止。

        【讨论】:

          【解决方案5】:

          是的,您可以在活动的 onDestroy() 中停止服务:

          @Override
          public void onDestroy(){
          Log.v("SERVICE","Service killed");
          service.stop();
          super.onDestroy();  
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-23
            相关资源
            最近更新 更多