1

ユーザーが自分の位置を記録するアラームを追加できるAndroidアプリケーションがあります。たとえば、毎日午前8時に自分のいる場所を記録したいと思います。アラームを受信すると、ユーザーの位置を取得してデータベースに保存するサービスを開始します。この機能は、アプリが(バックグラウンドまたはフォアグラウンドで)実行されているときに正常に機能します。

問題は、タスクマネージャーにアクセスしてアプリを強制的に閉じても、アラームが鳴らないように見えることです。ユーザーが電話を再起動してアプリを強制終了する可能性があるため、これは重要です。

アラームを設定する方法は次のとおりです。

private void setNewAlarm(int hour, int minute, int id) {
    Intent alarmIntent = new Intent(AutoLoggerActivity.this, AlarmReciever.class);
    alarmIntent.putExtra(Constants.ALARMID_FIELD_NAME, id);
    PendingIntent sender = PendingIntent.getBroadcast(AutoLoggerActivity.this, id, alarmIntent, 0);

    Calendar alarmCal = Calendar.getInstance();
    alarmCal.set(Calendar.HOUR_OF_DAY, hour); // set user selection
    alarmCal.set(Calendar.MINUTE, minute); // set user selection
    alarmCal.set(Calendar.SECOND, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(), 120000, sender);
}

BroadcastReceiverは次のとおりです。

public class AlarmReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();     
        int alarmId = bundle.getInt(Constants.ALARMID_FIELD_NAME);
        Toast.makeText(context, "Alarm Running: ID = " + alarmId, Toast.LENGTH_LONG).show();
        Log.d(TAG, "AlarmReceiver: onRecieve. ID = " + alarmId);

        Intent serviceIntent = new Intent(context, LocationRecordingService.class);
        serviceIntent.putExtra(Constants.ALARMID_FIELD_NAME, alarmId);
        context.startService(serviceIntent);
    }
}

なぜこれが起こっているのか考えていますか?

4

1 に答える 1

4

これは実際にはAndroidオペレーティングシステムの設計機能であり、回避できるものではありません。「停止」状態のアプリケーションは、ブロードキャストを受信できません。次の2つの条件下でのみこの状態になります。

  1. アプリケーションが起動される前に最初にインストールされたとき
  2. ユーザーがアクティブに[設定]に移動し、強制終了したとき

問題は、タスクマネージャーにアクセスしてアプリを強制的に閉じても、アラームが鳴らないように見えることです。ユーザーが電話を再起動してアプリを強制終了する可能性があるため、これは重要です。

デバイスが再起動された場合、アプリケーションはこの「停止」状態にあるとは見なされないため、これは完全には当てはまりません。ただし、アラームは再起動を持続しないため、アプリケーションはACTION_BOOT_COMPLETED、デバイスの起動時にシステムによるブロードキャストをリッスンする必要があります。これにより、保留中のアラームを再スケジュールできます。

ユーザーが積極的にアプリを強制終了する場合は、そのユーザーの選択を尊重する必要があります。

于 2012-08-28T21:11:57.937 に答える