私はアラームアプリケーションを持っています。受信機のライフサイクルと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) {
}
}
}