0

アラーム登録とトリガーでのサービス開始に関する質問のカップル。

  1. 現在の時刻より数分前にアラームが設定されていて、電話のスイッチがオフになっている場合、スケジュール時間が経過した後、次の電話のアラームトリガーがオンになりますか?

  2. サービス中の保留中のインテントをキャンセル/更新するにはどうすればよいですか?サービス方法でリクエストコードを取得するにはどうすればよいstartCommand()ですか?

  3. 10秒ごとにアラームがトリガーされた場合、サービスの複数のインスタンスが作成されますか?

4

3 に答える 3

1
  1. アラームの時刻をSharedPreferencesに保存します。次に、android.intent.action.BOOT_COMPLETEDのレシーバーを登録し(android.permission.RECEIVE_BOOT_COMPLETEDの権限をマニフェストに追加することを忘れないでください)、起動時に実行されるレシーバーで、アラームがSharedPreferencesにあるかどうかを確認できます。もしそうなら、まだ経過していない場合はリセットするか、時間が経過している場合はどうするかを決めることができます。

  2. インテント保留中のアラームマネージャのキャンセルに関する問題を参照してください

  3. いいえ。サービスのonCreateは1回だけ呼び出されます。そのonStartとonStartCommandは毎回呼び出されます。

于 2012-02-27T19:26:39.497 に答える
1
  1. 「スイッチオフ」がフルパワーダウンを意味し、「電源ボタンを短く押して画面をオフにする」だけではない場合、答えは「いいえ」です。

  2. リクエストコードは一切取得できないと思います。getServiceのドキュメントに記載されているように、このrequestCodeフィールドは「現在使用されていません」です。すべてのデータをIntent(getServiceの3番目の引数)で渡す必要があります。

  3. しない。http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)を参照してください

このメソッドを呼び出すたびに、ターゲットサービスのonStartCommand(Intent、int、int)メソッドが呼び出されます。

于 2012-02-27T13:56:37.950 に答える
0
  1. 私が開発している自分のアプリから、電話がオフになっているときにアラームが設定されている場合、それは次の電話のオン/起動時に実行されています。これは、BOOT_COMPLETEDのレシーバーが存在しない場合です。これが予想される動作であるかどうか、または電話のバリエーションで一貫しているかどうかはわかりません。

    指定された時間にアラームでインテントを実行したい場合は、WakeLockでgetBroadcastPendingIntentを使用する必要があります。PendingIntentの他のバリアントは、電話が再びシャットダウンする前に十分に長い間起動し続けることを保証しないためです。これは、CommonsWareによる別の投稿からの情報であり、私が見つけてリンクしようとします。

  2. たとえば、次のような関数を使用して、アラームマネージャに送信された保留中のインテントを削除できると思います。

    public void unregisterEvent(PendingIntent sender) { ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE)).cancel(sender); }

    ここで、PendingIntentは、削除しようとしている元のインテントとまったく同じように作成されています。再度AlarmManagerを呼び出すときに、新しいPendingIntentとともに正しいIDを指定することで、更新できます。

    AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

    これは、PendingIntentを作成/再構築するために使用するものです。

    PendingIntent.getService(this, uniqueIndexToIntent, theIntentItself, PendingIntent.FLAG_UPDATE_CURRENT);

    フラグは、インテントがすでに存在する場合はインテントを更新し、存在しない場合は新しいインテントを作成します。

  3. そうは思わない。ただし、バッテリーの使用量を最小限に抑えるために、サービスの実行が終了したら、サービスでstopSelf()を呼び出すことをお勧めします。何もすることがなければ、実行する必要はありません。

于 2013-04-03T20:20:55.020 に答える