postDelayed()在服务中

时间:2015-04-29 10:38:29

标签: android android-service android-handler

我试图在几次内重启服务。我的代码看起来像这样(在onStartCommand(...)内)

Looper.prepare();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(BackgroundService.this, BackgroundService.class);
                startService(intent);
            }
        }, 3 * 60000);

此代码执行时,服务正在前台运行,但它似乎没有调用onStartCommand(...)。 有没有其他方法可以在几次内重启服务?

UPD:我发现它实际上重新开始服务,但不是在给定时间内(可能需要长达30分钟而不是3分钟)。所以现在的问题是如何让它重新启动

3 个答案:

答案 0 :(得分:3)

处理程序安排的操作无法一致运行,因为此时设备可能正在休眠。在后台安排任何延迟操作的最佳方法是使用系统AlarmManager

在这种情况下,代码必须替换为以下内容:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(BackgroundService.this, BackgroundService.class);

PendingIntent pendingIntent = PendingIntent.getService(BackgroundService.this, 1, alarmIntent, 0);

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3 * 60, pendingIntent);

答案 1 :(得分:3)

我会在服务级别声明Handler变量,而不是onStartCommand中的本地声明,如:

public class NLService extends NotificationListenerService {
    Handler handler = new Handler(); 

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handler.postDelayed(new Runnable() {....} , 60000);
    }

该服务有自己的循环,因此您不需要Looper.prepare();

答案 2 :(得分:2)

替换

Handler handler = new Handler();

使用

Handler handler = new Handler(Looper.getMainLooper());

为我工作。