BroadcastReceiver不会唤醒手机

时间:2013-01-09 15:18:09

标签: android broadcastreceiver

我有一个警报应用程序。我通常知道接收器的生命周期以及如何使用WakeLock。

今天然而,一位用户联系了我,他给我发了一个非常奇怪的日志,抱怨他的警报没有开始,直到他自己解锁了电话。在接收器完成其工作之后和活动开始之前,我曾经遇到手机重新入睡的问题,但在接收器中创建WakeLock似乎解决了这个问题。至少直到今天 - 从日志开始,似乎在用户自己解锁手机之前根本没有调用onReceive方法。

事实:

  • 这是我听说过的第一个案例
  • 它已经发生过几次给用户,但不是每次都
  • 通过向SQLite数据库添加文本来准备
  • 日志。它似乎没有以任何重要方式延迟应用
  • 在预期的警报开始时间之后100秒内记录来自onReceive的
  • 信息。这是onReceive中的第一个方法调用
  • 警报在用户解锁手机后启动
  • 我使用AlarmManager.RTC_WAKEUP标志
  • 用户说他没有任何自定义ROM。如果他有任何自定义/特殊锁屏,我等待回答
  • 手机型号为Sony Xperia U ST25A,Android 4.0.4

任何可能导致此问题的想法?是否有可能BroadcastReceiver的“内部”WakeLock无法以某种方式工作?

编辑:

我想强调这里的问题 - BroadcastReceiver应该在整个onReceive方法中保持手机清醒。但在我的情况下,它要么是

  • 手机在onReceive方法结束前(甚至在完成“记录呼叫”之前)暂停睡眠
  • 电话未被接收器唤醒

另外,我想指出用户已经明确说明的事实 - 当他自己解锁手机时,警报已经开始了。几次。

一些代码:

@Override
public void onReceive(Context context, Intent intent) {
    Logger.initialize(context, "AlarmReceiver");
    ...
}

记录器方法:

public synchronized static void initialize(Context context, String text) {
    try {
        if (mInstance == null) { // this is the block that is runned
            BugSenseHandler.initAndStartSession(context, BUGSENSE_ID);
            mInstance = new Logger(context);
            log("== Logger initialized == from "
                    + (text != null ? text : "")); // it stores times as well. Said 
                                                   // that alarm was started over 100 
                                                   // seconds after it should
        } else {
            log("logger initialized again from "
                    + (text != null ? text : ""));
        }
    } catch (Exception e) {
        try {
            BugSenseHandler.sendException(e);
            mInstance = null;
        } catch (Exception e2) {
        }
    }
}

1 个答案:

答案 0 :(得分:0)

查看Commonsware的WakefulIntentService