Как я могу отправить данные результатов из Broadcast Receiver в Activity - PullRequest
10 голосов
/ 12 июля 2011

У меня есть активность, которая вызывает широковещательный приемник. Приемник вещания ждет и слушает GPS. Когда слушатель получает новую точку, я хочу отправить эту новую точку в Activity. Как отправить данные из Broadcast Receiver в Activity?

Мне нужен слушатель в моей деятельности, ожидающий ответа от Broadcast Receiver. Как я могу это сделать?

Ответы [ 4 ]

22 голосов
/ 08 марта 2013

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

Вы абстрагируете получателя:

public abstract class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
           //Add you receiver logic here
           ...
           ...
           onNewPosition();
        }

    protected abstract void onNewPosition();

}

В своей деятельности:

public class MyActivity extends Activity {

    private smsReceiver smsReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_one_position);
        smsReceiver = new smsReceiver() {

            // this code is call asyncrously from the receiver
            @Override
            protected void onNewPosition() {
            //Add your activty logic here
            }

        };
        IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        intentFilter.setPriority(999);
        this.registerReceiver(smsReceiver, intentFilter);

    }

     @Override
        protected void onPause() {
            super.onPause();
            this.unregisterReceiver(this.smsReceiver);
        }

}

Надеюсь, это поможет вам ...

4 голосов
/ 13 июля 2011

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

public interface OnNewLocationListener {
public abstract void onNewLocationReceived(Location location);

}

в классе «Мой приемник», который называется ReceiverPositionAlarm:

// listener ----------------------------------------------------

static ArrayList<OnNewLocationListener> arrOnNewLocationListener =
        new ArrayList<OnNewLocationListener>();

// Allows the user to set an Listener and react to the event
public static void setOnNewLocationListener(
        OnNewLocationListener listener) {
    arrOnNewLocationListener.add(listener);
}

public static void clearOnNewLocationListener(
        OnNewLocationListener listener) {
    arrOnNewLocationListener.remove(listener);
}

// This function is called after the new point received
private static void OnNewLocationReceived(Location location) {
    // Check if the Listener was set, otherwise we'll get an Exception when
    // we try to call it
    if (arrOnNewLocationListener != null) {
        // Only trigger the event, when we have any listener
        for (int i = arrOnNewLocationListener.size() - 1; i >= 0; i--) {
            arrOnNewLocationListener.get(i).onNewLocationReceived(
                    location);
        }
    }
}

и одним из методов моей деятельности:

OnNewLocationListener onNewLocationListener = new OnNewLocationListener() {
        @Override
        public void onNewLocationReceived(Location location) {
            // do something

            // then stop listening
            ReceiverPositioningAlarm.clearOnNewLocationListener(this);
        }
    };

    // start listening for new location
    ReceiverPositioningAlarm.setOnNewLocationListener(
            onNewLocationListener);
3 голосов
/ 12 июля 2011

у вас есть несколько способов сделать это и несколько соображений.

  1. вы можете опрашивать, то есть проверять каждый раз снова используя любой обработчик или Таймер, чтобы узнать, поступила ли информация.

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

  3. вы можете сделать так, чтобы Broadcast отправлял Intent в ваш класс с информацией, но если ваша деятельность не на переднем плане, вы можете перенести ее туда, и это не на 100% то, что вы хотите ...

Что касается некоторых соображений, BroadCastReciver, в основном, используется в качестве слушателя, а не уведомителя, а именно внутреннего класса. На мой взгляд, это лучшая практика для использования с деятельностью. Для служб вы можете использовать его в качестве отдельного класса и зарегистрировать его в манифесте. .xml ... Теперь вы должны помнить, что во время трансляции ваша активность может быть неактивной из-за изменения ориентации или события, которое приостанавливает ваше приложение, поэтому вы можете пропустить событие. я не слушаю системные события, а собственные события, поэтому я использую липкую трансляцию, чтобы предотвратить эту проблему.

0 голосов
/ 12 июля 2011

Просто нужно внедрить приемник вещания в активность.зарегистрируйте получателя в контексте действия.

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