2016-08-09 4 views
0

アプリがバックグラウンドにある間に10分ごとにアラームでトリガされるサービスで何かをするアプリケーションがあります。ユーザーが実際に最近のアプリからアプリケーションを削除したり、強制的に設定から強制終了したり(またはログオフされている場合)、OSがアプリケーションを終了してもアラームが消えないようにする(死んで再起動する必要がある)すでに動作しています)。私は多くの異なるアプローチを試みました、最新の私はこれを試しましたhttp://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/運がない。私のアラームはこのように見えます。 最近のアプリから削除されたときにアラームが消滅するか、強制終了したユーザだけ

if(ActivityLifecycleHandler.isApplicationInForeground()) { 
     return; // If App is in foreground do not start alarm! 
    } 

    String alarm = Context.ALARM_SERVICE; 
    AlarmManager am = (AlarmManager) context.getSystemService(alarm); 

    Intent intent = new Intent(locationBroadcastAction); 
    PendingIntent pi = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0); 

    int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; 

    // Set trigger time to 0, because want to fire off the first one instantly 
    am.setRepeating(type, 0, ONE_MINUTE, pi);  

そしてBroadcastReceiver:

public class LocationBroadcastReceiver extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent myIntent = new Intent(context, LocationService.class); 
    context.startService(myIntent); 
} 
} 

私が間違っているのかの任意のアイデア? OSがアプリを殺すまでは、すべてうまく動作します。

答えて

1

最近のアプリから削除された場合でも(強制停止されていない場合でも)、アプリが強制終了された場合、アラームはオフになります。

それは実際にAlarmManagerを使用しての全体のポイントです:

注:アラームマネージャを使用すると、特定の時間に アプリケーションコードの実行を持つようにしたい場合のために意図され、も、あなたのアプリケーション 場合現在実行中ではありません。通常のタイミング操作(ティック、 タイムアウトなど)では、Handlerを使用する方が簡単で効率的です。アラームがでそこにまだあるかどうかを確認することができます

:おそらく何が起こっている

adb shell dumpsys alarm 

は、デバイスがアラームを受信するためにウェイクアップされていることですが、とすぐに受信が終了するなど、再び眠りに落ちますサービスを開始することができます。

レシーバはウェイクロックを解除する必要があります(サービスによって解放される)。デバイスがないことを保証しながら は、デバイスのウェイクアップイベントを受信し サービスにオフ仕事を通過するBroadcastReceiverを実装する一般的なパターンのために

ヘルパー:サポートライブラリは、まさにそれを行いWakefulBroadcastReceiverを提供します移行中に に戻ることはありません。

+0

Aaah、great!ええ、実際にはそれもアラームの全体のポイントだと思ったが、私はちょうどそれが正常に動作するようになることができなかったので、私は疑いがあった。私はこれを試して、それが動作するかどうかを確認します。とにかく情報に感謝します。 Btwは、サービスが覚醒してから約5秒間何らかの方法で動作していることをユーザーに通知しますか? – Slagathor

+0

ああ、アラームが実際には、アプリが死んだ後にダンプに表示されていません.. – Slagathor

+0

それは変わった、私はAPI 21であなたのコードを試してみて、それは動作するようです。アプリが終了して画面がオフになっていても、プロセスが作成され、受信者がアラームを取得します。異なる可能性があるのは、レシーバが静的に登録されている(そうでなければ、システムはそれを再作成する方法を知らない)ことだけですが、アラームがリストから消える理由は説明されていません。 – bwt

関連する問題