使用AlarmManager定期启动服务

时间:2016-03-10 19:43:14

标签: android alarmmanager android-broadcastreceiver

根据这些示例:herehere,我试图创建定期启动的服务。

首先我创建了服务

public class MonitorService extends IntentService {

     private static final String TAG = "MonitorService";

     public MonitorService() {
         super(TAG);
     }

     @Override
     protected void onHandleIntent(Intent intent) {
         Log.d("TAG", "Service method was fired.");
     }

}

接下来,我创建了接收器

public class MyReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "MyReceiver on receive");
        Intent i = new Intent(context, MonitorService.class);
        context.startService(i);
    }

}

我在 MainActivity

中添加了此方法
public void scheduleAlarm() {
        Intent intent = new Intent(getApplicationContext(), MyReceiver.class);

        final PendingIntent pIntent = PendingIntent.getBroadcast(this, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);

        long firstMillis = System.currentTimeMillis();
        AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        // 1s is only for testing
        alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 1000, pIntent);
    }

当然是在onCreate方法中调用。

我并没有忘记更改 AndroidManifest

    <receiver
        android:name=".MyReceiver"
        android:process=":remote" >
    </receiver>
    <service
        android:name=".MonitorService"
        android:exported="false" />

不幸的是,结果是我的日志中没有任何反应。

所以我有两个问题。

问题

  • 如何解决未启动服务的问题?
  • 如果我将scheduleAlarm方法添加到onCreate,那么每次启动我的应用程序时都会调用它,仅在第一次启动应用程序时启动此方法的最佳方法是什么?

修改

根据@Lasse的提示,我开始调试,并意识到Log.d无法正常工作,当我将其更改为Log.i时,会记录来自MonitorService的信息。

但是......调试并没有停止在MyReceiver的断点上,并且将Log.d更改为Log.i没有帮助。当然MonitorService正在解雇,这很奇怪。

此外,1000分钟的时间会导致每分钟点火服务,也许是最短时间,现在更改为AlarmManager.INTERVAL并不重要。

编辑2

最后我从服务和接收器获取日志。我曾尝试过很多次,然后才开始工作,但我不知道为什么。 但随之而来的是另一个问题 - 我的服务正在运行时我收到警告

 W/art: Suspending all threads took: 21.787ms

我认为Service正在运行后台,所以无论多长时间都没关系,我应该关注这个警告吗?

1 个答案:

答案 0 :(得分:1)

<强>被修改

关于第一个问题: 请参阅developer website

  setInexactRepeating(), you have to use       one of the AlarmManager interval constants--in this case, AlarmManager.INTERVAL_DAY.

所以改变你的1000使用constans

关于您的其他问题,您可以覆盖应用程序对象并在那里启动它。这样,只有在启动应用程序时才会调用它。