销毁应用程序时停止服务

Posted

技术标签:

【中文标题】销毁应用程序时停止服务【英文标题】: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的概念 【参考方案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();  

【讨论】:

以上是关于销毁应用程序时停止服务的主要内容,如果未能解决你的问题,请参考以下文章

当后退按钮按下销毁应用程序时,Flutter Android Platform EventChannel 不会停止

Android销毁活动,杀死进程

android:当Activity和Service 都被销毁后,如何控制其中生成的线程?

IIS 应用程序池 - 停止/启动与回收

以编程方式停止粘性服务

有没有办法在销毁链表时取消引用 nullptr 时停止接收异常错误?