【问题标题】:How can I send result data from Broadcast Receiver to Activity如何将结果数据从广播接收器发送到活动
【发布时间】:2011-07-12 09:06:31
【问题描述】:

我有一个调用广播接收器的活动。广播接收器等待并监听 GPS。当侦听器获得新点时,我想将该新点发送给 Activity。如何将数据从广播接收器发送到活动?

我的活动中需要一个监听器来等待广播接收器的响应。我该怎么做?

【问题讨论】:

    标签: android android-activity broadcastreceiver response


    【解决方案1】:

    您可以从您的活动中呼叫接收方。如果您不想在活动中添加接收器的逻辑,您可以使用抽象接收器。

    你抽象的接收者:

    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);
            }
    
    }
    

    希望对你有帮助……

    【讨论】:

    • 你将如何实例化抽象类?
    【解决方案2】:

    我为我的接收器定义了一个监听器并在活动中使用它,它现在运行完美。以后有可能出问题吗?

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

    }

    在我的接收器类中被命名为 ReceiverPositioningAlarm:

    // 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】:

    您有几种方法可以做到这一点,并有几个考虑因素。

    1. 您可以轮询,这意味着使用任一 Handler 每隔一段时间再次检查一次 或计时器以查看信息是否已到达。

    2. 您可以将广播接收器注册为您的活动的内部类,然后您可以在您的活动中调用方法。

    3. 您可以让广播将 Intent 与信息一起发送到您的班级,但如果您的活动不在前台,您可能会将其带到那里,这不是您想要的 100%...

    考虑到一些考虑,BroadCastReciver 主要用作侦听器,而不是 notider 内部类,在我看来,与活动一起使用是最佳实践,对于服务,您可以将其用作独立类并在清单中注册.xml... 现在您必须记住,当广播正在广播时,您的 Activity 可能由于方向更改或暂停您的应用程序的事件而处于非活动状态,因此您可能会错过该事件。我不听系统事件,而是听我自己的事件,所以我使用粘性广播来防止这个问题。

    【讨论】:

    • 谢谢。在第三个解决方案中,我怎样才能得到那个意图。你能解释一下吗?
    • 当然。您使用 context.startActivity() 发送意图,您可以通过以下两种方式之一在活动中获取意图,使用 onCreate 或 onResume 中的 getIntent 方法或 onNewIntent 覆盖方法。问题是您的活动是否重新启动,您可以在 Activity java doc 和 Intent java doc 中阅读更多相关信息,特别是处理 Intent 标志 (SINGLE_TOP)
    • 你已经决定使用监听器模式,它可以正常工作,对我有用但是不要忘记'如果你的一个监听器是一个活动,如果你得到方向或其他,你会泄露上下文导致应用程序终止并重新创建的配置更改事件,在这种情况下,您必须更改 onResume 和 onPause 代码(或在 Create 和 onDestroy 上),这将删除侦听器并在活动返回后将其重新打开。
    • 哦,在活动返回并再次设置监听器后,您必须检查您是否没有错过在那段时间发生的任何事件......
    【解决方案4】:

    只需要在activity中实现广播接收器即可。使用活动的上下文注册接收者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多