近日需要完成这样的功能:一个页面(Fragment)刷新以后,需要刷新多个页面的Fragment。
我首先想到了,是观察者模式的升级版:发布-订阅模式。加之笔者用Otto做过发布-订阅功能(Android在另一个类中获得Http消息_wangzhezhilu001的专栏-CSDN博客),因此首先就想到这个模式。
在确定该功能能完成通知的同时,在想能否用其他模式来完成。
想到了Android四大组件之一的广播。
继续研究,发现广播组件即为发布-订阅模式。
首先第一个选择是:静态注册广播还是动态注册广播。
发现静态注册广播只能用一次,而动态注册广播能用多次,于是选择注册动态广播。
第二个难题:注册和反注册广播的位置。对于Activity来说,比较好的选择为onResume()注册、onPause()注销,但Fragment并无这两个功能。笔者想到Fragment依托于Activity,不需要考虑onResume()和onPause(),比较好的选择是:void onCreate(Bundle saveInstanceState) 和 void onDestroy()。
第三步:写代码。
1.广播接收器定义:
//广播的定义
class BroadcastReceiverImpl extends BroadcastReceiver {
// 复写onReceive()方法
// 接收到广播后,则自动调用该方法
@Override
public void onReceive(Context context, Intent intent) {
//写入接收广播后的操作
mHandler.sendEmptyMessage(0);
}
}
//声明在接收的Fragment里
BroadcastReceiverImpl mBroadcastReceiverImpl = new BroadcastReceiverImpl();
2.动态注册
@Override
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
//创建IntentFilter
IntentFilter intentFilter = new IntentFilter();
//设置接收广播的类型
intentFilter.addAction("Test.broadcast");
//动态注册:调用Context的registerReceiver()方法
getActivity().getBaseContext().registerReceiver(mBroadcastReceiverImpl, intentFilter);
}
3.动态注销(反注册)
@Override
public void onDestroy(){
super.onDestroy();
getActivity().getBaseContext().unregisterReceiver(mBroadcastReceiverImpl);
}
4.发送广播消息
//发送广播消息
final Intent intent = new Intent();
//广播内容
intent.setAction("richers.com.raworkapp_android.view.activity.TaskDetailsActivity");
getBaseContext().sendBroadcast(intent);
运行代码,发现可以发送和接收广播消息,任务完成。