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);
系统会唤醒您的服务,然后您就可以立即执行任务了。
使用 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);
系统会唤醒您的服务,然后您就可以立即执行任务了。