web-dev-qa-db-ja.com

Android起動時にBroadcastReceiver-アクティビティがバックグラウンドにあるときに実行を継続する

着信SMSを監視しています。

私のアプリはBroadcastReceiverで完璧に動作しています。ただし、アクティビティから動作しているため、BroadcastReceiverを常に実行し続けたい(アクティビティの実行中だけでなく)。

どうすればこれを達成できますか? BroadcastReceiverのライフサイクルを調べましたが、ドキュメントで言及されているのは、ライフサイクルがonReceiveをチェックするライフサイクルではなく、BroadcastReceiverメソッドに限定されていることだけです着信SMS。

これを永続化するにはどうすればよいですか?

ありがとう

51
RasberryPoptart

定義する必要があります 受信機 マニフェスト内でアクション名 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);
    }
}
142
Javanator

サービスまたはブートの完了は必須ではありません

実際、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で処理できます。

長いタスクを実行する場合にのみ、サービスを開始してください。通知を表示するか、データベースを更新するだけで、上記のコードを使用するだけです。

7
W0rmH0le