需求分析
APP內(nèi)原生“BrowserActivity”(有WebView的界面)洁闰,嵌入H5模塊功能界面如在線商城等塘慕。
其中部分界面需要原生提供標(biāo)題欄模塊的功能:
- 下拉框選項(xiàng)
- 右邊圖片按鈕
- 文本按鈕
image
解決方案
- 將具體的需求抽象出來
- 實(shí)現(xiàn)相應(yīng)的接口,預(yù)先提供相應(yīng)的數(shù)據(jù)以及相應(yīng)方法
- 在原生跳轉(zhuǎn)“BrowserActivity”時(shí)傳入 Provider(抽象出來的接口)
優(yōu)點(diǎn):
- 避免BrowserActivity類里面的代碼膨脹
- 比較好的保證了通用界面獨(dú)立性
- 降低后期開發(fā)升級(jí)維護(hù)的難度
- 產(chǎn)品更改需求我們只需要在Provider里面進(jìn)行擴(kuò)展即可
- 不同模塊的擴(kuò)展功能可以獨(dú)立開戒傻,避免造成誤改通用性代碼
交互抽象類
/**
* Des:交互抽象類
* created by Zishu.Ye on 2017/6/12 10:27
*/
public interface IBrowserProvider<T> {
/**
* 綁定到相應(yīng)的web 瀏覽器
* @param context context
* @param webViewManager manager
*/
void bind(Context context, WebViewManager webViewManager);
/**
* webView 加載頁面開始加載的回調(diào)
* @param url 相應(yīng)的url
*/
void onPageStarted(String url);
/**
* webView 加載頁面結(jié)束加載的回調(diào)
* @param url 相應(yīng)的url
*/
void onPageFinished(String url);
/**
* 當(dāng)webview 第一次收到 js 調(diào)用是進(jìn)行回調(diào)
* @param url url
*/
void onJsCalled(String url);
/**
* web 瀏覽器在銷毀的時(shí)候解綁
*/
void unBind();
/**
* 根據(jù)與H5定義的交互分類
* 返回h5橋接的需要展示彈窗分類的鍵值對(duì)
*
* @return 返回h5橋接的需要展示彈窗分類的數(shù)據(jù)
*/
Map<String,List<DropDownBrowserBean<T>>> getDropTypeMap();
/**
* @param h5JSBridgeTypeKey h5調(diào)用彈窗的類型
* @param bean 下拉列表item點(diǎn)擊事件
*/
void onDropListItemClick(String h5JSBridgeTypeKey ,DropDownBrowserBean<T> bean);
/**
* @return 右邊按鈕需要顯示的圖標(biāo)
*/
Map<String,Integer> getRightImgBtnMap();
/**
* 右邊按鈕點(diǎn)擊事件
* @param h5JSBridgeTypeKey h5調(diào)用按鈕的類型
*/
void onRightBtnClick(String h5JSBridgeTypeKey);
/**
* @return 右邊文本按鈕需要顯示的文本
*/
Map<String,String> getRightTextBtnMap();
/**
* 右邊文本按鈕點(diǎn)擊事件
* @param h5JSBridgeTypeKey h5調(diào)用按鈕的類型
*/
void onRightTextBtnClick(String h5JSBridgeTypeKey);
}
下拉選項(xiàng)類型Bean
/**
* Des:下拉瀏覽器 通用數(shù)據(jù)類
* create by Zishu.Ye on 2017/6/12 10:24
*/
public class DropDownBrowserBean<T> {
String key; //索引
String label; //顯示標(biāo)簽
boolean isChioced;//是否選中
T data; //數(shù)據(jù)實(shí)體
}
Provider 的基類 BaseBrowserProvider
也可以不需要此基類税手,提供它好處在于可以統(tǒng)一處理一些通用的綁定界面等
繼承此基類也不需要實(shí)現(xiàn)所有抽象的方法,可以根據(jù)具體需求選擇實(shí)現(xiàn)提供
/**
* Des:Provider 的基類 BaseBrowserProvider
* create by Zishu.Ye on 2017/6/12 10:16
*/
public abstract class BaseBrowserProvider<T> implements IBrowserProvider<T>, Serializable {
public Context mContext;
public WebViewManager mWebViewManager;
@Override
public void bind(Context context, WebViewManager webViewManager) {
this.mContext = context;
this.mWebViewManager = webViewManager;
}
@Override
public void unBind() {
mContext=null;
mWebViewManager=null;
}
@Override
public void onPageStarted(String url) {}
@Override
public void onPageFinished(String url) {}
@Override
public void onJsCalled(String url) {}
@Override
public Map<String, String> getRightTextBtnMap() {
return null;
}
@Override
public void onRightTextBtnClick(String h5JSBridgeTypeKey) {}
}
具體業(yè)務(wù)需求實(shí)現(xiàn)類
在這里進(jìn)行提供具體需求所需要的數(shù)據(jù)
/**
* Des:具體業(yè)務(wù)需求實(shí)現(xiàn)類
* create by Zishu.Ye on 2017/8/28 10:13
*/
public class SeriviceBrowserProvider extends BaseBrowserProvider<Bean> implements IView {
private ServiceTypePresenter presenter;
@Override
public void bind(Context context, WebViewManager webViewManager) {
super.bind(context, webViewManager);
//做綁定的操作 比如初始化Presenter等
presenter = new ServiceTypePresenter(this);
presenter.getProductType(type);
}
@Override
public void unBind() {
super.unBind();
if (presenter != null) {
presenter.detachView();
}
}
@Override
public void onJsCalled(String url) {
super.onPageFinished(url);
mWebViewManager.loadUrl("javascript:method(par)");
}
@Override
public Map<String, List<DropDownBrowserBean<Bean>>> getDropTypeMap() {
Map<String, List<DropDownBrowserBean<Bean>>> map = new HashMap<>();
return map;
}
@Override
public void onDropListItemClick(String h5JSBridgeTypeKey, DropDownBrowserBean<Bean> bean) {
switch (h5JSBridgeTypeKey) {
case KEY:
doSomething(bean);
break;
default:
break;
}
}
@Override
public Map<String, Integer> getRightImgBtnMap() {
return map;
}
@Override
public void onRightBtnClick(String h5JSBridgeTypeKey) {
switch (h5JSBridgeTypeKey) {
case KEY:
doSomething(h5JSBridgeTypeKey);
break;
default:
break;
}
}
@Override
public Map<String, String> getRightTextBtnMap() {
Map<String, String> map = new HashMap<>();
return map;
}
@Override
public void onRightTextBtnClick(String h5JSBridgeTypeKey) {
switch (h5JSBridgeTypeKey) {
case KEY:
doSomething(h5JSBridgeTypeKey);
break;
default:
break;
}
}
}
跳轉(zhuǎn)BrowserActivity
Intent intent = new Intent(context, BrowserActivity.class);
intent.putExtra(URL_KEY, url);
intent.putExtra(KEY, seriviceBrowserProvider)
context.startActivity(intent);
BrowserActivity 部分的處理
/**
* Des:標(biāo)題欄功能瀏覽器
* create by Zishu.Ye on 2017/6/13 10:57
*/
public class BrowserActivity extends BaseAppCompatActivity {
private IBrowserProvider mBrowserProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_browser);
init();
initView();
}
@Override
protected void onDestroy() {
if (mBrowserProvider != null) {
mBrowserProvider.unBind();
}
}
@Override
protected void init() {
mBrowserProvider = (IBrowserProvider) getIntent().getSerializableExtra(KEY);
}
@Override
protected void initView() {
if (mBrowserProvider != null)
mBrowserProvider.bind(this, webViewManager);
}
@OnClick({R.id.iv_right, R.id.tv_right})
void onClick(View v) {
switch (v.getId()) {
case R.id.iv_right://右邊按鈕點(diǎn)擊事件
if (mBrowserProvider != null)
mBrowserProvider.onRightBtnClick(curRightImgBtnType);
break;
case R.id.tv_right:
if (mBrowserProvider != null)
mBrowserProvider.onRightTextBtnClick(curRightTextBtnType);
break;
default:
break;
}
}
/**
* 收到JS 調(diào)用指定功能 進(jìn)行相應(yīng)的初始化界面控件
* 設(shè)置右邊按鈕圖片需纳、文本 加載下拉彈窗等
* @param javaScriptEvent e
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(final BusEvent.JavaScriptEvent javaScriptEvent) {
if (mBrowserProvider != null) {
Map<String, Object> map = (Map<String, Object>) javaScriptEvent.getT();
doSetRightBtn(map, mBrowserProvider.getDropTypeMap(), mBrowserProvider.getRightImgBtnMap(), mBrowserProvider.getRightTextBtnMap());
}
}
/**
* 下拉彈窗item點(diǎn)擊
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(DropDownBrowserEvent event) {
if (event.getOrderTypeBeam() != null)
mBrowserProvider.onDropListItemClick(event.getH5JSBridgeTypeKey(), event.getOrderTypeBeam());
}
BaseWebViewClient<XXX> baseWebViewClient = new BaseWebViewClient<XXX>() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (mBrowserProvider != null)
mBrowserProvider.onPageStarted(url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (mBrowserProvider != null)
mBrowserProvider.onPageFinished(url);
}
};
}
最后
感謝觀看芦倒,歡迎留言指導(dǎo)交流