频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android WebView优化
2015-03-27 10:43:20         来源:专注移动端IM  
收藏   我要投稿

 

WebView可以很好地帮助我们展示html页面,但是webview使用不当的话还是可能产生一定问题的,下面就以下几个方面说说我的优化技巧

 

1、展示webview的activity可以另开一个进程,这样就能和我们app的主进程分开了,即使webview产生了oom崩溃等问题也不会影响到主程序,如何实现呢,其实很简单,在androidmanifest.xml的activity标签里加上android:process="packagename.web"就可以了,代码如下:

 

        
        

运行起来就会发现多了一个进程,哈哈

 

 

2、webview的创建也是有技巧的,最好不要在layout.xml中使用webview,可以通过一个viewgroup容器,使用代码动态往容器里addview(webview),这样可以在onDestory()里销毁掉webview及时清理内存,另外需要注意创建webview需要使用applicationContext而不是activity的context,销毁时不再占有activity对象,这个大家应该都知道了,最后离开的时候需要及时销毁webview,onDestory()中应该先从viewgroup中remove掉webview,再调用webview.removeAllViews();webview.destory(); 代码如下:

创建:

 

                ll = new LinearLayout(getApplicationContext()); 
		ll.setOrientation(LinearLayout.VERTICAL);
		wv = new WebView(getApplicationContext());

销毁:

 

 

        @Override
	protected void onDestroy() {
		ll.removeAllViews();
		wv.stopLoading();
		wv.removeAllViews();
		wv.destroy();
		wv = null;
		ll = null;
		super.onDestroy();
	}

3、进一步的优化,activity被动被杀之后,最好能够保存webview状态,这样用户下次打开时就看到之前的状态了,嗯,就这么干,webview支持saveState(bundle)和restoreState(bundle)方法,所以就简单了,哈哈,看看代码吧:

 

保存状态:

 

        @Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		wv.saveState(outState);
		Log.e(TAG, "save state...");
	}

是不是很熟悉啊,哈哈

 

 

恢复状态:

在activity的onCreate(bundle savedInstanceState)里,这么吊用:

 

                if(null!=savedInstanceState){
			wv.restoreState(savedInstanceState);
			Log.i(TAG, "restore state");
		}else{
			wv.loadUrl("https://3g.cn");
		}

试用一下,结果还是令人满意的,恢复的相当到位啊!32个赞!!!

 

但是,我还是有一个疑问,朋友圈打开网页back之后再打开也能恢复到原来位置,不知道他们怎么做到的,正常back的话是不会调用onSaveInstanceState(bundle)的,我们正常就没法保存状态了,希望知道的朋友可以回复我一下,谢谢。

好了,先写这么多。

 

下面贴出完整的代码,希望对大家有个帮助。

 

 

package com.example.test;

 

import android.app.Activity;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.util.Log;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.LinearLayout;

 

public class WebViewActivityextends Activity {

 

private staticfinal String TAG = WebViewActivity.class.getName();

 

WebView wv;

LinearLayout ll;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ll = new LinearLayout(getApplicationContext());

ll.setOrientation(LinearLayout.VERTICAL);

wv = new WebView(getApplicationContext());

WebSettings setting = wv.getSettings();

setting.setJavaScriptEnabled(true);

setting.setBuiltInZoomControls(true);

setting.setAppCacheEnabled(true);

setting.setDisplayZoomControls(true);

ll.addView(wv);

setContentView(ll);

if(null!=savedInstanceState){

wv.restoreState(savedInstanceState);

Log.i(TAG,"restore state");

}else{

wv.loadUrl("https://3g.cn");

}

wv.setWebViewClient(new WebViewClient(){

 

@Override

publicboolean shouldOverrideUrlLoading(WebView view, String url) {

Log.d(TAG,"jump to :"+url);

wv.loadUrl(url);

returntrue;

}

 

@Override

publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {

super.onPageStarted(view, url, favicon);

Log.d(TAG,"pageStarted:"+url);

}

 

@Override

publicvoid onPageFinished(WebView view, String url) {

//TODO Auto-generated method stub

super.onPageFinished(view, url);

Log.d(TAG,"pageFinished:"+url);

}

 

@Override

publicvoid onReceivedError(WebView view, int errorCode,

String description, String failingUrl) {

//TODO Auto-generated method stub

super.onReceivedError(view, errorCode, description, failingUrl);

Log.e(TAG,"onReceivedError code :"+errorCode+" , failingUrl:"+failingUrl);

}

 

});

}

 

@Override

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

wv.saveState(outState);

Log.e(TAG,"save state...");

}

 

@Override

public void onBackPressed() {

if(wv.canGoBack())

wv.goBack();

else{

super.onBackPressed();

// Process.killProcess(Process.myPid());

}

}

 

@Override

protected void onDestroy() {

ll.removeAllViews();

wv.stopLoading();

wv.removeAllViews();

wv.destroy();

wv = null;

ll = null;

super.onDestroy();

}

 

}


 

 

点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:让你的Android应用能使用多种主题 ( Part 2 )
下一篇:关于Android 中的BaseAdapter用法理解
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站