销毁应用程序时停止服务
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】:我会尽量用最简单的方式解释:)
有两种服务
IntentService 和 Service
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 不会停止