2012-02-01 9 views
74

Service 내에서 BroadcastReceiver을 시작하려고합니다. 내가 뭘 하려는지 들어오는 문자 메시지를 수집하고 들어오는 전화를 기록 service 실행하는 배경을 가지고 있습니다. 나는 이것에 대해 가장 좋은 방법은 service을 실행하는 것이고, 그 중 하나는 카탈로그를 방송 할 수있는 방송 수신기를 통합하는 것이라고 생각했습니다.서비스 내의 브로드 캐스트 리시버

어떻게해야합니까? 나는 이미 내 서비스를 운영하고있다. 서비스가 설정이 이미으로

답변

106

, 단순히 서비스의 방송 수신기를 추가

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); 

당신은 방송을 수신하기 위해 어떤 전자 메일을 보내고 좋은가요? 당신이 onStartCommand에 언급 한 ver 필터. 필요한 경우 모든 권한을 추가하십시오. 예를 들어

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
+0

내가 토스트 메시지 수신 전화 동안 표시 할. 나는이 필터를 추가했다. addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); 토스트 쇼를하는 방법. – Prasad

+0

sendBroadcas (intent)를 보내면서 intent.setData (myUri)에 의해 데이터를 전달할 수 없다는 사실을 눈치 채 셨습니다. 그런 경우에는 braoadcastReceiver가 작동하지 않습니다. 그렇습니까? – deadfish

+0

BroadcastReceiver (내 경우 BroadcastReceiver 다운로드)가있을 때 서비스 수명주기에 대해 약간 혼동 스럽습니다 –

23

더 좋은 패턴은 독립형 BroadcastReceiver을 만드는 것입니다. 이렇게하면 Service이 실행 중인지 여부에 관계없이 앱이 방송에 응답 할 수 있습니다. 사실,이 패턴을 사용하면 일정한 실행을 위해 Service이 필요하지 않을 수 있습니다.

매니페스트에 BroadcastReceiver을 등록하고 별도의 클래스/파일을 만듭니다.

예 : 수신기가 실행되면

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

, 당신은 단순히 ServiceIntent (Bundle)를 통과하고, onStartCommand()에 응답합니다.

예는 :

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

브로드 캐스트를 서비스의 수명주기 내에있게하여 앱이 서비스 타임 라인에 따라 메시지/전화 통화 만 쿼리하도록합니다. 이 방법으로 활성화 할 수 있습니까? 당신이 방송을 받으면서 서비스를 시작하도록 설정 한 것처럼 보입니다. – Utopia025

+0

이 구현은'Service'가 이미 실행 중이 아니면'Intent'를 전달합니다 (onStartCommand'에서 검색). 'Service'가 생방송 일 때만 실행하고 싶다면'PackageManager'의'setComponentEnabledSetting()'을 통해'Receiver' 구성 요소를 프로그래밍 방식으로 활성화/비활성화 할 수 있습니다. –

+3

Waqas의 대답은'Service'가 실행 중일 때'Receiver'가 살아 있기만하면 좋을 것입니다. –

관련 문제