应用程序关闭或从最近的应用程序中删除后,警报管理器/服务/广播接收器无法正常工作

时间:2016-12-18 15:21:10

标签: android service broadcastreceiver alarmmanager android-alarms

我知道有很多这方面的问题。 我尝试了大部分时间并花了很多时间。 但没有得到任何解决方案

实际上,即使应用程序已从最近的应用程序中删除,我也希望后台进程能够运行到无限时间 我想在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);
上面的

将重新启动广播接收器与新的调度时间,因此链将继续。

但遗憾的是,这也行不通。如果应用程序未从最近的应用程序中删除,它可以正常工作。

即使我在服务和意图服务方面尝试过同样的事情也没有运气。

结论:应用程序从最近的应用程序中删除后,不会调用警报管理器或广播接收器。

但我看到很多应用程序在后台运行,即使应用程序已从最近的应用程序关闭。

1 个答案:

答案 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