Android里webviewActivity一般功能实现

来源:互联网 发布:ubuntu有什么用 编辑:程序博客网 时间:2024/06/13 02:03

安卓开发新人,刚着手项目中用html实现应用的某些模块,在编写带webview的Activity时就遇到的问题不断尝试,并改进自己的webviewActivity,最后给出自己的源码,刚接触webview的童鞋可以参考其中的解决方案。
其中涉及到的问题有:

<p>webview加载页面的基本配置</p><p>使webview显示网页加载进度</p><p>webview的后退、前进、刷新、关闭的实现</p><p>Android通过webview的cookie来传键值对给html端</p><p>使webview支持文件的上传</p><p>webview中如何给JS提供接口,让JS能调用Android的方法</p><p>将JS的Alert转换为Android的AlertDialog</p><p>调用该activity来加载页面,只需要用以下片断即可</p>

<p></span></div><div><span style="font-size:24px;"></span><pre name="code" class="java"><span style="white-space:pre"></span>intent.setClass(MainActivity_3.this, WebViewActivity.class);</p>intent.putExtra("url", "file:///android_asset/index.html");// FIXMEintent.putExtra("title", "测试");startActivity(intent);

Activity源码
public class WebViewActivity extends Activity {private final static int FINISH_ACTIVITY = 0;private final static int REQUEST_UPLOAD_FILE_CODE = 2;private ValueCallback<Uri> mUploadFile;private final String TAG = "WebViewActivity ";private WebView webview;private String url;private Handler handler = new MyHandler(this);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().requestFeature(Window.FEATURE_PROGRESS);setContentView(R.layout.activity_webview);webview = (WebView) findViewById(R.id.webView);url = getIntent().getStringExtra("url");getWindow().setFeatureInt(Window.FEATURE_PROGRESS,Window.PROGRESS_VISIBILITY_ON);//给页面的actionBar加上回退按钮getActionBar().setDisplayHomeAsUpEnabled(true);getActionBar().setBackgroundDrawable(getResources().getDrawable(R.color.deepgrey));//设置webview的settings和clientconfigWebview();setCookie();// 加载 页面loadURL();}//给html页面传递的用户数据都放在cookie中private void setCookie() {SharedPreferences userInfoSP = MyApplication.getInstance().getUserinfoSharedPreferences();CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(this);CookieManager cookieManager = CookieManager.getInstance();cookieManager.setAcceptCookie(true);String domain = "app.issll.com";Cookie cname = null;try {//若不用URLEncoder编码,中文在某些机型上会出现乱码cname = new Cookie(domain, "userName", URLEncoder.encode(userInfoSP.getString("name", ""), "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}Cookie cplotid = new Cookie(domain, "plotId",UserSelectedAddress.plotid);Cookie cLongtitude = new Cookie(domain, "longtitude",String.valueOf(UserSelectedAddress.myLongitude));Cookie cLatitude = new Cookie(domain, "latitude",String.valueOf(UserSelectedAddress.myLatitude));Cookie cUserId = new Cookie(domain, "userId", userInfoSP.getString("userid", ""));MyDebugUtils.d(TAG, cplotid.toString());MyDebugUtils.d(TAG, cUserId.toString());MyDebugUtils.d(TAG, cname.toString());cookieManager.removeAllCookie();cookieManager.setCookie(url, "" + cUserId);cookieManager.setCookie(url, "" + cname);cookieManager.setCookie(url, "" + cplotid);cookieManager.setCookie(url, "" + cLongtitude);cookieManager.setCookie(url, "" + cLatitude);cookieSyncManager.startSync();}private void setActionbarTitle() {String title = getIntent().getStringExtra("title");if (title != null)getActionBar().setTitle(title);elsegetActionBar().setTitle(R.string.app_name);}private void loadURL() {try {webview.loadUrl(url);} catch (Exception e) {MyDebugUtils.e(TAG + url, e.getLocalizedMessage());}}//友盟SDK的方法@Overrideprotected void onResume() {MobclickAgent.onResume(this);super.onResume();}@Overrideprotected void onPause() {MobclickAgent.onPause(this);super.onPause();}@Overrideprotected void onDestroy() {webview.destroy();super.onDestroy();}@SuppressWarnings("deprecation")private void configWebview() {// 允许javascript代码执行WebSettings settings = webview.getSettings();settings.setJavaScriptEnabled(true);settings.setDomStorageEnabled(true);settings.setCacheMode(WebSettings.LOAD_DEFAULT);settings.setAppCacheMaxSize(8 * 1024 * 1024);settings.setRenderPriority(RenderPriority.HIGH);settings.setCacheMode(WebSettings.LOAD_NO_CACHE);settings.setAppCacheEnabled(true);settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setAllowFileAccess(true);settings.setAllowFileAccessFromFileURLs(true);settings.setAllowUniversalAccessFromFileURLs(true);settings.setDefaultTextEncodingName("utf-8");// 在当前页面打开链接,而不是启动用户手机上安装的浏览器打开webview.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {webview.loadUrl(url);return true;}});webview.setWebChromeClient(new WebChromeClient() {// 使webview可以更新进度条@Overridepublic void onProgressChanged(WebView view, int newProgress) {WebViewActivity.this.setTitle("加载中……");WebViewActivity.this.setProgress(newProgress * 100);if (newProgress == 100)setActionbarTitle();}//使JS alert可以以Android的AlertDiaolog形式弹出@Overridepublic boolean onJsAlert(WebView view, String url, String message,final JsResult result) {AlertDialog.Builder builder = new Builder(WebViewActivity.this).setMessage(message).setPositiveButton("确定",new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {result.confirm();}});builder.setCancelable(true);builder.show();return true;}//html中上传点击input type为file的控件时会调用下列方法,在Android4.4中无效,待修复// Android 4.1+@SuppressWarnings("unused")public void openFileChooser(ValueCallback<Uri> uploadFile,String acceptType, String capture) {openFileChooser(uploadFile);}// Android 3.0 +@SuppressWarnings("unused")public void openFileChooser(ValueCallback<Uri> uploadFile,String acceptType) {openFileChooser(uploadFile);}// Android 3.0public void openFileChooser(ValueCallback<Uri> uploadFile) {mUploadFile = uploadFile;startActivityForResult(createCameraIntent(),REQUEST_UPLOAD_FILE_CODE);}});// 在js中用window.injs.方法名来调用InJavaScript类中的方法webview.addJavascriptInterface(new InJavaScript(), "android");webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);}private Intent createCameraIntent() {Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);// 选择图片文件imageIntent.setType("image/*");return imageIntent;}// 使后退键可以达到网页回退功能,而不是关闭activity@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {webview.goBack();return true;}return super.onKeyDown(keyCode, event);}//添加菜单栏的几个功能键@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.webview, menu);return super.onCreateOptionsMenu(menu);}/** * 给javascript调用的代码 *  */private final class InJavaScript {//可以用JS关闭本Activity@android.webkit.JavascriptInterfacepublic void finish() {handler.sendEmptyMessage(FINISH_ACTIVITY);}//可以用JS触发一个分享文本信息的intent@android.webkit.JavascriptInterfacepublic void sharelink(String link){Intent i=new Intent(Intent.ACTION_SEND);i.setType("text/plain");i.putExtra(Intent.EXTRA_SUBJECT, "分享");i.putExtra(Intent.EXTRA_TEXT, "share this:"+link);startActivity(Intent.createChooser(i, "请选择分享方式"));}}/* * (non-Javadoc)左上角回退可以结束本activity,另有前进、后退、刷新 *  * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem) */@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home://关闭页面finish();break;case R.id.menu_webview_refresh://刷新webview.reload();break;case R.id.menu_webview_back://后退if (webview.canGoBack())webview.goBack();break;case R.id.menu_webview_forward://前进if (webview.canGoForward())webview.goForward();break;}return super.onOptionsItemSelected(item);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//选择文件后回调给JS一个URIif (requestCode == REQUEST_UPLOAD_FILE_CODE && resultCode == RESULT_OK) {if (null == mUploadFile)return;Uri result = (null == data) ? null : data.getData();//注,此处data.getData(),若为data则仅是contentProvider的地址将不能为JS识别if (null != result) {mUploadFile.onReceiveValue(result);mUploadFile = null;}//如果用户取消了选择文件操作,必须回调一个null的URI给JS,否则webview将会死掉} else if (requestCode == REQUEST_UPLOAD_FILE_CODE &&resultCode == RESULT_CANCELED) {Uri result = null;mUploadFile.onReceiveValue(result);mUploadFile = null;}}//用来处理UI操作的handler,可扩展,暂无太大用处……private static class MyHandler extends Handler {WeakReference<WebViewActivity> weakReference;public MyHandler(WebViewActivity webViewActivity) {weakReference = new WeakReference<WebViewActivity>(webViewActivity);}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case FINISH_ACTIVITY:weakReference.get().finish();break;default:break;}super.handleMessage(msg);}}}


                                             
0 0
原创粉丝点击