2013-02-25 2 views
3

I managed, чтобы мои кнопки гарнитуры распознавались моим приложением при нажатии, но одной из кнопок нужно вызвать метод, который находится в MyCustomActivity. Проблема состоит в том, что первый параметр onReceive - это Контекст, который нельзя передать в Activity, и поэтому я вынужден реализовать свой BroadcastReceiver как внутренний класс внутри MyCustomActivity.Как зарегистрироваться в манифесте * inner * MEDIA_BUTTON BroadcastReciver?

Пока все хорошо, но как зарегистрировать этот внутренний MediaButtonEventReceiver в манифесте?

Для самостоятельного класса, это было просто:

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

Какой трюк/синтаксис, чтобы сделать то же самое для mReceiver MyCustomActivity в?

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

ответ

4

Вы этого не сделаете, если это означало быть частью деятельности, вы регистрируете его динамически:

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().

В качестве альтернативы, чтобы кнопка реагировала независимо от того, подумайте о том, чтобы сделать службу, и зарегистрировать ваш ресивер.

+0

Спасибо! Я подумал, что я пробовал это, но, увидев, что новый метод BroadcastReceiver() снова создан в onCreate(), я собираюсь попробовать это еще раз и сообщить, как он работает. +1 на данный момент. – an00b

+0

Странно. Я пробовал этот подход, но по какой-то причине он не работает. Что мне не хватает? – an00b

+1

@ an00b вы покидаете мероприятие? Помните, что мы не регистрируемся в 'onPause()', чтобы избежать утечки. Также не работает, как в компиляции, но ничего не делает при запуске?Я пересчитываю тост в 'onReceive()', чтобы проверить, вообще ли вызван приемник. –

1

До сих пор так хорошо, но как я могу зарегистрировать этот внутренний MediaButtonEventReceiver в манифесте?

Вы не можете. Вы можете зарегистрировать его динамически, позвонив по адресу registerReceiver().

+0

Ouch! Я подумал, что так будет, поэтому я попробовал наконечник [здесь] (http://stackoverflow.com/a/4805733/636571), но по какой-то причине он не сработал. Должен ли я 'new BroadcastReceiver()' в onCreate() или могу ли я это сделать при инициализации личного члена данных mReceiver? – an00b

+0

@ an00b: В любом случае работает. Обычно я настраиваю частный элемент данных для получателя. – CommonsWare

+0

личный член данных для получателя, это то, что у меня есть, но ни один из двух подходов не работает. Возможно, мне не хватает чего-то простого, но я не знаю, что это. Нажатие клавиш не направляется на мой внутренний приемник, как в автономном. – an00b

Смежные вопросы