3

次のように、電話の起動後に開始する受信機があります。

<receiver android:name=".OnBootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>

</receiver>

私が実行するレシーバーで、次のようなアラームを設定します。

AlarmManager  mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        Intent i=new Intent(context, LocationPoller.class);

        i.putExtra(LocationPoller.EXTRA_INTENT,
                  new Intent(context, LocationReceiver.class));
        i.putExtra(LocationPoller.EXTRA_PROVIDER,
                 LocationManager.GPS_PROVIDER);



         PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
          mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime(),
                        PERIOD,
                        pi);

もちろん、ユーザーがアプリをインストールする場合を除き、ユーザーが電話を再起動するまでアラームは設定されません。

これを回避するには、AlarmManager が設定されているかどうかをアクティビティから確認する必要があります。そうでない場合は、アクティビティから設定する必要があります。

したがって、アラームマネージャーが既に設定されているかどうかを確認するにはどうすればよいですか。

4

2 に答える 2

4

唯一できることは、ユーザーがアプリをインストールして初めて開くときにSharedPreference、アラームが設定されているかどうかを示すフラグをに設定できることです。設定されていない場合は、Alaramを設定します。

メソッドのメインActivity チェックでonCreate

SharedPreferences spref = getSharedPreferences("TAG", MODE_PRIVATE);

 Boolean   alaram_set = spref.getBoolean("alarm_set_flag", false);  //default is false

if(!alaram_set){
//create your alarm here then set the flag to true

 SharedPreferences.Editor editor = spref.edit();
        editor.putBoolean("alarm_set_flag", true); // value to store
        editor.commit();
}
于 2012-08-31T11:24:44.357 に答える
2

残念ながら、AlarmManager に現在のアラームを照会することはできません。

問題を解決する最善の方法は、現在のアラームをキャンセルして新しいアラームを設定することです。

受信側のものと一致するインテントを作成するだけです。詳細はこちら

これをあなたの活動に追加してください

   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

     Intent i=new Intent(context, LocationPoller.class);

        i.putExtra(LocationPoller.EXTRA_INTENT,
                  new Intent(context, LocationReceiver.class));
        i.putExtra(LocationPoller.EXTRA_PROVIDER,
                 LocationManager.GPS_PROVIDER);

        PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    // Cancel alarms
    try {
        AlarmManager.cancel(pi);
    } catch (Exception e) {
        Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
    }
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime(),
                        PERIOD,
                        pi);

おそらく、インテントのコンテキストを変更して、レシーバーのものと同じにする必要があります。

別の回避策は、アプリの最初の起動かどうかを検出し、そのときにのみ起動することです。しかし、ユーザーが最初の起動前に電話を再起動するとどうなりますか?

于 2012-08-31T11:27:41.583 に答える