安卓锁设备通知不响

标签 android service locking notifications

我开发了一个应用程序,它启动一个触发倒数计时器的自定义服务。该服务在计时器开始时运行通知,在计时器结束时运行其他通知。 在测试期间,我看到了有关通知和锁定屏幕的问题。我描述了我所做的测试:

1) 如果我运行应用程序并且不让手机关机或锁定,该服务会正确播放通知声音,就好像主应用程序( Activity )在前面一样。在这两种情况下,服务都会完美地触发通知。

2) 如果我锁定手机并且应用程序在锁定前位于前面,该服务会正确播放通知声音。

3) 这是我的问题:如果我锁定手机并且应用程序在锁定之前不在前面,通知不会响起,但服务看起来正在运行,因为当我按下我的“on”按钮时电话,然后在屏幕打开后立即播放通知(声音和图标),就在锁定屏幕之前我可以解锁手机。

我在服务中的代码取消了之前的通知,这是在计时器结束后运行通知的代码:

private void notificacion_fin() {
    NotificationManager notificationManager = 
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.cancel(0);
    Notification not = new Notification();
    // Ponemos la nueva notificacion de que hemos acabado
    SharedPreferences preferences = this.getSharedPreferences("com.fsp.mypref", 0);
    String not_sound = preferences.getString("notification_tone","");
    not.audioStreamType = AudioManager.STREAM_NOTIFICATION;
    not.sound = Uri.parse(not_sound);
    if (tipo_cronometro == 1) {
        not.icon = R.drawable.ic_stat_notify_time;
        not.tickerText = "Task has finished";
    } else {
        not.icon = R.drawable.ic_stat_notify_complete;
        not.tickerText = "Type 2 task has finished";
    }
    not.when = System.currentTimeMillis();
    not.defaults |= Notification.DEFAULT_VIBRATE;
    not.vibrate = new long[] {300,300,300,300,300};
    not.flags |= Notification.FLAG_AUTO_CANCEL;
    Intent notificationIntent = new Intent(this, MyActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    not.setLatestEventInfo(this, "My app", not.tickerText, contentIntent);
    notificationManager.notify(0, not); 
    notificacion = true;
}

我怀疑我的问题可能与上下文有关, 可能?有人知道会发生什么吗? 为什么在我的第 3 次测试中没有正确运行?
欢迎任何帮助。
提前致谢。

P.S.:当我说通知声音时,我指的是声音+图标

最佳答案

好吧,只要您锁定屏幕(通常在一两分钟内),手机就会进入休眠模式。您有三个选项,其中两个更好。

  1. 在您的服务上使用startForeground。这样,它基本上就会在前面。但它仍然会受到 sleep 模式的影响。
  2. 使用 WAKE_LOCK - 这是我最喜欢的选项,但它需要应用程序中的额外权限,无知的用户通常不理解。
  3. Alarm Manager设置闹钟- 由于播放通知不需要任何处理时间,这可能是最好的方法,然后您将在警报触发时发送广播,这将导致 BroadcastReceiver 发出通知声音。

如果您需要一个可视化倒计时计时器,那么也可以运行该服务,但不要依赖服务在没有 WAKE_LOCK 的情况下保持清醒。如果用户的手机不好或尝试使用占用过多 RAM 的应用程序,服务也可能会被破坏 - 我的手机可能会因为我的手机很烂而杀死它。

我喜欢唤醒锁,但 Alarm Manager 可能是最好的方式。

Context 将保持不变,无论手机处于唤醒状态还是 sleep 状态。上下文基于它所在的正在运行的进程/类/代码块。如果上下文导致问题,我希望它抛出异常并强制关闭。

关于安卓锁设备通知不响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219144/

相关文章:

android - 英特尔 HAXM 6.0.4 与 MacOS 不兼容

android - 我需要有关Android市场上的高分辨率图标的帮助,但我实在无法理解

java - Android服务应用——CPU监控

hibernate - Grails - 如何在服务中保存域对象?

c# - 如何锁定一段特定的代码 C#

android - 使用 Asynctask 从 internalStorage 加载 recyclerView 中的位图

android - 调用 gridview.setAdapter() 时出现 java.lang.NullPointerException

android - "Firebase App named ' [默认] ' already exists."

mysql - Daemon 和 View 同时访问 SQLite 数据库

java - 等待锁操作时线程永远阻塞