在安卓系统中,什么是更快的通讯、发送广播VS直接调用活动的方法



在我的应用程序中,我必须从片段中调用一个活动方法。

我知道我可以通过两种方式做到这一点:

1.通过向活动发送广播:

Intent intent = new Intent("FILTER"); intent.putExtra("EXTRA", 1); sendBroadcast(intent);

2.或者直接调用活动方法:

((MyActivity) getActivity()).method();

我想知道哪种沟通方式更快、更安全。如有任何帮助,我们将不胜感激。

谢谢。

松散耦合片段

我不确定速度。但从设计的角度来看,您应该使用接口与Activity通信,而不是直接从Fragment调用Activity方法。即((MyActivity) getActivity()).method();

因为使用接口使您的Fragment独立于活动假设将来你想在Some中使用你的碎片其他活动,则您无需更改碎片

接口

public interface Somelistener {
public void someMethod();
}

您的松散耦合片段

YourFragment extends Fragment {
Somelistener listener;
public void onActivityCreated(Context context){
listener = (SomeLisner)context;
}
public void buttonClick()
{
listener.someMethod();
}
}

因此,如果您在MainActivity中使用没有问题

MainActivity implements SomeListener{
@Override
public void someMethod()
{
// Activity method
}
}

将来您希望在SomeOtherActivity中使用Fragment没有问题

SomeOtherActivity implements SomeListener{
@Override
public void someMethod()
{
// somethother method
}
}

广播接收器方法
TBH我见过这种服务活动沟通方法。不适用于活动-片段通信。

对于Fragments和包含它的Activity之间的通信,实际上有一个更好的第三选项。

更好的选择是使用接口作为回调方法。本文档对此进行了很好的描述:https://developer.android.com/training/basics/fragments/communicating

使用接口比使用两种方法更可取,因为它既安全又高效。

对于您使用广播接收器的第一种方法,这实际上是一种效率非常低的解决方案,因为广播接收器不适合您所追求的任务。

让我引用Android文档中的一些内容:

警告:限制您在应用程序中设置的广播接收器数量。广播接收器过多可能会影响应用程序的性能和用户设备的电池寿命。有关可以用来代替BroadcastReceiver类来安排后台工作的API的更多信息,请参阅后台优化。https://developer.android.com/guide/topics/manifest/receiver-element

因此,与您建议的其他方法和我建议的方法相比,广播接收器对应用程序的性能和设备的电池寿命的影响更大。

此外,不要忘记广播接收器是用来收听广播的。您在示例中使用的广播接收器类型实际上是全局广播,您没有明确限制其"范围",因此任何广播接收器都可能"收听"您的广播。就安全性而言,使用这样的全球广播也不安全。

你也不希望其他应用程序可能会触发与你的应用程序的广播接收器不谋而合的广播,导致它接收不适合它的数据,并因这种意外和巧合的命名而崩溃。

老实说,以一种不适合的方式使用广播接收器还有更多潜在的问题。

至于直接调用Activity方法的第二种方法。。。这对于管理代码来说实际上是非常低效的。你基本上是把碎片和特定的活动紧密地联系在一起。

然而,碎片在设计上使交换到其他活动或碎片变得很常见。。。基本上,每次要从父级运行代码时,都必须执行多个if statementscasts

此外,请记住,如果您稍后在MyActivity中更改代码,可能会导致该片段出现问题,因为您忘记了它与Activity的绑定有多紧密。

但是,如果你使用更喜欢的回调接口方法,它只是一个中间人,旨在传递"嘿,为我做点什么"的信息。快速而直接。它对以后要附加此片段的任何活动或片段也很友好,因为这些活动或片段只需实现接口,并且父级和子级之间的回调桥就形成了。

最好使用接口从片段到活动进行通信,而不是使用本地广播。活动将实现接口,片段将调用方法。

最新更新