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
が実行されているときにのみ生きていることを望む場合、あなたの最良の選択肢かもしれません。