通知未显示,因为服务或警报管理器已被终止

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 设备没有它也能正常工作。

先试试这个。如果这之后还有任何问题,请告诉我。

如果您的代码可以在其他设备或您的模拟器上运行,这应该是问题所在。