`
sinykk
  • 浏览: 351556 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用JAVA生成ANDORID一个壳,应用中嵌入一个网页即可

 
阅读更多
应用经常出现闪屏,一直没有解决,正好jquery mobile更新了1.1.0版本,升级后这个问题被弱化了
===========================================

之前作的网站总是出现进程意外,强制关闭。后来经过检查是线程问题,最后关闭线程就解决了问题


===========================================

安卓版本检查,传统方式是用户点击软件“检查版本”时来手动检查,这种方式OUT了。因为这样会有大部分人不会来检查版本,导致产品不敢大进步。

现在爱就是幸福网移动版采用服务器统一检查版本,发现有版本时提示用户,这个提示时间,提示内容都可以在服务器上操作。

因为我们用提只是安卓的一个壳即WebView,这时我们只需要加载的URL后加一个参数即可如
http://m.ai9475.com/?version=1.0.101


==========================================
这个WebView,有一问题就是加载时有空白,这时最好的办法是给它加一个背景,同时设置一个为0的透明度,这样用户不会有等的感觉,同时也可以宣传产品品牌。增加用户对产品的认识度

JAVA CODE
       wv=(WebView)findViewById(R.id.wv);
    	wv .setBackgroundColor(0);
    	wv .setBackgroundResource(R.drawable.logo);


=========================================
JAVA CODE
package com.tian.sinykk;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
public class Androidtest3Activity extends Activity {
    /** Called when the activity is first created. */
	WebView wv;
	ProgressDialog pd;
	Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();//执行初始化函数
        loadurl(wv,"http://m.ai9475.com");
        handler=new Handler(){
        	public void handleMessage(Message msg)
    	    {//定义一个Handler,用于处理下载线程与UI间通讯
    	      if (!Thread.currentThread().isInterrupted())
    	      {
    	        switch (msg.what)
    	        {
    	        case 0:
    	        	pd.show();//显示进度对话框        	
    	        	break;
    	        case 1:
    	        	pd.hide();//隐藏进度对话框,不可使用dismiss()、cancel(),否则再次调用show()时,显示的对话框小圆圈不会动。
    	        	break;
    	        }
    	      }
    	      super.handleMessage(msg);
    	    }
        };
    }
    public void init(){//初始化
    	wv=(WebView)findViewById(R.id.wv);
        wv.getSettings().setJavaScriptEnabled(true);//可用JS
        wv.setScrollBarStyle(0);//滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上
        wv.setWebViewClient(new WebViewClient(){   
            public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            	loadurl(view,url);//载入网页
                return true;   
            }//重写点击动作,用webview载入
 
        });
        wv.setWebChromeClient(new WebChromeClient(){
        	public void onProgressChanged(WebView view,int progress){//载入进度改变而触发 
             	if(progress==100){
            		handler.sendEmptyMessage(1);//如果全部载入,隐藏进度对话框
            	}   
                super.onProgressChanged(view, progress);   
            }   
        });
 
    	pd=new ProgressDialog(Androidtest3Activity.this);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("数据载入中,请稍候!");
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {//捕捉返回键
        if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) {   
            wv.goBack();   
            return true;   
        }else if(keyCode == KeyEvent.KEYCODE_BACK){
        	ConfirmExit();//按了返回键,但已经不能返回,则执行退出确认
        	return true; 
        }   
        return super.onKeyDown(keyCode, event);   
    }
    public void ConfirmExit(){//退出确认
    	AlertDialog.Builder ad=new AlertDialog.Builder(Androidtest3Activity.this);
    	ad.setTitle("退出");
    	ad.setMessage("是否退出软件?");
    	ad.setPositiveButton("是", new DialogInterface.OnClickListener() {//退出按钮
			@Override
			public void onClick(DialogInterface dialog, int i) {
				// TODO Auto-generated method stub
				Androidtest3Activity.this.finish();//关闭activity
 
			}
		});
    	ad.setNegativeButton("否",new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int i) {
				//不退出不用执行任何操作
			}
		});
    	ad.show();//显示对话框
    }
    public void loadurl(final WebView view,final String url){
    	new Thread(){
        	public void run(){
        		handler.sendEmptyMessage(0);
        		view.loadUrl(url);//载入网页
        	}
        }.start();
    }
 
 
}




main.xml
<?xml version="1.0" encoding="utf-8"?>

<AbsoluteLayout android:orientation="vertical" android:id="@+id/tab1" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <WebView android:id="@+id/wv"
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:layout_x="0.0dip"
    	android:layout_y="0.0dip"
    	android:layout_weight="1.0" />
</AbsoluteLayout>




今天又做了些修改,增加了菜单,刷新,分享,退出。同时也增加了加载进度条
package com.tian.sinykk;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
 
public class Androidtest3Activity extends Activity {
    /** Called when the activity is first created. */
	WebView wv;
	ProgressDialog pd;
	Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();//执行初始化函数
        loadurl(wv,"http://m.ai9475.com");
    }
    
    
 // 点击Menu时,系统调用当前Activity的onCreateOptionsMenu方法,并传一个实现了一个Menu接口的menu对象供你使用
 	@Override
 	public boolean onCreateOptionsMenu(Menu menu) {
 		/*
 		 * add()方法的四个参数,依次是:
 		 * 1、组别,如果不分组的话就写Menu.NONE,
 		 * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
 		 * 3、顺序,那个菜单现在在前面由这个参数的大小决定
 		 * 4、文本,菜单的显示文本
 		 */
 		menu.add(Menu.NONE, Menu.FIRST + 1, 5, "分享").setIcon(
 				android.R.drawable.ic_menu_share);
 		// setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以
 		// android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
 		menu.add(Menu.NONE, Menu.FIRST + 2, 2, "刷新").setIcon(
 				android.R.drawable.ic_menu_rotate);
 		menu.add(Menu.NONE, Menu.FIRST + 3, 6, "退出").setIcon(
 				android.R.drawable.ic_menu_close_clear_cancel);
 		// return true才会起作用
 		return true;

 	}
 	
 	//菜单项被选择事件
 		@Override
 		public boolean onOptionsItemSelected(MenuItem item) {
 			WebView wv1=(WebView)findViewById(R.id.wv);
 			switch (item.getItemId()) {
 			case Menu.FIRST + 1:
 			    //分享
	 			Intent intent=new Intent(Intent.ACTION_SEND);   
	 			intent.setType("text/plain");   
	 			intent.putExtra(Intent.EXTRA_SUBJECT,wv1.getTitle());   
	 			intent.putExtra(Intent.EXTRA_TEXT, wv1.getTitle()+" 可通过后面网址访问"+wv1.getUrl());    
	 			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   
	 			startActivity(Intent.createChooser(intent, "分享")); 
 		      break;
 			case Menu.FIRST + 2:
 				//刷新
				wv1.reload();
 				break;
 			case Menu.FIRST + 3:
 				//退出应用
 				 System.exit(0);
 				break;
 			}

 			return false;
 		}
    
    
    public void init(){//初始化
    	wv=(WebView)findViewById(R.id.wv);
        wv.getSettings().setJavaScriptEnabled(true);//可用JS
        wv.setScrollBarStyle(0);//滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上
        wv.setWebViewClient(new WebViewClient(){   
            public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            	loadurl(view,url);//载入网页
                return true;   
            }
 
        });
        
        wv.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                setTitle("页面加载中,请稍候..." + progress + "%");
                setProgress(progress * 100);

                if (progress == 100) {
                    setTitle(view.getTitle());
                }
            }
        });
        
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {//捕捉返回键
        if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) {   
            wv.goBack();   
            return true;   
        }else if(keyCode == KeyEvent.KEYCODE_BACK){
        	ConfirmExit();//按了返回键,但已经不能返回,则执行退出确认
        	return true; 
        }   
        return super.onKeyDown(keyCode, event);   
    }
    public void ConfirmExit(){//退出确认
    	AlertDialog.Builder ad=new AlertDialog.Builder(Androidtest3Activity.this);
    	ad.setTitle("退出");
    	ad.setMessage("是否退出软件?");
    	ad.setPositiveButton("是", new DialogInterface.OnClickListener() {//退出按钮
			@Override
			public void onClick(DialogInterface dialog, int i) {
				
				Androidtest3Activity.this.finish();//关闭activity
 
			}
		});
    	ad.setNegativeButton("否",new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int i) {
				//不退出不用执行任何操作
			}
		});
    	ad.show();//显示对话框
    }
    public void loadurl(final WebView view,final String url){
    	new Thread(){
        	public void run(){
        		view.loadUrl(url);//载入网页
        	}
        }.start();
    }
 
   /* *//**
     * 分享应用
     * @param view
     *//*
    public void onClickShare() {
    	Intent sendIntent = new Intent();
    	sendIntent.setAction(Intent.ACTION_SEND);
    	sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    	sendIntent.setType("text/plain");
    	startActivity(sendIntent);
	}*/

 
}


==============================
应用中加了友盟统计,但在运行时报找不到友盟的类,原因是打包时错误,使用如下方式

右键工程,

  Build path,

  java build path,选择libraries

  在右边的按钮中点击“Add Library”

  选择“User library”,点击“下一步”

  点击“User librarys”按钮

  在出现的界面中点击“New..”按钮

  在弹出的界面中随便起一个名字,点击“确定”

  点击“Add jars”按钮选择第三方jar包,点击“确定”完成操作。

  这样的话该jar包会被一起打包到apk中,问题也就解决了!
=========================================

分享到:
评论
2 楼 sinykk 2014-03-01  
libmw 写道
你好,请问现在爱就是幸福网的首页,扫描二维码为啥不是下载apk而是直接跳转到一个wap网页了呢?是因为使用webview壳有啥问题么?


那个是我们还没有修改的。因为我们现在在开发原生app,这个app还没有开发好,所以暂时让用户使用手机版
1 楼 libmw 2014-02-24  
你好,请问现在爱就是幸福网的首页,扫描二维码为啥不是下载apk而是直接跳转到一个wap网页了呢?是因为使用webview壳有啥问题么?

相关推荐

Global site tag (gtag.js) - Google Analytics