如何将结果数据从广播接收器发送到活动
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 异常