1

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

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

事实:

  • 这是我听说的第一个案例
  • 它发生在用户身上几次,但不是每次
  • 日志是通过向 SQLite 数据库添加文本来准备的。它似乎并没有以任何重要的方式延迟申请
  • 来自 onReceive 的信息是在预期警报开始时间后 100 秒内记录的。这是 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) {
        }
    }
}
4

1 回答 1

0

看看Commonsware的 WakefulIntentService

于 2013-01-09T15:26:09.233 回答