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();
}
}
Serviceまだ実行されていない場合はを開始し、実行されている場合Intentは(で取得するためにonStartCommand)新規に渡します。あなただけのときに実行したい場合はService、ライブでは、プログラムで有効化/無効化ができReceiverてコンポーネントをPackageManagerさんsetComponentEnabledSetting()。
Receiver、Serviceが実行されているときにのみ生きていることを望む場合、あなたの最良の選択肢かもしれません。