屏幕关闭时 Android 通知不起作用

Posted

技术标签:

【中文标题】屏幕关闭时 Android 通知不起作用【英文标题】:Android Notification doesn't work when screen is off 【发布时间】:2012-10-31 21:15:12 【问题描述】:

应用程序非常简单。我有一个包含所有活动等的常规应用程序......

我有一项服务会在应用程序首次启动和/或设备重新启动时启动。

我设置了一个 BroadcastReceiver 来处理通知意图,它也非常基本并且功能完美。

android 设备上的显示屏打开时,通知可以完美运行。但是当我关闭屏幕时,不再创建通知。

我是通知新手,所以我可能忽略了一些简单的东西,但我似乎找不到它。

在我的服务中,我构建了一个工作线程,其中包含一个 Timer,它每分钟触发一次,并将 TimerTask 作为调度方法的一部分:


@Override
public int onStartCommand(Intent intent, int flags, int startId)

    boolean isStopping = false;
    if (intent != null)  // if the system has to shut us down, go down gracefully
    
        String intentAction = intent.getStringExtra(AppData.BROADCAST_ACTION);
        if (intentAction != null && intentAction.equals("android.intent.action.REBOOT"))
        
            boolean isRebooting = intent.getBooleanExtra(AppData.SYSTEM_ACTION, false);
            if (isRebooting)
            
                isStopping = true;
                stopSelf();
            
        
    

    if (!isStopping && !_workerThread.isRunning())
    
        _workerThread.run();
    

    return Service.START_STICKY;


_timer.schedule(_service.getWorker(), startDelay, executionDelay);

NotificationTask (TimerTask) 最终每分钟都会被 Timer 触发。然后它会检查一些逻辑以查看是否需要创建任何通知,如果需要,它会创建并发送通知,如下所示:


Notification notification = new NotificationCompat.Builder(_context)
        .setContentTitle(getString(R.string.notification))
        .setContentText(message)
        .setLargeIcon(decodeResource(_context.getResources(), iconId))
        .setSmallIcon(R.drawable.logo_mark)
        .setTicker(ticker)
        .setAutoCancel(true)
        .setSound(getRingtone(ringtoneUrl))
        .setVibrate(VIBRATION_PATTERN)
        .setLights(0xfff89829, 300, 5000)
        .setContentIntent(intent)
        .build();

_notificationManager.notify(notificationId, notification);

通知的类型是唯一的,我不在乎用户是否在我用下一个覆盖之前响应了一个。我的问题是,如果屏幕关闭,我不会收到通知。

请帮忙。


更新

我想添加代码以防有人像我一样卡住。

让我们从 AndroidManifest 开始。包括 2 个广播接收器和您的服务


<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<service android:name=".services.NotificationService"/>

<receiver android:name=".receivers.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
<receiver android:name=".receivers.NotificationReceiver" />

启动接收器只会在您的设备重新启动时安排您的闹钟。您将其设置为像这样呼叫您的其他接收者:


AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, NotificationReceiver.class), 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance(), 60 * 1000, pendingIntent);

主接收器将启动您的服务 - 您的服务应该扩展 IntentService 而不是常规服务。这是主要的接收器:


context.startService(new Intent(context, NotificationService.class));

还有服务


public class NotificationService extends IntentService

    public NotificationService()
    
        super("Notification Service");
    

    @Override
    public void onHandleIntent(Intent intent)
    
        // this is where I created my notifications
    

最后一个小技巧是在您的应用程序中再次创建您的 AlarmManager。这将替换可能已在 Boot Receiver 中创建的 AlarmManager。注意 PendingIntent.FLAG_CANCEL_CURRENT。这样做是为了当用户启动您的应用程序时,如果您的 AlarmManager 尚未在设备启动时注册,则会被注册。


AlarmManager alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, NotificationReceiver.class), PendingIntent.FLAG_CANCEL_CURRENT);
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, Utils.getNow(), 60 * 1000, pendingIntent);

希望这会有所帮助。

【问题讨论】:

设备可能有问题,你在运行什么设备? 两个设备,但 Jelly Bean...三星 Galaxy Nexus 和 Nexus 7。 【参考方案1】:

并不是说你做错了,因为我对 Timers 和 TimerTasks 没有太多经验,但我认为AlarmManager 是安排未来运行的标准方式,当屏幕关闭时,等等

【讨论】:

我想过修改代码以使用AlarmManager,但我更熟悉Timer。你知道这是否是我的问题吗?我认为通知是通知,但唉,我不知道。我将阅读有关 AlarmManager 的更多信息。 经过进一步审查,Android 似乎暂停了这些线程以节省电池电量。我将修改我的代码以使用 AlarmManager。如果/当这有效时,我会将其标记为正确答案。 是的,我的意思是问题不在于您的通知,而在于它们一开始就没有被创建。希望这会有所帮助。 事实证明你并不需要这样的服务。设置两个广播接收器是最简单的。一种用于设备启动,一种用于启动接收器调用以及应用程序调用。我发现这个*** 有一个项目链接,显示它非常好

以上是关于屏幕关闭时 Android 通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android 投射通知在锁定屏幕中不起作用

应用程序关闭时 Firebase 推送通知不起作用

应用程序关闭时,自定义声音在 Firebase 推送通知中不起作用

Flutter - onLaunch 中的 Firebase 云消息导航不起作用

应用程序关闭时,离子 2 本地通知不起作用

当应用程序完全关闭时,推送通知点击上的推送 ViewController 将不起作用