BroadcastReceiver
内でService
を起動しようとしています。私がやろうとしているのは、バックグラウンドでservice
を実行して着信テキストメッセージを収集し、着信通話を記録することです。これを実行する最善の方法は、service
を実行することで、どちらかをカタログ化できるブロードキャストレシーバーを組み込むことです。
これを行うにはどうすればよいですか?すでにサービスを実行しています。
サービスは既にセットアップされているので、サービスにブロードキャストレシーバーを追加するだけです。
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" />
より良いパターンは、スタンドアロンBroadcastReceiver
を作成することです。これにより、Service
が実行されているかどうかに関係なく、アプリがブロードキャストに応答できるようになります。実際、このパターンを使用すると、常時実行されるService
の必要性が完全になくなる可能性があります。
BroadcastReceiver
をマニフェストに登録し、別のクラス/ファイルを作成します。
例えば:
<receiver Android:name=".FooReceiver" >
<intent-filter >
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
レシーバーが実行されると、Intent
(Bundle
)をService
に渡し、onStartCommand()
で応答します。
例えば:
public class FooReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// do your work quickly!
// then call context.startService();
}
}