通知未显示,因为服务或警报管理器已被终止
Notification not showing because service or alarm manager is killed off
我有一个无法解决的问题,我今天花了 7 个小时来寻找解决方案。我正在尝试为我的应用程序显示通知。它在具有旧 OS 版本的旧设备上运行良好,但是在 Note 8 运行 Oreo API 27 上,我的通知不显示。我花了几个小时的时间进行测试,我发现了问题:当应用程序处于 运行 并且应用程序打开时,通知会显示,但是当我退出应用程序时,通知不会显示。所以我认为这与系统处理服务的方式有关。
这是正常现象吗?有解决办法吗?
这是我的通知代码:
onCreate...
if (settings.getBoolean("enabled", true)) {
if (settings.getLong("lastRun", Long.MAX_VALUE) < System.currentTimeMillis() - mTimeDelay) {
sendNotification();
}
}
setAlarm();
stopSelf();
}
public void setAlarm() {
Intent serviceIntent = new Intent(this, CheckRecentRun.class);
PendingIntent pi = PendingIntent.getService(this, 131313, serviceIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + mTimeDelay, pi);
//Alarm is set for 3 days
}
public void sendNotification() {
Intent intent = new Intent(this, WelcomeActivity.class);
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel mChannel = notificationManager.getNotificationChannel(channelId);
if (mChannel == null) {
mChannel = new NotificationChannel(channelId, channelName, importance);
mChannel.setDescription(mNotificationText);
mChannel.enableLights(false);
mChannel.setLightColor(Color.GREEN);
mChannel.setShowBadge(false);
notificationManager.createNotificationChannel(mChannel);
}
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, channelId).setStyle(new NotificationCompat.BigTextStyle().bigText(mNotificationText)).setSmallIcon(R.mipmap.ic_launcher).setContentTitle(mAppName).setContentText(mNotificationText).setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(false);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntent(intent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(mNotificationCode, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(notificationId, mBuilder.build());
}
这可能是三星在其较新的 phone 上的激进电池管理行为(与华为等许多其他品牌一样)杀死了您的应用程序。
查看此网站:https://dontkillmyapp.com/
并查看三星下的注释:
银河 S8 及更高版本
随着他们的旗舰 Galaxy S8 的推出(以及一些早期的实验),三星引入了一种有缺陷的尝试来延长电池寿命,称为 App power monitor。
为了您的应用能够正常运行,请在应用电量监控中将它们列入白名单。
怎么做:
打开“设置”>“设备维护”>“电池”,您会在底部看到最常用应用的列表。您可以单独或成组管理应用程序,方法是选择它们,然后点击大的“节省电源”按钮。正在休眠的应用程序将出现在底部的休眠应用程序列表中(点击它以展开列表)。进一步滚动——一直到最底部——你会发现不受监控的应用程序。这些是您特别希望从 App power monitor evil reach 中排除(白名单)的应用程序。
在“不受监控的应用”菜单中,您可以点击三点菜单以在列表中添加或删除应用。您可以完全关闭 App 电源监视器功能,而不用担心这些,因为它对电池寿命几乎没有影响,只会妨碍 Galaxy phone.
这是过度的,在某些情况下是彻头彻尾的误导,使用恐吓策略让你依赖三星的软件,而其他 Android 设备没有它也能正常工作。
先试试这个。如果这之后还有任何问题,请告诉我。
如果您的代码可以在其他设备或您的模拟器上运行,这应该是问题所在。
我有一个无法解决的问题,我今天花了 7 个小时来寻找解决方案。我正在尝试为我的应用程序显示通知。它在具有旧 OS 版本的旧设备上运行良好,但是在 Note 8 运行 Oreo API 27 上,我的通知不显示。我花了几个小时的时间进行测试,我发现了问题:当应用程序处于 运行 并且应用程序打开时,通知会显示,但是当我退出应用程序时,通知不会显示。所以我认为这与系统处理服务的方式有关。
这是正常现象吗?有解决办法吗?
这是我的通知代码:
onCreate...
if (settings.getBoolean("enabled", true)) {
if (settings.getLong("lastRun", Long.MAX_VALUE) < System.currentTimeMillis() - mTimeDelay) {
sendNotification();
}
}
setAlarm();
stopSelf();
}
public void setAlarm() {
Intent serviceIntent = new Intent(this, CheckRecentRun.class);
PendingIntent pi = PendingIntent.getService(this, 131313, serviceIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + mTimeDelay, pi);
//Alarm is set for 3 days
}
public void sendNotification() {
Intent intent = new Intent(this, WelcomeActivity.class);
NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel mChannel = notificationManager.getNotificationChannel(channelId);
if (mChannel == null) {
mChannel = new NotificationChannel(channelId, channelName, importance);
mChannel.setDescription(mNotificationText);
mChannel.enableLights(false);
mChannel.setLightColor(Color.GREEN);
mChannel.setShowBadge(false);
notificationManager.createNotificationChannel(mChannel);
}
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, channelId).setStyle(new NotificationCompat.BigTextStyle().bigText(mNotificationText)).setSmallIcon(R.mipmap.ic_launcher).setContentTitle(mAppName).setContentText(mNotificationText).setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(false);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntent(intent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(mNotificationCode, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(notificationId, mBuilder.build());
}
这可能是三星在其较新的 phone 上的激进电池管理行为(与华为等许多其他品牌一样)杀死了您的应用程序。
查看此网站:https://dontkillmyapp.com/
并查看三星下的注释:
银河 S8 及更高版本 随着他们的旗舰 Galaxy S8 的推出(以及一些早期的实验),三星引入了一种有缺陷的尝试来延长电池寿命,称为 App power monitor。
为了您的应用能够正常运行,请在应用电量监控中将它们列入白名单。
怎么做:
打开“设置”>“设备维护”>“电池”,您会在底部看到最常用应用的列表。您可以单独或成组管理应用程序,方法是选择它们,然后点击大的“节省电源”按钮。正在休眠的应用程序将出现在底部的休眠应用程序列表中(点击它以展开列表)。进一步滚动——一直到最底部——你会发现不受监控的应用程序。这些是您特别希望从 App power monitor evil reach 中排除(白名单)的应用程序。
在“不受监控的应用”菜单中,您可以点击三点菜单以在列表中添加或删除应用。您可以完全关闭 App 电源监视器功能,而不用担心这些,因为它对电池寿命几乎没有影响,只会妨碍 Galaxy phone.
这是过度的,在某些情况下是彻头彻尾的误导,使用恐吓策略让你依赖三星的软件,而其他 Android 设备没有它也能正常工作。
先试试这个。如果这之后还有任何问题,请告诉我。
如果您的代码可以在其他设备或您的模拟器上运行,这应该是问题所在。