如何将结果数据从广播接收器发送到活动

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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】:

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

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

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

    您可以让广播将 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中实现广播接收器即可。使用活动的上下文注册接收者。

【讨论】:

以上是关于如何将结果数据从广播接收器发送到活动的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息/数据从广播接收器(process1)发送到android中的服务线程(process2)?

如何在通过广播接收器将 JobIntentService 之间的数据传递给活动时防止 TransactionTooLarge 异常

从通知中发送数据

来自哪个活动的广播接收器的上下文信息?

如何使用警报管理器将数据从片段传递到广播接收器

从广播接收器android调用活动方法?