前言
在Android日常開發過程,經常會遇到需要寫動態註冊廣播接收器的時候,其實這部分代碼可以以設計的思想抽離出一個框架方便自己日後使用。
實現部分如下:
首先定義回調接口:
public interface WatcherInnerListener {
public void onListenOccor();
}
定義Wather 接口:
public interface Watcher {
public void startWatcher();
public void stopWatcher();
}
定義抽象類實現Wather接口:
public abstract class AbstractWatcher implements Watcher {
static final String TAG = "HomeWatcher";
private Context mContext;
private IntentFilter mFilter;
private WatcherInnerListener mListener;
private InnerReceiver mReceiver;
public abstract String getFilterAction();
public AbstractWatcher(Context context) {
this.mContext = context;
mFilter = new IntentFilter(getFilterAction());
}
public void setmListener(WatcherInnerListener watcherInnerListener) {
this.mListener = watcherInnerListener;
mReceiver = new InnerReceiver();
}
@Override
public void startWatcher() {
if (mReceiver != null) {
mContext.registerReceiver(mReceiver, mFilter);
}
}
@Override
public void stopWatcher() {
if (mReceiver != null) {
mContext.unregisterReceiver(mReceiver);
}
}
private class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(getFilterAction())) {
if (mListener != null) {
mListener.onListenOccor();
}
}
}
}
}
其核心思路是持有一個InnerReceiver 並提供動態註冊與註銷的方法,監聽getFilterAction()待子類去實現,至此基本框架就算完成了。
下面看具體使用
定義子類:
public class DeleteWatcher extends AbstractWatcher {
private static final String ACTION ="com.asus.function.antitouch.delete";
public DeleteWatcher(Context context) {
super(context);
}
@Override
public String getFilterAction() {
return this.ACTION;
}
}
Activity中使用:
deleteWatcher = new DeleteWatcher(mContext);
deleteWatcher.setmListener(new WatcherInnerListener() {
@Override
public void onListenOccor() {
enable.setChecked(GerSharePerferencesInfo.getLockShow(mContext));
}
});
deleteWatcher.startWatcher();
@Override
protected void onDestroy() {
Log.d(TAG,"onDestroy");
if(null!= deleteWatcher) {
deleteWatcher.stopWatcher();
}
super.onDestroy();
}