3

ヘッドセットのボタンを押すとアプリに認識されるようになりましたが、ボタンの 1 つは MyCustomActivity にあるメソッドを呼び出す必要があります問題は、onReceive の最初のパラメーターが Context であり、Activity にキャストできないため、BroadcastReceiver を MyCustomActivity 内の内部クラスとして実装する必要があることです。

ここまでは順調ですが、この内部 MediaButtonEventReceiver をマニフェストに登録するにはどうすればよいですか?

独立したクラスの場合、これは簡単でした:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

MyCustomActivity の mReceiver で同じことを行うためのトリック/構文は何ですか?

  private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         // ...
        }
  }
4

2 に答える 2

5

アクティビティの一部であることが意図されている場合は、動的に登録しません。

BroadcastReceiver receiver;

@Override
protected void onCreate (Bundle b)
{
  super.onCreate (b);
  IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);    
  filter.setPriority(10000);  
  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context ctx, Intent intent) {
      // ...
    }
  };
  registerReceiver (receiver, filter);
}

次に、登録を解除することを忘れないでくださいonPause()(リークを避けるため)。

@Override
protected void onPause()
{ 
  try{
    unregisterReceiver (receiver);
  }
  catch (IllegalStateException e)
  {
    e.printStackTrace();
  }
  super.onPause();
}

ただし、この動的な登録は、アクティビティがフォアグラウンドにない場合、ボタンが機能しないことを意味します。代わりに登録解除を試すこともできますがonDestroy()、リークを回避する最も確実な方法はonPause().

または、ボタンを何があっても応答させるには、サービスを作成し、受信者を登録することを検討してください。

于 2013-02-25T01:22:36.970 に答える
1

ここまでは順調ですが、この内部 MediaButtonEventReceiver をマニフェストに登録するにはどうすればよいですか?

できません。registerReceiver()ただし、アクティビティを呼び出すことで動的に登録できます。

于 2013-02-25T01:21:15.260 に答える