Ответ 1
registerMediaButtonEventReceiver требует, чтобы BroadcastReceiver был объявлен в манифесте приложения. Это означает, что приемник должен быть автономным классом, то есть он ничего не знает о вашей текущей деятельности или услуге.
Чтобы получить это сообщение в вашей деятельности или услуге, у вас есть несколько вариантов:
-
Используйте статический глобальный для активности или службы, чтобы получатель мог передать ему сообщение. Это, как правило, не очень хорошая идея, так как это приводит к утечкам и не очень адаптируется, когда вы хотите изменить код позже. Статики обычно следует избегать.
-
Повторно передайте сообщение определенному классу, который является внутренним классом активности или службы, которую вы хотите вызвать. Например. в BroadcastReceiver для registerMediaButtonEventReceiver:
// Standalone class, declared in the manifest public class ButtonReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { Intent intent = new Intent(); intent.setAction("com.foo.ACTION"); // Rebroadcasts to your own receiver. // This receiver is not exported; it'll only be received if the receiver is currently registered. context.sendBroadcast(intent); } }
И в вашей деятельности:
class MyActivity extends Activity {
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
MyActivity.this.onMessageReceived();
}
}
@Override
protected void onResume() {
registerReceiver(myReceiver, new IntentFilter("com.foo.ACTION"));
}
@Override
protected void onPause() {
unregisterReceiver(myReceiver);
}
private void onMessageReceived() {
}
}
- Подобно описанному выше методу, он не обязательно должен быть широковещательным, это может быть намерение, переданное в действие, в зависимости от вашего варианта использования. Для этого вместо использования sendBroadcast вы должны использовать startActivity (или startService, если вы используете службу).