我知道有很多这方面的问题。 我尝试了大部分时间并花了很多时间。 但没有得到任何解决方案
实际上,即使应用程序已从最近的应用程序中删除,我也希望后台进程能够运行到无限时间 我想在15分钟后重复拍摄用户的GPS位置
所以首先我尝试了以下
尝试1 ****** 我创建了广播接收器,他将致电我的服务 该广播接收器的名称是LocationServiceRestarter 我正在启动警报转发器,它将定期以5秒的间隔调用LocationServiceRestarter
Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am =
(AlarmManager)getSystemService(Activity.ALARM_SERVICE);
alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,SystemClock.elapsedRealtime()+5*1000,5*1000,pendingIntent);
如果我不从最近的应用程序中删除应用程序,它可以正常工作 我已经在广播接收器中添加了一个日志,他在我的文件夹中写了关于广播接收器是否被呼叫的日志。 在这种情况下,广播接收器本身不会从报警管理器调用,那么它显然不会调用我想要被呼叫的服务来记录位置。
尝试2 ****** 我也尝试过可以无限运行的服务。但它也会在应用关闭后停止工作
尝试3 ****** 这次我不会打电话给重复的警报管理器,而不是我按照
执行的操作Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am =
(AlarmManager)getSystemService(Activity.ALARM_SERVICE);
//--
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 5000, pendingIntent);
以上将呼叫广播接收器,在广播接收器中我添加了如下警报管理器
LocationServiceM.appendLog("Got Reciever******");
intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
12345, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am =
(AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 5000, pendingIntent);
上面的将重新启动广播接收器与新的调度时间,因此链将继续。
但遗憾的是,这也行不通。如果应用程序未从最近的应用程序中删除,它可以正常工作。即使我在服务和意图服务方面尝试过同样的事情也没有运气。
结论:应用程序从最近的应用程序中删除后,不会调用警报管理器或广播接收器。
但我看到很多应用程序在后台运行,即使应用程序已从最近的应用程序关闭。
答案 0 :(得分:0)
你可以使用START_STICKY告诉操作系统在有足够内存后重新创建服务,并再次使用null意图调用onStartCommand()。 START_NOT_STICKY告诉操作系统不要再次重新创建服务。
您可以在应用关闭或从任务中终止时使用服务触发:
public class SensorService extends Service {
public int counter=0;
public SensorService(Context applicationContext) {
super();
Log.i("HERE", "here I am!");
}
public SensorService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
startTimer();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("EXIT", "ondestroy!");
Intent broadcastIntent = new Intent("uk.ac.shef.oak.ActivityRecognition.RestartSensor");
sendBroadcast(broadcastIntent);
stoptimertask();
}
private Timer timer;
private TimerTask timerTask;
long oldTime=0;
public void startTimer() {
//set a new Timer
timer = new Timer();
//initialize the TimerTask's job
initializeTimerTask();
//schedule the timer, to wake up every 1 second
timer.schedule(timerTask, 1000, 1000); //
}
/**
* it sets the timer to print the counter every x seconds
*/
public void initializeTimerTask() {
timerTask = new TimerTask() {
public void run() {
Log.i("in timer", "in timer ++++ "+ (counter++));
}
};
}
/**
* not needed
*/
public void stoptimertask() {
//stop the timer, if it's not already null
if (timer != null) {
timer.cancel();
timer = null;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
你还需要一个BroadcastReceiver,它会在有人或某事件杀死服务时收到信号;它的作用是重启服务。
public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!");
context.startService(new Intent(context, SensorService.class));;
}
}
有关完整实施,请参阅此链接 http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android