サービス内のブロードキャストレシーバー


90

BroadcastReceiver内でを起動しようとしていますService。私がやろうとしているのは、service着信テキストメッセージを収集し、着信通話をログに記録するバックグラウンド実行です。これを行う最善の方法は、serviceどちらかをカタログできる放送受信機を組み込んだランニングをすることです。

これを行うにはどうすればよいですか?サービスはすでに稼働しています。

回答:


127

サービスはすでにセットアップされているので、サービスにブロードキャストレシーバーを追加するだけです。

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" />

sendBroadcas(intent)を送信しているときにintent.setData(myUri)でデータを渡すことができず、その場合braoadcastReceiverが機能しないことに気付きましたか?
デッドフィッシュ2014年

BroadcastReceiver(私の場合はBroadcastReceiverをダウンロード)がある場合のサービスライフサイクルについて少し混乱します
Android Man

1
@waqaslamこのBroadcastReceiverをマニフェストに設定しましたか?
IgorGanapolsky 2015

2
@IgorGanapolskyいいえ、そのようなレシーバーをマニフェストに登録する必要はありません。
waqaslam 2015

2
@SayyedRizwanサービスとBroadcastReceiverは同じプロセスで実行され、おそらく同じスレッドで実行されます(新しいスレッドを作成しない限り)。バッテリーの消費量は、あなたのスレッド(バックグラウンド/フォアグラウンド)と入ってくる放送の量を定義した方法によって異なります。
waqaslam

24

より良いパターンはスタンドアロンを作成することBroadcastReceiverです。これにより、Serviceが実行されているかどうかに関係なく、アプリがブロードキャストに応答できることが保証されます。実際、このパターンを使用すると、常時実行する必要がServiceまったくなくなる可能性があります。

BroadcastReceiverマニフェストにを登録し、そのための別のクラス/ファイルを作成します。

例えば:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

レシーバーが実行されると、単にIntentBundle)をに渡し、でServiceそれに応答しonStartCommand()ます。

例えば:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

6
ブロードキャストがサービスのライフサイクル内にあるようにしたいので、アプリはサービスのタイムラインに従ってメッセージ/通話のみをクエリします。この方法はそれを可能にしますか?ブロードキャストの受信がサービスを開始するように設定したようです。
Utopia025

この実装は、Serviceまだ実行されていない場合はを開始し、実行されている場合Intentは(で取得するためにonStartCommand)新規に渡します。あなただけのときに実行したい場合はService、ライブでは、プログラムで有効化/無効化ができReceiverてコンポーネントをPackageManagerさんsetComponentEnabledSetting()
ポールバーク

4
Waqasの答えはReceiverServiceが実行されているときにのみ生きていることを望む場合、あなたの最良の選択肢かもしれません。
ポールバーク

3
:あなたが活動を持っていない場合、それはAPI 3.1と高いため動作しませんashimita.blogspot.com.tr/2012/04/...
elifの

1
Android 3.1以降、対応するアプリケーションがユーザーによって起動されたことがない場合、またはユーザーがAndroidメニューから明示的にアプリケーションを停止した場合、Androidシステムはデフォルトですべてのレシーバーがインテントを受信することを除外します。vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.