着信SMSを監視しています。
私のアプリはBroadcastReceiver
で完璧に動作しています。ただし、アクティビティから動作しているため、BroadcastReceiver
を常に実行し続けたい(アクティビティの実行中だけでなく)。
どうすればこれを達成できますか? BroadcastReceiver
のライフサイクルを調べましたが、ドキュメントで言及されているのは、ライフサイクルがonReceive
をチェックするライフサイクルではなく、BroadcastReceiver
メソッドに限定されていることだけです着信SMS。
これを永続化するにはどうすればよいですか?
ありがとう
定義する必要があります 受信機 マニフェスト内でアクション名 Android.intent.action.BOOT_COMPLETED。
<!-- Start the Service if applicable on boot -->
<receiver Android:name="com.prac.test.ServiceStarter">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
完了したブート許可も必ず含めてください。
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>
このために Service を使用して、何かを永続化します。また、システムが起動した場合、レシーバーを使用して起動イベントを受信し、サービスを再起動します。
起動時にサービスを開始するためのコード。サービスにsmsなどのチェックを行うようにします。 MyPersistingService
で作業を行う必要があります。
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.util.Log;
public class ServiceStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent("com.prac.test.MyPersistingService");
i.setClass(context, MyPersistingService.class);
context.startService(i);
}
}
サービスまたはブートの完了は必須ではありません
実際、Service
を実装したり、Android.intent.action.BOOT_COMPLETED
に登録したりする必要はありません。
アクティビティの作成および破棄時にBroadcastReceiver
を登録/登録解除する方法の例をいくつか示します。ただし、これは、アプリが開かれたときにのみ予期する意図に対して役立ちます(たとえば、サービス/アクティビティ間の内部通信)。
ただし、SMSの場合は、常に(アプリを開いたときだけでなく)意図を聞いてください。
別の方法があります
class
を拡張するBroadcastReceiver
を作成し、AndroidManifest.xml
を介して目的のインテントに登録できます。このようにして、BroadcastReceiver
はアクティビティから独立します(アクティビティのライフサイクルに依存しません)
このように、アプリが閉じていてもAndroidが到着するとすぐにBroadcastReceiver
にSMSによって自動的に通知されます。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest>
...
<uses-permission Android:name="Android.permission.READ_SMS"/>
<uses-permission Android:name="Android.permission.RECEIVE_SMS"/>
<application>
....
<receiver Android:name=".MyCustomBroadcastReceiver">
<intent-filter>
<action Android:name="Android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
MyCustomBroadcastReceiver.Java
public class MyCustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent != null) {
String action = intent.getAction();
if(action != null) {
if(action.equals("Android.provider.Telephony.SMS_RECEIVED")) {
// DO YOUR STUFF
} else if (action.equals("ANOTHER ACTION")) {
// DO ANOTHER STUFF
}
}
}
}
}
メモ
他のインテントフィルターをAndroidManifestに追加し、それらをすべて同じBroadcastReceiver
で処理できます。
長いタスクを実行する場合にのみ、サービスを開始してください。通知を表示するか、データベースを更新するだけで、上記のコードを使用するだけです。