AlarmManager vs wake up

6.5k views Asked by At

This is my code:

Activity:

@Override
public void onCreate(Bundle savedInstanceState) {

...

Intent intent = new Intent(this, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    this.getApplicationContext(), 234324243, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
    + (5 * 1000), pendingIntent);

...
} 

BroadcastReceiver:

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, StartNotificationService.class);

    context.startService(service);
}

Service:

public class StartNotificationService extends Service {

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);

    this.intent = intent;
    showNotification();
}

private void showNotification() {
    Date date = new Date(pror.getFirstMillis());

    Log.i("date", date.toString());

    Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            createNotification(contentTitle, contentText, tickerText);

            pror.calculateVak();
            pror.setFirstMillis(pror.getNextVak());

            createStatusBarNotification(contentTitle, contentText, tickerText);
        }
    };
    timer.schedule(timerTask, date);
}

}

AndroidManifest

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
     android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <activity android:name=".ShowSettingsActivity" />

    <receiver android:name=".MyReceiver"/> 
    <service android:name=".service.StartNotificationService"/>

    <activity android:name=".PreferencesActivity" android:label="@string/app_name">
   </activity>
    <activity
        android:label="@string/app_name"
        android:name=".VakActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

When phone go to sleep, alarmManager can't start notification/service.

If I leave my phone in the 'active' - unlock state, a notification is triggered at a certain time.

Where I made mistake?

1

There are 1 answers

6
Reed On BEST ANSWER

There are two ways to approach it.

  1. If all you're doing is creating a status bar notification, then just do that in your BroadcastReceiver
  2. If you need your service to run prior to making the notification, and you need this to be able to happen while device is asleep, you need to acquire a WAKE_LOCK

So for approach 2 in your class body for the service you need:

PowerManager pm;
PowerManager.WakeLock wl;

Then in your onCreate you need:

pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();

And then in your onDestroy you need to put:

wl.release();

All this info I got from PowerManager