2016-06-28 152 views
1

查看Android源代码时,我观察到了获取包含结果额外数据的Bundle的两种常用方法。BroadcastReceiver.getResultsExtra()与Intent.getExtras()

A.呼吁getResultsExtra()

private class StatusBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle b = getResultExtras(true); 
    } 
} 

B.呼吁intent.getExtras()

private class StatusBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle b = intent.getExtras(); 
    } 
} 

为什么你会选择通过另一种方法一种方法?是否有某些情况下优先于其他方法?它们是否相同?

回答

1

getResultExtras()这样使用:

Bundle results = getResultExtras(true); 
results.putString("someTag", "someValue"); 

到不同的接收器之间共享信息/值

所以,如果你把一些值或返回地图从getResultExtra变化()在某些BroadcastReceiver中,它将按照docs

发送到下一个接收器。检索当前结果的额外数据,由前一个接收器设置。您对返回的地图所做的任何更改都会传播到下一个接收器。

,另一方面 intent.getExtras()

返回使用intent.putExtra()同时开始广播意图演员中设置的值,例如这样的:

Intent intent = new Intent(); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
intent.setAction("com.yourpackage.BroadcastReceiver"); 
intent.putExtra("someTag", "someValue"); 
sendBroadcast(intent); 
+0

所以,如果我不改变任何值,并且是只对阅读价值感兴趣,两者相当? – GrandAdmiral

+0

啊,不。如果getResultExtras(bool)中的bool设置为true,那么您将获得前一个接收器发送的值(映射)(如果前一个映射为null,则返回新的空映射),如果设置为false,则返回空映射。而intent.getExtras()只有在使用'sendBroadcast(intent);'开始广播时设置的值。所以getResultExtras(bool)将不会有intent.getExtras()所具有的值! –

1

因为您可以修改要发送到下一个广播接收机的结果集,所以当您使用“Context.sendOrderedBroadcast”发送有序广播时,“BroadcastReceiver.getResultExtras”方法很有意义(请记住,当您发送一个命令广播中,接收器被称为同步母板,而不是公共广播“Context.sendBroadcast”的异步母板)。考虑到这一点,假设你有3个接收者,并且向他们发送了一个有序的广播(假设你把广播1的优先级作为第一个,然后接收者),那么接收者1可以用“BroadcastReceiver.getResultExtras “方法并添加一些值,当广播到达该值时接收器2将看到该值,等等。 “Intent.getExtras()”只会为您提供广播接收器的Intent的额外值。