4

Androidのアラームマネージャは、電話の電源が切れたときに登録されているすべてのアラームを失います。BOOT_COMPLETEDを聞くときにBroadcastReceiversはどのコンテキストを受信しますか?

私はアンドロイドの起動時にトリガするために、次の放送受信機を使用し

public class AlarmBootReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
      Cursor alarmCursor = MainActivity.dbHelper.loadAlarms(); 
      // Iterate through every stored alarm and set those alarms. 
      // .... 
      alarmCursor.close(); 
     } 
    } 
} 
  • 放送受信機のonReceiveは、システムの起動時にトリガされると、どのようなコンテキストパラメータがメソッドに渡されますか?そのコンテキストで設定されたアラームをキャンセルするコンテキストが必要なので、コンテキストを知る必要があります。

  • システム起動時にMainActivityが初期化されないため、MainActivity.dbHelper.loadAlarms()の呼び出しが安全でないと仮定しています。または、dbhelperとloadAlarms()はすべて初期化され、静的宣言されているので安全ですか?

+0

コンテキストのタイプは重要ではありません。さらに重要なのは、あなた自身で処理するべきではないということです。これには、フレームワークやGoogleライブラリに複数のソリューションがあります。最初のオプション:Job sheduler api。第2のオプション:GcmNetworkMamagerを使用してスケジュールされたタスク。その他... –

答えて

1

をごonReceive()でサービスを呼び出し、そのサービスからのアラームを設定するには、どのようなコンテキストパラメータがメソッドに渡されますか?私はそのコンテキストで コンテキストを設定する必要があるので、コンテキストを に設定する必要があります。

この場合、グローバルアプリケーションContextonReceive()になります。しかし、それは無関係です。あなたは知る必要はありません。

アラームを後でキャンセルするには、PendingIntentを作成し、これを行うにはContextを使用できます。アラームは特定のContextにリンクされておらず、特定のアプリケーションにのみリンクされています。

I)はMainActivity.dbHelper.loadAlarmsへの呼び出しを(と仮定していますMainActivityは、システム起動中に初期化されていないため、安全 ではありません。または、dbhelperとloadAlarms()がすべて初期化され、 がstaticと宣言されているので、 は安全ですか?

dbHelperが実際にstaticで、インスタンスの作成(onCreate()ない)で初期化した場合、このコールは結構です。 Activityが正しく設定されていると仮定して、何かばかげたことをするのは簡単なので、一般的に、アクティビティの静的メソッドを呼び出すのは嫌です。そのような静的メソッドをActivityではなく、staticメソッドしか含まない一般的なユーティリティクラスに移動する方がよいでしょう。これはあまり疑わしくないように見えます。

0

それはあなたのBroadcastReceiverが受け取るContextの種類は関係ありません(いずれの場合も、そのApplicationContext)ので:あなたはActivityに関連付けられているDBHelperを使用しないでください 1)。代わりに、それをシングルトンにしてアプリ全体で使用してください。 2)AlarmManagerServiceを使用して設定する必要があります。放送受信機のonReceiveは、システムの起動時にトリガーされるときに、その良いアイデア

+0

ああ、意味がある。DBHelperは静的メソッドを持つ静的クラスですか?それともシングルトンとして実装するのと違うのですか? DBHelperを初期化可能にするということは、どこかで変数として保持しなければならないという意味で私は確信していません。私の実装がスレッドセーフであると仮定すると、異なるアクティビティがそのシングルトンをインスタンス化しますか? – SMP

+0

シングルトンは静的とは異なります。単純なgoogle検索では、これにつながります。https://gist.github.com/Akayh/5566992 –

+0

シングルトンは使用しないでください。 –

関連する問題