我现在很困惑,关于跑步和停止的服务理念:
我想做什么:
在申请一开始就启动位置服务。
继续获取位置信息,并存储这些信息
在 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天
答案 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();
}