実行中にラジオ受信者を有効または無効にします。

2518 ワード

訳本:http://www.grokkingandroid.com/enabling-and-disabling-broadcastreceivers/
実行中にラジオ受信者を有効または無効にします。
BroadcastReceiversは、いくつかのシステムが現在発生しているイベントをよく知ることができます。しかし、ある事件が発生したことを知るだけでいいです。あるいは、ある事件が発生したかどうかは短期的に知りたいです。
動的登録放送受信者メカニズムは、イベントが発生したときに、あなたの宿主Activityと登録された放送受信者が利用できなくなる可能性がありますので、この問題をうまく解決できません。唯一の要求に達することができるのはコードの中でラジオ受信者を有効にして無効にするだけです。
ラジオ受信者を無効または有効にする
Package Manager類の方法を使って、放送受信者を無効または有効にしてもいいです。Package Manager 実行時にいくつかのアプリケーションコンポーネント(activity、receiver、service、provider)を有効にし、無効にすることができます。以下は具体的な使い方です。
PackageManager pm = getPackageManager();
ComponentName compName =
      new ComponentName(getApplicationContext(),
            YourReceiver.class);
pm.setComponentEnabledSetting(
      compName,
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
      PackageManager.DONT_KILL_APP);
Supported states of set Component EnbaledSetting()
COMPONENT_ENABLED_STATE_DEFAULT
manifestに設定
COMPONENT_ENABLED_STATE_DISABLED
無効にする
COMPONENT_ENABLED_STATE_ENABLED
有効にする
set Component EnbaledSetting()方法は次の3つの状態をサポートします。
一つのコンポーネントの状態の変化が予知できない場合、デフォルトモードではPackage Managerがあなたのアプリケーションを殺します。使用DONT_KILL_AP , BroadcastReceiversの使用も安全で信頼できる。もちろん使わないなら
DONT_KILLAPPモードは、ほとんどの急遽テストした場合でも、エラーを発見します。
ラジオ受信者をデフォルトで無効にする
プログラム実行時にreceiverを有効にしたい場合は、manifestファイルで設定できます。初期化時はラジオ受信者を無効にします。
<receiver
   android:name=".YourReceiver"
   android:enabled="false">
   <!-- your intent filter -->
</receiver>
いつ運転中にラジオの受信者を有効にして無効にするべきですか?
このようにすべき基本的な原因は、あなたが携帯電話の設備のために重要な資源(例えば電源)を節約したいからです。一部のユーザーとは関係のないコードのために電池を消耗したくないです。これは全く必要ないです。ほとんどの場合、動的に登録された放送受信者を使って効果をあげることができますが、すべての場合に効果があります。
以下のいくつかの場合には、Package Managerプログラムを明確に使用できます。
1、次の携帯の再起動を知る必要がありますが、次を知る必要があります。このような状況では、動的登録receiver方法は使えません。ラジオ受信者を静的に登録しなければなりません。しかし、毎回の携帯の起動を監督したくないです。この場合は、次の携帯電話の起動を傍受した後、Package Managerを使って受取人を無効にします。
2、1つ以上の放送受信者の存在が特殊なシステムサービスに依存している場合、依存するサービスの状態が期待されていない限り、すべての放送受信者を無効にすることができる。
3、通知を使用するつもりですが、現在のアプリケーションがアクティブでない場合だけです。この場合、あなたの放送受信者はデフォルトで有効になりますが、ActivityのonResume()メソッドで無効にして、onPause()メソッドで再起動します。
このテーマについても行ってみてもいいです。
 Reto Meier’s  ブログpost about locationn based apps
 ,ソースコードをより深く調べたり、accompanying source code
彼はhis talk at Google's IO 2011でこのテーマを紹介しました。とても見ごたえのあるvideoです。
関連記事:
Android Tutorial:BroadcastReceiver Android:Getting Notified of Connectivity Changes