From 151a2bd51098261a29f432488cbbbc338a2b8b97 Mon Sep 17 00:00:00 2001 From: Snek Date: Sat, 25 Mar 2017 01:10:50 +0300 Subject: [PATCH] Alarm: handle wakelock properly --- .../java/com/example/yink/amadeus/Alarm.java | 33 ++++++++++++++++--- .../example/yink/amadeus/AlarmReceiver.java | 8 ++--- .../example/yink/amadeus/AlarmService.java | 1 - 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/example/yink/amadeus/Alarm.java b/app/src/main/java/com/example/yink/amadeus/Alarm.java index 720b210..8c3d36e 100644 --- a/app/src/main/java/com/example/yink/amadeus/Alarm.java +++ b/app/src/main/java/com/example/yink/amadeus/Alarm.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.media.MediaPlayer; +import android.os.PowerManager; import android.os.Vibrator; import android.preference.PreferenceManager; import android.util.Log; @@ -22,9 +23,12 @@ class Alarm { private static final String TAG = "Alarm"; private static boolean isPlaying = false; + private static PowerManager.WakeLock sCpuWakeLock; static void start(Context context, int ringtone) { + acquireCpuWakeLock(context); + settings = PreferenceManager.getDefaultSharedPreferences(context); if (settings.getBoolean("vibrate", false)) { @@ -61,11 +65,11 @@ static void cancel(Context context) { m.release(); notificationManager.cancel(ALARM_NOTIFICATION_ID); alarmManager.cancel(pendingIntent); + releaseCpuLock(); isPlaying = false; - } - - if (v != null) { - v.cancel(); + if (v != null) { + v.cancel(); + } } Log.d(TAG, "Cancel"); @@ -76,4 +80,25 @@ static boolean isPlaying() { return isPlaying; } + private static void acquireCpuWakeLock(Context context) { + if (sCpuWakeLock != null) { + return; + } + + PowerManager pm = + (PowerManager) context.getSystemService(Context.POWER_SERVICE); + sCpuWakeLock = pm.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK | + PowerManager.ACQUIRE_CAUSES_WAKEUP | + PowerManager.ON_AFTER_RELEASE, TAG); + sCpuWakeLock.acquire(); + } + + private static void releaseCpuLock() { + if (sCpuWakeLock != null) { + sCpuWakeLock.release(); + sCpuWakeLock = null; + } + } + } diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java b/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java index b35793b..494c3f9 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmReceiver.java @@ -1,6 +1,7 @@ package com.example.yink.amadeus; import android.app.Activity; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -9,7 +10,7 @@ import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; -public class AlarmReceiver extends WakefulBroadcastReceiver { +public class AlarmReceiver extends BroadcastReceiver { private final String TAG = "AlarmReceiver"; @@ -32,9 +33,8 @@ public void onReceive(Context context, Intent intent) { Alarm.start(context, ringtones[index]); - ComponentName comp = new ComponentName(context.getPackageName(), - AlarmService.class.getName()); - startWakefulService(context, (intent.setComponent(comp))); + Intent service = new Intent(context, AlarmService.class); + context.startService(service); setResultCode(Activity.RESULT_OK); } diff --git a/app/src/main/java/com/example/yink/amadeus/AlarmService.java b/app/src/main/java/com/example/yink/amadeus/AlarmService.java index 94bf99c..ca5ef4d 100644 --- a/app/src/main/java/com/example/yink/amadeus/AlarmService.java +++ b/app/src/main/java/com/example/yink/amadeus/AlarmService.java @@ -19,7 +19,6 @@ protected void onHandleIntent(Intent intent) { Intent launch = new Intent(this, LaunchActivity.class); launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(launch); - AlarmReceiver.completeWakefulIntent(intent); } private void sendNotification(String msg) {