设备锁定一段时间后警报管理器不工作
Alarm manager not working when device is locked for a while
背景
我的应用向用户发送事件通知。通知由版主发送。但是,应用程序允许版主发送 "Timed notifications" 他们可以选择提前发送特定时间的通知。
我的逻辑
当版主发送通知时,他们会发送特定的标签。在客户端,如果检测到标签,设备将不会显示通知。相反,它将使用 AlarmManager
并在给定时间设置闹钟。当在所需时间从 AlarmManager
收到意图时,广播接收器将发送通知。
代码
NotificationService.java
//Some other code
public void setTimedNotification(String notificationstring, int Seconds){
// get a Calendar object with current time
Calendar cal = Calendar.getInstance();
// add seconds to the calendar object
cal.add(Calendar.SECOND, Seconds);
Intent intent = new Intent(getBaseContext(), TimedNotifications.class);
PendingIntent sender = PendingIntent.getBroadcast(getBaseContext(), 1989, intent, PendingIntent.FLAG_UPDATE_CURRENT); //1989 is some random number
// Get the AlarmManager service
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
}
TimedNotifications.java
public class TimedNotifications extends BroadcastReceiver {
public static final int NOTIFICATION_ID = 1;
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
int requestID = (int) System.currentTimeMillis();
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Intent notificationIntent = new Intent(context, TargetClass.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(context, requestID,notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
int color = context.getResources().getColor(R.color.colorPrimary);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(notificationTitle)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(notificationMessage))
.setColor(color)
.setContentText(notificationMessage).setAutoCancel(true);
mBuilder.setSound(alarmSound);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.XXX.ZZZ">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<permission
android:name="com.PackageName.App.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.PackageName.App.permission.C2D_MESSAGE" />
<application
<!-- Some other activities and details -->
<receiver
android:name="com.PackageName.App.gcm.TimedNotifications"
android:process=":remote"/>
<!-- Bla bla bla -->
</application>
</manifest>
问题
当设备 运行 且屏幕未锁定时,此代码可以完美运行。所以我确信服务工作正常。如果设备未处于睡眠状态,它甚至会给我定时通知。这也表明代码工作正常。然而,设备被锁定超过 5-10 分钟。我没有收到任何通知。我想有一些权限问题。我尝试了很多权限组合,比如在 intent 中添加自定义标志,添加删除 android:process=":remote"
,更改接收者名称 class,包括接收者名称中的包名称,检查拼写错误,我什至尝试使用唤醒锁如 this post 所示:/ 等。但是到目前为止还没有运气。少了点东西。
对于在这种情况下寻找答案的不幸的人,我的代码非常好并且可以工作。当设备进入睡眠模式时,我刚刚发现“Greenify app”是 killing/hibernating 我的应用程序。在测试警报管理器功能时,请检查您的任务管理器或其他节电应用程序。
背景
我的应用向用户发送事件通知。通知由版主发送。但是,应用程序允许版主发送 "Timed notifications" 他们可以选择提前发送特定时间的通知。
我的逻辑
当版主发送通知时,他们会发送特定的标签。在客户端,如果检测到标签,设备将不会显示通知。相反,它将使用 AlarmManager
并在给定时间设置闹钟。当在所需时间从 AlarmManager
收到意图时,广播接收器将发送通知。
代码
NotificationService.java
//Some other code
public void setTimedNotification(String notificationstring, int Seconds){
// get a Calendar object with current time
Calendar cal = Calendar.getInstance();
// add seconds to the calendar object
cal.add(Calendar.SECOND, Seconds);
Intent intent = new Intent(getBaseContext(), TimedNotifications.class);
PendingIntent sender = PendingIntent.getBroadcast(getBaseContext(), 1989, intent, PendingIntent.FLAG_UPDATE_CURRENT); //1989 is some random number
// Get the AlarmManager service
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
}
TimedNotifications.java
public class TimedNotifications extends BroadcastReceiver {
public static final int NOTIFICATION_ID = 1;
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
int requestID = (int) System.currentTimeMillis();
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Intent notificationIntent = new Intent(context, TargetClass.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(context, requestID,notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
int color = context.getResources().getColor(R.color.colorPrimary);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(notificationTitle)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(notificationMessage))
.setColor(color)
.setContentText(notificationMessage).setAutoCancel(true);
mBuilder.setSound(alarmSound);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.XXX.ZZZ">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<permission
android:name="com.PackageName.App.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.PackageName.App.permission.C2D_MESSAGE" />
<application
<!-- Some other activities and details -->
<receiver
android:name="com.PackageName.App.gcm.TimedNotifications"
android:process=":remote"/>
<!-- Bla bla bla -->
</application>
</manifest>
问题
当设备 运行 且屏幕未锁定时,此代码可以完美运行。所以我确信服务工作正常。如果设备未处于睡眠状态,它甚至会给我定时通知。这也表明代码工作正常。然而,设备被锁定超过 5-10 分钟。我没有收到任何通知。我想有一些权限问题。我尝试了很多权限组合,比如在 intent 中添加自定义标志,添加删除 android:process=":remote"
,更改接收者名称 class,包括接收者名称中的包名称,检查拼写错误,我什至尝试使用唤醒锁如 this post 所示:/ 等。但是到目前为止还没有运气。少了点东西。
对于在这种情况下寻找答案的不幸的人,我的代码非常好并且可以工作。当设备进入睡眠模式时,我刚刚发现“Greenify app”是 killing/hibernating 我的应用程序。在测试警报管理器功能时,请检查您的任务管理器或其他节电应用程序。