web-dev-qa-db-ja.com

サービス内のブロードキャストレシーバー

BroadcastReceiver内でServiceを起動しようとしています。私がやろうとしているのは、バックグラウンドでserviceを実行して着信テキストメッセージを収集し、着信通話を記録することです。これを実行する最善の方法は、serviceを実行することで、どちらかをカタログ化できるブロードキャストレシーバーを組み込むことです。

これを行うにはどうすればよいですか?すでにサービスを実行しています。

85
Utopia025

サービスは既にセットアップされているので、サービスにブロードキャストレシーバーを追加するだけです。

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("Android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(Android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

サービスのonCreateでこれを行います:

IntentFilter filter = new IntentFilter();
filter.addAction("Android.provider.Telephony.SMS_RECEIVED");
filter.addAction(Android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

そして、あなたのサービスのonDestroy

unregisterReceiver(receiver);

onCreateで言及したフィルターのブロードキャストを受信することをお勧めします。必要に応じて許可を追加してください。例えば.

<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
119
waqaslam

より良いパターンは、スタンドアロンBroadcastReceiverを作成することです。これにより、Serviceが実行されているかどうかに関係なく、アプリがブロードキャストに応答できるようになります。実際、このパターンを使用すると、常時実行されるServiceの必要性が完全になくなる可能性があります。

BroadcastReceiverをマニフェストに登録し、別のクラス/ファイルを作成します。

例えば:

<receiver Android:name=".FooReceiver" >
    <intent-filter >
        <action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

レシーバーが実行されると、IntentBundle)をServiceに渡し、onStartCommand()で応答します。

例えば:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
22
Paul Burke