서비스 내 브로드 캐스트 수신기


90

내에서 시작하려고 BroadcastReceiver합니다 Service. 내가하려는 것은 service수신 문자 메시지를 수집하고 수신 전화를 기록 하는 백그라운드를 실행하는 것입니다. 이 문제를 해결하는 가장 좋은 방법은 service둘 중 하나를 분류 할 수있는 브로드 캐스트 수신기를 통합하는 실행을하는 것입니다.

어떻게해야합니까? 이미 서비스를 실행하고 있습니다.

답변:


127

서비스가 이미 설정되었으므로 서비스에 broadcast receiver를 추가하기 만하면됩니다.

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가 작동하지 않는다는 것을 알았습니다. 맞습니까?
deadfish 2014

BroadcastReceiver (내 경우에는 BroadcastReceiver 다운로드)가있을 때 서비스 수명주기에 대해 거의 혼동하지 않습니다.
Android Man

1
@waqaslam 매니페스트에이 BroadcastReceiver를 설정 했습니까?
IgorGanapolsky

2
@IgorGanapolsky 아니요, 이러한 수신기를 매니페스트에 등록 할 필요가 없습니다.
waqaslam

2
@SayyedRizwan 귀하의 서비스와 BroadcastReceiver는 동일한 프로세스 및 대부분 동일한 스레드에서 실행됩니다 (새 스레드를 생성하지 않는 한). . 배터리 소모는 스레드 (배경 / 전경)과 오는 방송의 양을 정의한 방법에 따라 달라집니다
waqaslam

25

더 나은 패턴은 독립형 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();
    }   
}

6
방송이 서비스의 수명주기 내에 있기를 원하므로 앱이 서비스 타임 라인에 따라 메시지 / 전화 통화 만 쿼리합니다. 이 방법으로 가능합니까? 방송 수신이 서비스를 시작하도록 설정 한 것 같습니다.
Utopia025 2012

이 구현은 Service아직 실행 중이 지 않은 경우를 시작 하거나 실행중인 Intent경우 새를 전달합니다 (에서 검색 용 onStartCommand). 당신은 단지이 때 실행하려는 경우 Service라이브, 당신은 프로그램 활성화 / 비활성화 할 수 Receiver관통 구성 요소 PackageManagersetComponentEnabledSetting().
Paul Burke 2012

4
Waqas의 대답 은 실행 중일 Receiver때만 살아있는 것을 원한다면 최선의 선택이 될 수 있습니다 Service.
Paul Burke 2012

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.