广播接收器的坑

来源:互联网 发布:苏州美工的行情 编辑:程序博客网 时间:2024/06/01 08:03

BroadCastReceiver has no zero argument constructor

  1. 清单AndroidManifest注册 BroadCastReceiver 内部类 的时候,一定要是静态的(static)内部类,一定是有无参数的构造器,因为发送静态广播的时候是同过无参的构造器构建的。

  2. 简便的写法是将内部类变为外部类。

现在有需求:
1. 第一层界面有三个fragment,点击一个fragment进去第二层Activity后,在进去后可以进入第三层的界面,在第三层进行具体操作,操作成功后回到第一个界面的时候刷新三个fragment的数据,没有操作就不用刷新界面。如下图。

这里写图片描述

这里可以使用BroadCastReceiver来实现。下面是实现步骤:

1.编写RefreshBroadCastReceiver,代码如下:

public class RefreshBroadCastReceiver extends BroadcastReceiver {    public static final String ACTION = "BaseMaintenanceFragment.RefreshBroadCastReceiver.ACTION";    //存储需要刷新的界面    public static List<Refresh> refreshList = new ArrayList<>();    public RefreshBroadCastReceiver() {    }    public RefreshBroadCastReceiver(Refresh refresh) {        if (!refreshList.contains(refresh)) {            refreshList.add(refresh);        }    }    @Override    public void onReceive(Context context, Intent intent) {//        Log.i("123", "!@################################");        //接收刷新的广播进行刷新界面的操作        String action = intent.getAction();        switch (action) {            case ACTION:                if (refreshList != null && refreshList.size() != 0) {                    for (int i = 0; i < refreshList.size(); i++) {                        refreshList.get(i).onReceive(context, intent);                    }                }                break;        }    //收到数据后的刷新接口    public interface Refresh {        void onReceive(Context context, Intent intent);    }

2.清单文件中注册:

        <receiver            android:name="com.zhang.RefreshBroadCastReceiver"            android:exported="false">            <intent-filter>                <action                                 android:name="com.zhang.RefreshBroadCastReceiver.ACTION" />            </intent-filter>        </receiver>

3.在fragment中注册广播
实现

implements RefreshBroadCastReceiver.Refresh @Override    public void onReceive(Context context, Intent intent) {        getData();    } protected RefreshBroadCastReceiver mRefreshBroadCastReceiver;    private void registerBroadCastReceiver() {        mRefreshBroadCastReceiver = new RefreshBroadCastReceiver(this);        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction(ACTION);        getContext().registerReceiver(mRefreshBroadCastReceiver, intentFilter);    } @Override    public void onStop() {        super.onStop();        getContext().unregisterReceiver(mRefreshBroadCastReceiver);    }

4.发送广播:

  Intent intent = new Intent();  intent.setAction(RefreshBroadCastReceiver.ACTION);  sendBroadcast(intent);
0 0
原创粉丝点击