android 笔记

来源:互联网 发布:高帮男鞋 知乎 编辑:程序博客网 时间:2024/06/07 02:44

一、apk自动更新

       使用 http通讯协议来下载文件,首先把版本信息制作成 version.json 数据格式如:

      version.json

     {"verCode":"11","verName":"9.0","apkname":"YunApp.apk","apkUrl":"http://www.nbycs.com:8011/Android/YunApp.apk"}

     以及把apk文件放在服务器。

    需设置IIS的 MIME类型的映射

    把 .json与.apk格式的映射成 "application/octet-stream"类型,则可以下载。

    

    应用中的例子代码段:

                   if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
                    {
               //检查更新
               URL url = new URL("http://xxxx/Android/version.json");
                   // 创建连接
                   HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                   conn.connect();
                   // 获取文件大小
                   int length = conn.getContentLength();
                   // 创建输入流
                   InputStream is = conn.getInputStream();
                   
                   result = inputStream2String(is);
                   
                   conn.disconnect();
                   
                   if(result.isEmpty())
                   {
                   result="找不到更新版本信息";
                   return result;
                   }
                   
                   JSONObject objJson = null;
                   
                   try
{
objJson = new JSONObject(formatString(result));  //因为json会有数据头(BOM),需要先去掉,否则在低版本中会报错
} catch (Exception e)
{
result = "无法使数据"+result+"生成JSONObject,异常信息:"+e.getMessage();
return result;
}
                   
                   String verCode = objJson.getString("verCode");
                   String verName = objJson.getString("verName");
                   String apkUrl = objJson.getString("apkUrl");
                   String apkName = objJson.getString("apkname");
                   
                   int versionCode = getVerCode(getApplicationContext());
                   if(!String.valueOf(versionCode).equals(verCode))
                   {
                   String sdpath = Environment.getExternalStorageDirectory() + "/";
                       String mSavePath = sdpath + "download";
                   //进行更新
                   url = new URL(apkUrl);
                   conn = (HttpURLConnection) url.openConnection();
                   conn.connect();
                       // 获取文件大小
                       length = conn.getContentLength();
                       // 创建输入流
                       is = conn.getInputStream();
                       
                       File f = new File(mSavePath+"/"+apkName);
                       if(f.exists())
                       {
                       f.delete();
                       }

                       File file = new File(mSavePath);
                       // 判断文件目录是否存在
                       if (!file.exists())
                       {
                           file.mkdir();
                       }
                       File apkFile = new File(mSavePath, apkName);
                       
                       FileOutputStream fos = new FileOutputStream(apkFile);
                       int count = 0;
                       // 缓存
                       byte buf[] = new byte[1024];
                       // 写入到文件中
                       do
                       {
                           int numread = is.read(buf);
                           count += numread;
                           // 计算进度条位置
                           progress = (int) (((float) count / length) * 100);
                           // 更新进度
                           mHandler.sendEmptyMessage(DOWNLOAD);
                           if (numread <= 0)
                           {
                               // 下载完成
                               mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
                               break;
                           }
                           // 写入文件
                           fos.write(buf, 0, numread);
                       } while (!cancelUpdate);// 点击取消就停止下载.
                       fos.close();
                       is.close();
                       
                       //安装
                       Intent intent = new Intent();
                       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                       intent.setAction(android.content.Intent.ACTION_VIEW);
                       intent.setDataAndType(Uri.fromFile(apkFile),"application/vnd.android.package-archive");
                       startActivity(intent);
                       
                       result = String.valueOf(versionCode)+"--"+verCode; 
                   }else{
                   result = "已是最新版本";
                   } 
                    }else{
                    result = "没有存储权限";
                    }
                    
            }else if(cmd.equals("UPDATE")){
            result = "暂未实现";
            }

   /*把InputStream 转成string*/

   public static String inputStream2String (InputStream in) throws IOException   {
    StringBuffer out = new StringBuffer();
    byte[]  b = new byte[4096];
    int n;
    while ((n = in.read(b))!= -1){
    out.append(new String(b,0,n));
    }
    //Log.i("String的长度",new Integer(out.length()).toString());
    return  out.toString();
    }
    
    /**  * 去除bom报头  */
    public static String formatString(String s) {     
    if (s != null) {           
    s = s.replaceAll("\ufeff", "");     
    }     
    return s; 
   } 

二、使用webview做界面

                myWebView = (WebView)findViewById(R.id.webApp);
myWebView.setPadding(0, 0, 0, 0);
WebSettings webSettings = myWebView.getSettings();
                webSettings.setSavePassword(false);
                webSettings.setSaveFormData(false);
                webSettings.setJavaScriptEnabled(true);
                webSettings.setSupportZoom(false);
myWebView.setWebChromeClient(new WebChromeClient());
myWebView.setWebViewClient(new WebViewClient());
myWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "WebApp");   //与js交互的接口

myWebView.loadDataWithBaseURL(null, "","text/html", "utf-8",null);

myWebView.loadUrl(HomeUrl+"?tm="+String.valueOf(System.nanoTime()));

final class DemoJavaScriptInterface {
 
        DemoJavaScriptInterface() {}
 
        /**
          * This is not called on the UI thread. Post a runnable to invoke
          * loadUrl on the UI thread.
          */
        
        public void clickOnAndroid() {
            mHandler.post(new Runnable() {
                public void run() {
                Toast.makeText(MainActivity.this, "test", 1).show();
                }
            });
        }

public String CallAndroid(String value)

{

String result = "00000|OK";

return result;

}

}


webview与js交互


js中调用Android中的函数

               var result = window.WebApp.CallAndroid("abc");  

  

android调用js中的函数

myWebView.loadUrl("javascript:Hello('abc')");


三、webview调用本地html


把html、js、css、images文件存在放在 assets 目录中,


WebView.loadUrl(“file:///android_asset/index.html”);

 

注意:index.html文件必须以 UTF-8文件格式保存,否则在 WebView 显示中文为乱码,需要增加

myWebView.getSettings().setDefaultTextEncodingName("gbk"); 这样的设置。


html文件中如果引用 js、css、images则也是使用assets的路径

<scripttype="text/javascript"src="file:///android_asset/js/jquery-1.8.3.min.js"></script>


四、设置Activity为全屏

  有二种方式,第一中是在AndroidManifest.xml中设置activity的theme的属性,第二中在代码中设置无法标题的全屏

第一种:

    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

第二种:

  在在onCreate()里指定没有标题

        super.onCreate(savedInstanceState); 
        /*set it to be no title*/ 
        requestWindowFeature(Window.FEATURE_NO_TITLE);   
         
        /*set it to be full screen*/ 
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,    
        WindowManager.LayoutParams.FLAG_FULLSCREEN); 
                         
        setContentView(R.layout.activity_main);


     


0 0