Android BroadcastReceiver、ContentProvider 和 Activity 之间的数据流?

Posted

技术标签:

【中文标题】Android BroadcastReceiver、ContentProvider 和 Activity 之间的数据流?【英文标题】:Dataflow between Android BroadcastReceiver, ContentProvider, and Activity? 【发布时间】:2010-10-14 07:46:02 【问题描述】:

我开发了一个接收广播的应用程序,然后 启动Activity,其中Activity 查询ContentProvider 实时从 DNS 中提取信息。

我希望能够洗牌,而不是去:

BroadcastReceiver.onReceive() 
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);


Activity.onCreate() 
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);
  ...
  setContentView(...);

它去了:

BroadcastReceiver.onReceive() 
  Cursor = ContentProvider.query(...);
  if (cursor != null) 
     Intent intent = new Intent(...);
     // how do I pass the cursor?
     getContext().startActivity(intent);
  


Activity.onCreate() 
  // how do I retrieve the cursor?
  setContentView(...);

即如果query() 没有返回数据,我想错过启动 Activity,并允许广播消息正常通过。

如果 query() 确实返回数据,我希望将 Cursor 提供给 Activity,这样我就不用再去查询数据了。

反过来,Activity 有自己的用户界面,用户需要对其做出响应。

这可能吗?

【问题讨论】:

【参考方案1】:

你想要的有点困难,对我来说,效率很低。我建议您使用第一种替代方案,但是当您在活动中加载光标时,检查是否没有数据,然后退出活动。

BroadcastReceiver.onReceive() 
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);


Activity.onCreate() 
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);

  if(cursor.isEmpty() ...)
    finish();
    return;
  
  ...
  setContentView(...);

这将具有完全相同的效果,光标只会加载一次,并且只有在光标中存在某些内容时才会显示活动。唯一的额外开销是无论如何都会触发意图,但这并不完全是征税:)

请注意,不会有任何闪烁或任何东西,android 会处理在 onCreate() 中调用完成的情况(我相信 onStart 和 onResume 也是如此),因此用户永远不会知道它发生了。

【讨论】:

好的,听起来不错 - 但是 - 对 context.startActivity() 的调用何时返回? 我如何让 BroadcastReceiver 知道 Activity 是否做了任何有用的事情? AFAIK 我不能在 BroadcastReceiver 中使用 startActivityForResult()。 对 context.startActivity 的调用立即返回,本质上,它所做的只是安排活动在主事件线程空闲后立即启动。 嗯,这取决于您希望广播接收器做什么。在不知情的情况下,我建议您执行您计划让广播接收器在 Activity 中执行的任何操作。 我正在捕捉 NEW_OUTGOING_CALL 动作,但如果我启动 Activity,我必须将 BroadcastReceiver 的 returnData 设置为 null,否则调用会正常进行。如果我最终将出站调用放在 Activity 中,那么用户就不可能链接 BroadcastRecevers。【参考方案2】:

您需要找到或制作一个可序列化或可打包的游标(然后使用 intent.setExtra())。或者也许可以改为将所有数据作为一个包裹读取并将其传递给 Activity?

【讨论】:

这也是我的想法——可能是 Parcelable,因为 Activity 实际上是 ListActivity,所以我需要通过 ListAdapter 传递数据。

以上是关于Android BroadcastReceiver、ContentProvider 和 Activity 之间的数据流?的主要内容,如果未能解决你的问题,请参考以下文章

Android_组件_BroadcastReceiver基础

Android BroadcastReceiver广播:基本使用

Android -- BroadCastReceiver的简单使用

Android BroadcastReceiver

android从broadcastreceiver刷新listview

Android开发实践 BroadcastReceiver