2016-08-09 11 views
2

OSがアプリケーションを終了させると、私のアラームが殺されます。私はそれがOSのアプリを殺したにもかかわらず、それが実行され続けるだろうというアラームのポイントの1つだと思った? "./adb shell dumpsys alarm"コマンドを使用してアラームの寿命を確認し、OSがアプリケーションを終了するたびにアラームも消えます。どのように私は私のアラームを起動します。OSがアプリケーションを終了するとアラームが鳴ります

public static void startLocationAlarm(Context context){ 
    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; 
    long interval = ONE_MINUTE; 
    long triggerTime = SystemClock.elapsedRealtime() + interval; 

    am.setRepeating(type, triggerTime, ONE_MINUTE, pi);  
} 

いくつかのより多くのコンテキストを追加するには、私は、バックグラウンドでのサービス(ないIntentService)でいくつかの場所の操作を行いますしようとしています。ここに私の受信機があります。私がサービスが完了する前に殺されることを望んでいなかったので、Wakefulを使用しました。いくつかの詳細については

public class LocationBroadcastReceiver extends WakefulBroadcastReceiver { 

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

    Intent myIntent = new Intent(context, LocationServiceAlarmOwnGoogleClient.class); 
    //context.startW(myIntent); 
    LocationBroadcastReceiver.startWakefulService(context, myIntent); 
} 
} 

:私は、ユーザーがバックグラウンドでそれをした後に戻ることができ、いくつかの活動のOnStart方法でアラームを解除してください。それがこの奇妙な行動を引き起こすかどうかは分かりません。ここに私の取り消し方法があります:

public static void stopLocationAlarm(Context context){ 
    Intent intent = new Intent(locationBroadcastAction); 
    PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
    alarmManager.cancel(sender); 
} 
+0

これはデフォルトの動作です。 – Shaishav

+0

「OSが私のアプリケーションを殺すたびに、アラームも消えています」 - 「OSが私のアプリケーションを殺す」という意味を詳しく説明してください。 – CommonsWare

+0

@Shaishav Aaah、okey。私は、アプリケーションがOSによって殺されたとしても、Alarmsが生き続けると考えていたと思った。 OSがそれを殺しても、私はそれを生き続けることができますか? – Slagathor

答えて

0

電話をオンにするコールバックを聞くサービスを追加できます。 マニフェスト

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

にこの権限を追加し、レシーバ

<receiver android:name=".util.notification.local.MyBootCompletedService"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
</receiver> 

public class MyBootCompletedService extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     AlarmReceiver.startLocalNotificationService(context); 
    } 
} 
+0

こんにちは!答えをありがとう!しかし、私は起動時にアラームやサービスを実行したくありません。ユーザーが既に自分のアプリを開いてからバックグラウンドに置いた場合のみ、アラームを実行してサービスを起動させます。 – Slagathor

0

を登録するアラームをキャンセルする原因となったエラーは、実際にコードとは何の関係もありませんでしたが、特別なバッテリーの設定としなければなりませんでしたHuaweiデバイスで。あなたのアプリが「プロテクトされたアプリ」で「プロテクト」に設定されていない場合、アプリを殺すとアラームがキャンセルされます。 "保護されたアプリ"にあなたのアプリを追加することでこの問題を解決できます。 Xiaomiデバイスでも同じです。それらを「Protected apps」に追加する必要がある場合、アラームは意図したとおりに機能します。解決に導いてくれた@ CommonSWareに感謝します。

関連する問題