Android 正在终止我的服务?

Android is killing my service?

使用 BroadCastReceiver,我在智能手机启动时执行服务:

public class BootReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
    Intent startServiceIntent = new Intent(context, MyService.class);
    context.startService(startServiceIntent);
}
}

我的服务:

private Runnable myRunnable = new Runnable() {
    public void run() {
        parsing.cancel(true);
        parsing = new Parsing();
        parsing.execute();
        handler.postDelayed(this, timeoutUpdate);
    }
};

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handler.removeCallbacks(myRunnable);
    handler.postDelayed(myRunnable, 1000); 
   return Service.START_STICKY;
}

服务确实是在开机时执行的,但是如果我设置两次执行之间的超时时间为1小时,服务就不会执行(可能是系统杀掉了)。否则,如果我在重复之间设置 60 秒,则一切正常。 我该怎么做?谢谢

为您的服务设置最高优先级

<intent-filter 
               android:priority="integer" >
</intent-filter>

该值必须是整数,例如“100”。数字越大优先级越高。默认值为0。该值必须大于-1000且小于1000。

您可以 运行 foreground using startForeground() 中的服务。

A foreground service is a service that's considered to be something the user is actively aware of and thus not a candidate for the system to kill when low on memory.

但请记住,前台服务必须为状态栏提供通知(阅读此处),并且除非服务停止或从前台删除,否则无法取消通知。

注意:这仍然不能绝对保证服务在极低内存情况下不会被杀死。只会让它更不容易被杀死。

如果您不想 运行 前台服务,那么您可以 运行 使用 AlarmManager

定期提供服务
Intent intent = new Intent(context, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_HOUR, pintent);

更新

使用

取消注册的活动
    Intent intent = new Intent(context, MyService.class);
    PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
    AlarmManager alarm =     (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
   alarmManager.cancel(pintent);

要在 BroadcastReciever 中使用 AlarmManager 安排工作。

Intent intent = new Intent(context, MyService.class);
PendingIntent pintent = PendingIntent.getService(context, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm. setRepeating(AlarmManager.RTC_WAKEUP, triggerInMillis, intervalMillis, pintent);

系统会唤醒您的服务,然后您就可以立即执行任务了。