0

我想知道如何在没有广播接收器的情况下在服务和活动之间传递数据。

这是我做不到的:

  1. 我有一个通过广播定期发送意图的服务。
  2. 我想在需要时从活动中获取此意图的额外内容,而无需等待广播接收器。

我尝试使用此代码:

  \\Service
  String BROADCAST_ACTION = "ACTION";
  Intent sendToUI = new Intent(BROADCAST_ACTION);
  sendToUI.putExtra("key", "value");
  sendBroadcast(sendToUI);


  \\Activity
  IntentFilter iF = new IntentFilter(MyService.BROADCAST_ACTION);
  Intent intent = c.registerReceiver(null, iF);
  Bundle extras = intent.getExtras();
  if(extras != null){
      String string = intent.getStringExtra("key");
 }

但我得到一个nullpointerexception因为intent总是null(我nullpointerexception不是在捆绑附加服务中,而是在Intent intent排队中)。

4

2 回答 2

4

为了做到这一点,您定期发送的广播必须“闲逛”,以便活动可以在需要时获取它。

在您的服务中,您需要将此广播作为“粘性”发送,如下所示:

// Service
String BROADCAST_ACTION = "ACTION";
Intent sendToUI = new Intent(BROADCAST_ACTION);
sendToUI.putExtra("key", "value");
sendStickyBroadcast(sendToUI);

您必须拥有 BROADCAST_STICKY 权限才能使用此 API。如果您不持有该权限,则会抛出 SecurityException。

编辑:为 Activity 添加代码以读取它:

// Activity
IntentFilter iF = new IntentFilter(MyService.BROADCAST_ACTION);
Intent intent = c.registerReceiver(null, iF);
if (intent != null && intent.hasExtra("key")) {
    String string = intent.getStringExtra("key");
    // Now do something with it...
}

另外,我建议您更改用于“MyService.BROADCAST_ACTION”的字符串以包含您的完全限定包名称。这是因为如果您只使用“ACTION”,可能还有其他应用程序也在发送粘性使用该操作进行广播,您将无法确保获得您想要的那个(即:您的服务发送的那个)。使用这样的东西(在您的服务类中):

String BROADCAST_ACTION = "com.mycompany.myapplication.ACTION";
于 2012-07-10T11:07:04.223 回答
0

试试这个

extras.getStringExtra("key");

你用过吗

    @Override
    public void onReceive(Context context, Intent intent) {
    }
于 2012-07-10T10:59:07.657 回答