#android #android-intent #dialog #broadcastreceiver
#Android #android-намерение #диалоговое окно #broadcastreceiver
Вопрос:
Итак, я пытаюсь разобраться с BroadcastReceivers и фильтрами намерений. У меня есть пользовательский диалог, который я создаю в MyActivity. В диалоговом окне у меня есть кнопка. При нажатии кнопки я хочу отправить широковещательную передачу, которую примет приемник MyActivity. Вот что у меня есть прямо сейчас:
//MyActivity.java
class myActivity extends Activity {
//MyDialog dialog initialized in onCreate
...
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//toast "Broadcast received"
}
}
}
//MyDialog.java
class MyDialog extends Dialog {
//m_context = incoming context from MyActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnCLickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("android.intent.action.RUN");
m_context.sendBroadcast(intent);
}
});
}
}
//AndroidManifest.xml
<activity android:name=".MyActivity" />
<receiver android:name="MyReceiver" android:enabled="true">
<intent-filter >
<action android:name="android.intent.action.RUN"/>
</intent-filter>
</receiver>
Когда я нажимаю button1, приложение выходит из строя. Кто-нибудь может направить меня в правильном направлении?
Ответ №1:
в MyActivity сделайте что-то вроде этого:
private BroadcastReceiver _refreshReceiver = new MyReceiver();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
IntentFilter filter = new IntentFilter("SOMEACTION");
this.registerReceiver(_refreshReceiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
this.unregisterReceiver(this._refreshReceiver);
}
и вызвать широковещательную передачу
Intent in = new Intent("SOMEACTION");
sendBroadcast(in);
Комментарии:
1. Ты качаешься. Спасибо за совет!
2. Эй, у меня это работало, но теперь это работает редко и нерегулярно. Знаете ли вы что-нибудь, что может помешать трансляциям?
3. Итак, теперь я пытаюсь обойти несколько трансляций и приемников, и это работает редко. Я хочу, чтобы трансляция диалогового окна выбиралась Activity1. Activity1 выполняет некоторые действия, а затем отправляет широковещательную рассылку для Activity2, чтобы забрать. Однако, когда я пытаюсь это сделать, ни одно из действий не получает широковещательную передачу. Я думаю, что опубликую код в новом вопросе.
4. решение, которое я ввел здесь, будет работать, только если загружено ваше действие, потому что код для регистрации и отмены регистрации объявлен в действии. Если вы хотите, чтобы ваш широковещательный приемник запускался каждый раз, когда вы его вызываете, вы должны объявить его в своем manifest.xml . Вот пример: vogella.de/articles/AndroidServices/article.html
Ответ №2:
Вероятно, было бы намного проще зарегистрировать вашего получателя в коде в методе onResume вашей активности (и отменить регистрацию в onPause).
BroadcastReceiver rec = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//Do stuff
}
};
IntentFilter filter = new IntentFilter("android.intent.action.RUN");
registerReceiver(rec, filter);
Комментарии:
1. Итак, весь этот фрагмент будет отправлен в onResume, и мне понадобится соответствующая отмена регистрации в onPause?
2. Он выходит из строя при загрузке MyActivity, когда я настраиваю его на onResume и onPause.
3. Трассировка стека? Этот метод работает хорошо. Я использую его в большинстве своих приложений.