销毁应用程序时停止服务

9
我现在有些困惑,关于服务的运行和停止的概念:
我的需求是:
1. 在应用程序启动时立即启动位置服务。 2. 持续获取位置更新并将其存储到共享首选项中。 3. 在应用程序生命周期的onDestroy中停止服务!
到目前为止,我已经搜索和学习了服务相关的内容(如果我错了,请纠正我):
1. 通过将服务绑定到相关活动/片段/视图来自动停止服务,当所有这些组件被销毁时,服务会自动解除绑定,因此我们可以在unbind方法中调用stopself方法。 2. 在onStartCommand中返回START_NOT_STICKY,告诉操作系统不要重新创建服务,并创建意图本地服务,在完成某些工作后它会自行销毁。 3. 通过在某种静态范围内声明其意图并在Application类的onActivityDestroyed中停止服务来手动停止服务(我不确定会发生什么?也许每次销毁任何活动时服务都会被销毁?还是只有整个应用程序被销毁时才会被销毁?)
无论哪种方式,我都有点困惑和筋疲力尽,已经试图根据给定的细节来调整我的位置服务已经两天了。

应用程序范围没有 onDestroy 的概念。 - IgorGanapolsky
5个回答

4
如果您使用START_NOT_STICKY启动服务,则在从后台关闭整个应用程序(即从主屏幕清除应用程序)时,您的应用程序将终止服务。

这里的START_NOT_STICKY表示如果服务已被杀死,则无需重新创建服务。

如果不是这种情况,则必须手动终止服务。

例如:

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

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

就是这样。您可以使用它了。


3

首先,在您的应用程序启动时启动“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;
    }

第三:

一旦系统终止您的应用程序,服务将自动终止,因此完全没有问题。

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

onTerminate

API级别1中添加 void onTerminate() 此方法用于模拟进程环境。在生产Android设备上永远不会调用它;只需杀死它们即可删除进程;在这样做时不执行任何用户代码(包括此回调)。

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

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


0

我将努力以最简单的方式解释 :) 有两种类型的服务 IntentServiceService IntentService 启动后,一旦处理了 onHandleIntent 方法的内容,就会自行终止 至于 Service,即使您使用活动上下文启动它,它也不会结束,直到您命令它这样做。在极端情况下(由系统(设置/应用程序/YourApp/停止应用程序或应用程序崩溃)),它也将停止。


0
最简单的方法是首先使用AlarmManager在某个重复时间(10分钟)启动IntentService,然后在onHandleIntent()中获取位置并存储到偏好设置中。
无需绑定到您的活动,IntentService在保存到偏好设置后会自动停止。

-4

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

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

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接