代码之家  ›  专栏  ›  技术社区  ›  Faisal Shaikh

在Android中,什么是更快的通信、发送广播和直接调用活动方法?

  •  0
  • Faisal Shaikh  · 技术社区  · 6 年前

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

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

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

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

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

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

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

    谢谢您。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Rohit Singh Varun    6 年前

    松散耦合碎片?

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

    因为使用接口可以使片段独立于 活动。假设将来你想用你的片段 其他活动,那么你就不必改变你的 碎片。

    界面

    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 . 没问题

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

    广播接收机方法?
    我已经看到了服务活动通信的这种方法。不用于活动-片段通信。

        2
  •  0
  •   Jackey    6 年前

    对于片段和包含片段的活动之间的通信,实际上有一个更好的第三个选项。

    更好的选择是使用接口作为回调方法。这在本文档中描述得很好: https://developer.android.com/training/basics/fragments/communicating

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

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

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

    警告:限制在应用程序中设置的广播接收器数量。拥有太多的广播接收器会影响应用程序的性能和用户设备的电池寿命。有关可用于调度后台工作而不是BroadcastReceiver类的API的详细信息,请参阅后台优化。 https://developer.android.com/guide/topics/manifest/receiver-element

    所以,是的,广播接收器将对你的应用程序的性能和设备的电池寿命产生更大的影响,而不是你建议的其他方法和我建议的方法。

    另外,不要忘记广播接收器是用来听广播的。您在示例中使用的广播接收器类型实际上是全局广播,您没有明确地将其限制为“范围”,因此任何广播接收器都可能“监听”您的广播。在安全方面,使用这样的全球广播也不安全。

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

    老实说,在某种程度上使用广播接收器的可能性更大。

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

    然而,片段,通过设计,使得它通常被交换成其他活动或片段…你基本上要做多次 if statements casts 每次您想从它的父级运行代码时。

    另外,请记住,如果您稍后更改myActivity中的代码,它可能会由于您忘记它与活动的紧密绑定而导致此片段出现问题。

    但是如果你使用更喜欢的回调接口方法,它只是一个中间人,目的是传递一条“嘿,为我做点什么”的消息。快速而直接。它还可以与您希望稍后将此片段附加到的任何活动或片段进行友好的处理,因为这些活动或片段只需要实现接口,并且在父级和子级之间形成回调桥。

        3
  •  0
  •   Pankaj Kushwaha    6 年前

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