在销毁应用程序时停止服务

时间:2016-11-18 12:57:13

标签: android service location

我现在很困惑,关于跑步和停止的服务理念:

我想做什么:

  • 在申请一开始就启动位置服务。

  • 继续获取位置信息,并存储这些信息

  • onDestroy of Application scope中停止服务!

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

  • 通过将服务绑定到相关的活动/片段/视图来自动停止服务,当所有服务都自动取消绑定服务时,我们可以在unbind中调用

    DECLARE done INT DEFAULT FALSE;
    declare v_degree int(11);
    declare v_start_age smallint(6);
    declare v_end_age smallint(6);
    declare v_gender varchar(20);
    declare v_calctable varchar(200);
    
    SELECT calculationtable into v_calctable FROM wac.degrees where tablename = concat("cdb_" + arg_tablename);
    
    declare cur CURSOR for select degree, start_age, end_age, belt, gender from v_calctable;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    

    方法

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

  • 通过在某种静态范围内声明它的意图并在应用程序类DECLARE done INT DEFAULT FALSE; declare v_degree int(11); declare v_start_age smallint(6); declare v_end_age smallint(6); declare v_gender varchar(20); declare v_calctable varchar(200); SELECT calculationtable into v_calctable FROM wac.degrees where tablename = concat("cdb_" + arg_tablename); declare cur CURSOR for select degree, start_age, end_age, belt, gender from v_calctable; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 上停止服务来手动停止服务[我不确定会发生什么? ,每次活动被销毁时,服务会破坏吗?或者只有在整个申请被销毁时才会被销毁?]

无论哪种方式,我都有点困惑和沮丧,一直试图用给定的细节调整我的stopself 2天

5 个答案:

答案 0 :(得分:3)

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

此处START_NOT_STICKY表示您无需重新启动服务,以防被杀死。

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

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

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

那就是它。你很高兴这么做。

答案 1 :(得分: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;
    }

THRID:

一旦系统杀死你的应用程序,该服务将自动被杀死,所以没有任何问题。

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

  

onTerminate

     

在API级别1中添加void onTerminate()此方法用于   模拟过程环境。它永远不会被称为生产   Android设备,通过简单地删除进程来删除进程;没有   这样做时会执行用户代码(包括此回调)。

更多信息: https://github.com/torvalds/linux/blob/master/drivers/net/wireless/mac80211_hwsim.c

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

答案 2 :(得分:0)

我会尽量以最简单的方式解释:) 有两种类型的服务 IntentService 服务 启动后 IntentService 会在处理onHandleIntent方法的内容后自行终止 至于服务那么,即使您使用活动的上下文启动它,也不会结束这个命令。在极端情况下(通过系统(设置/应用程序/ YourApp /停止应用程序或应用程序崩溃)停止应用程序时,它也会停止

答案 3 :(得分:0)

最简单的方法首先在一些重复时间(10分钟)启动带有AlarmManager的IntentService,然后在onHandleIntent()中获取Location并存储为首选。

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

答案 4 :(得分:-1)

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

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

}