Я видел несколько примеров того, как реализовать BroadCastReceiver, но как мне реализовать Сервис, который должен реагировать на некоторые ожидающие намерения (например, входящий телефонный звонок) ... На самом деле мне было интересно одна и та же «проблема», но в действии. . У вас, очевидно, есть класс, который расширяет Сервис или Активность), поэтому он не может также расширить BroadCastReceiver ... Похоже, что мы не можем использовать «поддерживаемые платформой» службы и/или Activties?Сервис и BroadCastReceiver
ответ
Для регистрации активности получить определенное намерение вам нужно:
// Flag if receiver is registered
private boolean mReceiversRegistered = false;
// I think this is the broadcast you need for something like an incoming call
private String INCOMING_CALL_ACTION = "android.intent.action.PHONE_STATE";
// Define a handler and a broadcast receiver
private final Handler mHandler = new Handler();
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Handle reciever
String mAction = intent.getAction();
if(mAction.equals(INCOMING_CALL_ACTION) {
// Do your thing
}
}
@Override
protected void onResume() {
super.onResume();
// Register Sync Recievers
IntentFilter intentToReceiveFilter = new IntentFilter();
intentToReceiveFilter.addAction(INCOMING_CALL_ACTION);
this.registerReceiver(mIntentReceiver, intentToReceiveFilter, null, mHandler);
mReceiversRegistered = true;
}
@Override
public void onPause() {
super.onPause();
// Make sure you unregister your receivers when you pause your activity
if(mReceiversRegistered) {
unregisterReceiver(mIntentReceiver);
mReceiversRegistered = false;
}
}
Тогда вам необходимо будет также добавить пристальный фильтр для манифеста:
<activity android:name=".MyActivity" android:label="@string/name" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</activity>
вы можете создать внутренний класс
class A extends Activity {
BroadcastReceiver r = new BroadcastReceiver(){
// code to handle broadcase
}
}
, что класс будет получать события, которые вы можете перейти к главному обработчиком, или просто называют некоторые внешние методы
Требуется ли быть внутренним классом? – n611x007
На самом деле вы можете реагировать на входящий телефонный звонок, просто добавив слушателя TelephonyManager
Вы определяете PhoneStateListener в вашей услуге/деятельности
private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_RINGING:
break;
case TelephonyManager.CALL_STATE_IDLE:
break;
}
}
};
Тогда в OnCreate метод:
mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
Окончательно вы очищаете слушателя в onDestroy:
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
В этом случае намного проще.
, если вы создаете новый экземпляр BroadcastReceiver, а затем зарегистрируете его в своем коде, предоставляя объект фильтра намерения, который вам не нужен, чтобы создать <намерение-фильтр> в определении вашей деятельности в файле манифеста. – hara