【问题标题】:BroadcastReceiver doesn't wake up the phoneBroadcastReceiver 不会唤醒手机
【发布时间】:2013-01-10 00:44:27
【问题描述】:

我有一个闹钟应用程序。我大致知道接收器的生命周期以及如何使用 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) {
        }
    }
}

【问题讨论】:

  • 没有一些代码,任何人都无法为您提供任何适当的帮助。
  • @StefandeBruijn 我有一些代码以及解释我认为它与问题原因无关的方式
  • 亲爱的,请看我在这个帖子stackoverflow.com/questions/20113161/…的回答

标签: android broadcastreceiver


【解决方案1】:

看看来自 Commonsware 的 WakefulIntentService

【讨论】:

  • 这看起来很有趣,但我仍然想知道为什么手机在完成 onReceive 之前进入睡眠状态,而它应该保持清醒直到结束,至少根据文档
  • 好的,我明白你的意思了。如果您在广播接收器之外生成工作,WakefulIntent 服务类很有用,但情况似乎并非如此......我也同意您的观点,根据 Android 文档,AlarmManager 持有一个唤醒锁,以确保您的 onReceive 方法将完成。在我看来,这听起来更像是 AlarmManger 没有按时触发的情况。当然,一些日志消息可以帮助澄清这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多