Intent & BroadcastReceiver - PullRequest
       4

Intent & BroadcastReceiver

1 голос
/ 20 сентября 2010

Я начинаю изучать разработку Android, так что мои знания на данный момент действительно ограничены. Я пытаюсь играть с трансляциями, но я застрял и не могу понять, что я делаю неправильно. То, что я пытаюсь сделать, это просто показать простой тост с приемника вещания.

Намерение - это пользовательское намерение, определенное в манифесте:

<receiver android:name=".receiver.SendReceiver" android:enabled="true">
     <intent-filter>
   <action android:name="com.android.terralink.sem.SOCCIA"></action>
     </intent-filter>
</receiver>

Приемник определяется так:

public class SearchReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent){
   Toast.makeText(context, "asasa", Toast.LENGTH_SHORT).show();
   }
}

В первом действии, вызванном из приложения, я делаю это:

Intent i2 = new Intent(this, SearchReceiver.class);
i2.setAction(CUSTOM_INTENT);
sendBroadcast(i2);

Я проверил, что код Toast работает в Activity, но не в трансляции. Это потому, что Тост не может быть показан в контексте получателя?

Кроме того, еще один вопрос, касающийся структуры приложений для Android. Если из моей Activty я разрешаю пользователю вставлять строку в текстовое поле и отправлять (связывание кнопок), и я хочу, чтобы приложение выполняло поиск в фоновом режиме и уведомляло пользователя, как только результат будет готов, правильно ли делать следующее? 1) Основная активность с окном поиска 2) Запустите Сервис, который извлекает данные, отправляет трансляцию 3) Получатель уведомляет пользователя и открывает действие, которое показывает результат

Имеет ли смысл делать что-то подобное? Или уведомление должно быть сделано самой службой, прежде чем закончить свою работу?

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Я обнаружил, что проблема была в манифесте, когда я зарегистрировал получателя. На самом деле можно показать тост в приемнике без каких-либо проблем. Приветствия

0 голосов
/ 29 августа 2011

Чтобы показать тост из вещательного приемника, мы можем использовать следующий код:

public class ServiceReceiver extends BroadcastReceiver {

    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        MyPhoneStateListener phoneListener = new MyPhoneStateListener();
        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    private class MyPhoneStateListener extends PhoneStateListener {

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                Toast.makeText(context, "Idle call", Toast.LENGTH_LONG).show();
                Log.d("***************************DEBUG", "IDLE");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d("***************************DEBUG", "OFFHOOK");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Toast.makeText(context, "Ringing call", Toast.LENGTH_LONG)
                        .show();
                Log.d("***************************DEBUG", "RINGING");
                break;
            }
        }
    }
}
0 голосов
/ 20 сентября 2010

Невозможно отобразить тост в приемнике вещания. Android обычно закрывает ваш процесс после завершения вызова onReceive () (для которого в настоящее время разрешено занимать не более 10 секунд). Поскольку тост отображается асинхронно, я думаю, что его контекст уничтожается еще до того, как он отображается.

В качестве альтернативы Toast вы можете взглянуть на концепцию RemoveViews для обновления пользовательского интерфейса в другом процессе из получателя. Или запустите действие, которое показывает тост и немедленно закрывается.

По вашему вопросу № 2 я предлагаю вам продолжить работу после нажатия кнопки поиска и запустить AsyncTask для поиска, который обновляет результаты поиска по мере их поступления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...