9

BroadCastReceiver を実装する方法の例をいくつか見てきましたが、保留中のインテント (電話の着信など) に反応する必要があるサービスをどのように実装すればよいでしょうか... 実際、同じ「問題」について疑問に思っていましたが、アクティビティ..明らかにサービスまたはアクティビティを拡張するクラスがあるため、BroadCastReceiverも拡張できません...「プラットフォーム対応」のサービスやアクティビティを作成できないようですか?

4

3 に答える 3

12

特定のインテントを受け取るアクティビティを登録するには、次のことを行う必要があります。

// 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>
于 2010-06-02T15:46:58.533 に答える
4

内部クラスを作成できます

class A extends Activity {
 BroadcastReceiver r = new BroadcastReceiver(){
   // code to handle broadcase
 }
}

そのクラスはイベントを受け取り、それをメイン ハンドラーに渡すか、いくつかの外部メソッドを呼び出すことができます

于 2010-06-02T15:45:19.283 に答える
4

実際、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);

この場合、はるかに簡単です。

于 2011-01-27T21:53:44.560 に答える