Android锁定设备通知没有响起

时间:2011-11-21 22:03:57

标签: android service locking notifications

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

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

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 个答案:

答案 0 :(得分:2)

嗯,无论何时锁定屏幕(通常在一两分钟内),手机都会进入睡眠模式。你有三个选择,其中两个更好。

  1. 在您的服务上使用startForeground。这样,它基本上就在前面。但它仍会受到睡眠模式的影响。
  2. 使用WAKE_LOCK - 这是我最喜欢的选项,但它需要应用中的额外权限,无知用户通常不会理解。
  3. 使用Alarm Manager设置闹钟 - 由于播放通知大约没有处理时间,这可能是最好的方法,然后当警报触发时会发送广播,这会导致{{{ 1}}使通知发出声音。
  4. 如果您需要可视倒计时器,那么也可以运行该服务,但不要依赖服务在没有WAKE_LOCK的情况下保持清醒状态。如果用户手机坏或者尝试使用使用太多内存的应用程序,也可以销毁服务 - 我的手机很可能因为我的手机很糟糕而杀了它。

    我喜欢唤醒锁,但是警报管理器可能是最好的方法。

    无论手机是清醒还是睡着,BroadcastReceiver都会保持不变。上下文基于它所处的运行进程/类/代码块。如果上下文导致问题,我希望它抛出异常并强制关闭。