通信、发送广播 VS 直接在 Android 中调用 activity 方法哪个更快?

What is faster Communicating, sending broadcast VS calling activity method directly in Android?

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

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

1.通过向 activity 发送广播:

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

2。或者直接调用activity方法:

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

我想知道哪种通讯方式更快更安全。任何帮助将不胜感激。

谢谢。

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

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

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

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

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

Warning: Limit how many broadcast receivers you set in your app. Having too many broadcast receivers can affect your app's performance and the battery life of users' devices. For more information about APIs you can use instead of the BroadcastReceiver class for scheduling background work, see Background Optimizations. https://developer.android.com/guide/topics/manifest/receiver-element

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

此外,不要忘记广播接收器是用来收听广播的。您在示例中使用的广播接收器类型实际上是全局广播,您没有明确限制它是 "range",因此任何广播接收器都可能 "listen" 进入您的广播。在安全方面,像这样使用全球广播也不安全。

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

老实说,以不适合的方式使用广播接收器会带来更多潜在问题。

至于你的第二种方法直接调用Activity的方法...这对于管理代码来说其实是很低效的。您基本上是将 Fragment 与特定的 Activity 紧密地捆绑在一起。

但是,根据设计,Fragments 很容易被交换到其他 Activity 或 Fragments 中……每次您基本上都必须执行多个 if statementscasts 运行 来自其父项的代码。

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

但是,如果您使用更喜欢的回调接口方法,它只是一个旨在传递 "Hey, DO something for me" 消息的中间人。快速直接。它也可以与任何 Activity 或您想稍后附加此片段的片段一起播放,因为这些活动或片段只需要实现接口并形成父子之间的回调桥。

松耦合片段?

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

Because using an interface makes your Fragment independent from your Activity. Let's say in future you want to use your fragment in Some other Activity then you will not have to change anything in your Fragment.

界面

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
   }
}

BroadcastReceiver 方法?
TBH 我已经看到这种用于 Service-Activity 通信的方法。不适用于 Activity - 片段通信。

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