Android BroadcastReceiver,以便将数据从另一个活动传递到片段

Android BroadcastReceiver,以便将数据从另一个活动传递到片段,android,android-fragments,android-activity,broadcastreceiver,Android,Android Fragments,Android Activity,Broadcastreceiver,假设我有MainActivity,其中ViewPager中只有很少的片段。我想将数据从另一个活动传递到其中一个片段。我是通过广播接收机来做这件事的 public class MyFragment extends Fragment { private MyFragmentReceiver mReceiver; public MyFragment() { super(); } @Override public void onCreate(

假设我有MainActivity,其中ViewPager中只有很少的片段。我想将数据从另一个活动传递到其中一个片段。我是通过广播接收机来做这件事的

public class MyFragment extends Fragment {

    private MyFragmentReceiver mReceiver;

    public MyFragment() {
        super();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mReceiver = new MyFragmentReceiver();
        getActivity().registerReceiver(mReceiver, new IntentFilter("fragmentUpdater"));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_my, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // My code here
    }

    public class MyFragmentReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //My methods
        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mReceiver != null)
            getActivity().unregisterReceiver(mReceiver);
    }
}
因此,在我的另一项活动中,我正在做这样的事情:

Intent data = new Intent("fragmentUpdater");
MyApplication.getInstance().getMainActivity().sendBroadcast(data);
public class BaseFragment extends Fragment {

    public MyInterface mi;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mi = (MyInterface) context;
    }

}
其中MyApplication是包含MainActivity的singleton。 我注意到BroadcastReceiver正在将一些内容放入日志中,我想知道这样做的最佳方式是什么

  • 是否有更好的方法将数据从另一个活动传递到该片段中的特定片段或调用方法
  • 我是否必须在AndroidManifest.xml中包含与BroadcastReceiver相关的内容

  • 您可以使用额外的方式传递数据

    意向数据=新意向(“碎片更新程序”); data.putExtra(“您需要的字符串”,strName)

    您可以通过以下方式获取onReceive函数中的数据:


    String data_needed_here=extras.getString(“您需要的字符串”)

    我会改用LocalBroadcastManager,它有以下优点:

    • 你知道你正在广播的数据不会离开你的应用程序,所以 不需要担心泄露私人数据
    • 其他应用程序不可能发送这些广播 到你的应用程序,所以你不需要担心有安全漏洞 他们可以利用
    • 它比通过系统发送全球广播更有效

    这直接来自官方

    另一种选择是使用接口在活动和片段之间进行通信。例如:

    接口

    public interface MyInterface {
    
        void setSomeValue(int someValue);
        int getSomeValue();
    
    }
    
    活动

    public class MyActivity extends Activity implements MyInterface {
    
        private int someValue;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // do the usual stuff
        }
    
        // implement from MyInterface
        @Override
        public void setSomeValue(int someValue) {
            this.someValue = someValue;
        }
    
        // implement from MyInterface
        @Override
        public int getSomeValue() {
            return someValue;
        }
    
    }
    
    片段

    public class MyFragment extends Fragment {
    
        private MyInterface mi;
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mi = (MyInterface) context;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) {
    
            mi.setSomeValue(20);
            int someValue = mi.getSomeValue();
    
        }
    
    }
    
    您可以使用接口在一个或多个活动、多个片段、视图、任务、服务等之间进行通信。如果您要走这条路线,我将创建一个基本活动,它实现MyInterface及其方法,并让所有其他活动扩展基本活动。我甚至会创建一个调用onAttach()的基本片段,并让我的所有其他片段扩展这个基本片段(这样我就不需要在每个片段中调用onAttach()

    更新…

    基本片段的外观如下所示:

    Intent data = new Intent("fragmentUpdater");
    MyApplication.getInstance().getMainActivity().sendBroadcast(data);
    
    public class BaseFragment extends Fragment {
    
        public MyInterface mi;
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            mi = (MyInterface) context;
        }
    
    }
    
    现在,MyFragment将扩展BaseFragment

    public class MyFragment extends BaseFragment {
        ...
    }
    
    现在不需要在任何扩展BaseFragment的片段中附加甚至声明MyInterface,因为基片段已经有了它的公共实例。您只需通过界面设置/get/etc,无需任何额外的麻烦:

    mi.setSomeValue(20);
    

    您可以使用
    LocalBroadcastManager
    而不是
    BroadcastReceiver
    进行内部组件通信,但我这样做是一个好方法?您可以在活动和片段之间设置一个接口。如果你感兴趣的话,我可以举个例子。我非常感兴趣:)我知道,但问题是有没有比广播接收器更好的方法来传递数据?你不需要编写广播接收器。您只需检查getIntent().getExtras是否返回viewCreated和store中的任何数据,如果存在valueMainActivity创建Fragment1和SecondActivity创建Fragment2。我想将数据或调用方法从Fragment2传递到Fragment1。但是使用你的代码(如果我理解正确的话)Fragment2会在onAttach方法中获得第二个活动。是的,这就是为什么用实现接口的基本活动和附加接口的基本片段来设置你的应用程序将是一种方法。一旦你有了它,你可以从任何类传递任何数据。如果操作正确,您甚至不需要在片段之间传递任何捆绑数据。