Search code examples
androidalarmmanagerandroid-broadcastreceiver

Start service periodically with AlarmManager


According to these examples: here and here, I was trying to create Service which starts periodically.

First I created Service:

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.");
     }

}

Next I created Receiver:

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);
    }

}

I added starting method for this in 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);
    }

which is calling of course in onCreate method.

And I didn't forget to change AndroidManifest:

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

And unfortunately the result is that nothing happens in my logs.

So I have two questions.

QUESTION

  • How to solve issue with not starting service?
  • If I add scheduleAlarm method to onCreate it will be calling every time I start my application, what is the best way to start this method only for the first time application is started?

EDIT

According to @Lasse hints, I started debugging, and realized that Log.d is not working, when I changed it to Log.i, information from MonitorService was logged.

But... debugging is not stoping on breaking point in MyReceiver, and changing Log.d to Log.i there didn't help. Of course MonitorService is firing, weird thing.

Also time with 1000 ms results in firing service every minute, maybe it's minimum time, and changing to AlarmManager.INTERVAL now doesn't matter.

EDIT 2

Finally I'm getting logs from both service and receiver. I had tried many times and after that it is working, but I don't know why. But with that another problem has appeared - I'm getting warning when my Service is running

 W/art: Suspending all threads took: 21.787ms

I thought that Service is running background so it doesn't matter how long it is, should I concern about this warning?


Solution

  • Edited

    Regarding the first question : See this from the developer website

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

    So change your 1000 to use of of the constans

    Regarding your other question you could override the application object and start it there. This way it is only called when launching the app.