Как мне отправить отправку (намерение) из MyDialog и получить в MyActivity?

#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. Трассировка стека? Этот метод работает хорошо. Я использую его в большинстве своих приложений.