• Phonegap 安卓的自动升级与更新。当版本为4.0的时候


    清单文件中:

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14"/>
    View Code

    js文件:

    [{"verName":"xinjiangQJ","verCode":2}]
    View Code

    主窗口MainActivity中的代码:

    package fx.qj.cn;
    
    import android.os.Bundle;
    
    
    import android.view.KeyEvent;
    import android.view.Menu; 
    import android.view.MenuItem;
    import android.view.Window;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.PackageManager.NameNotFoundException;
    import android.net.Uri;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import org.apache.cordova.*;
    
    
    
    public class MainActivity extends DroidGap {
         private long exitTime = 0;
        //自动检查更新开始
            private String localApkName = "XJQJW。apk";//存在于本地的apk名字
            private String packageName = "fx.qj.cn";//本应用包名,用于获取本地版本号
            private int serverVersion = 0;//服务端版本号
            private int localVersion = 0;//本地版本号
            private ProgressDialog pBar = null;//“正在下载”对话框
            
        @Override
        public void onCreate(Bundle savedInstanceState) {
             requestWindowFeature(Window.FEATURE_NO_TITLE);
              super.onCreate(savedInstanceState);
              super.init();
              android.webkit.WebSettings settings = super.appView.getSettings();
              String appCachePath = this.getCacheDir().getAbsolutePath();
              settings.setAppCachePath(appCachePath);
              settings.setAllowFileAccess(true);
              settings.setAppCacheEnabled(true);
              super.setIntegerProperty("splashscreen",R.drawable.startup_bg1);
              super.loadUrl("file:///android_asset/www/index.html",5000);
              checkUpdate();//自动检查更新
        }
        
        //双击退出
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                exit();
                return false;
            }
            return super.onKeyDown(keyCode, event);
        }
    
        public void exit() {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
                System.exit(0);
            }
        }
        
        //自动更新
        private void checkUpdate() {
            localVersion = getLocalVersion();
            new Thread() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    super.run();
                    URL url_2;
                    String str = "";
                    int apkVersion = 0;
                    String apkPath = "";
                    try {
                        String path=getResources().getString(R.string.url_server); 
                        url_2 = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url_2
                                .openConnection();
                        conn.setConnectTimeout(5000);
                        InputStream is = conn.getInputStream();
                        byte[] json = new byte[1024];
                        is.read(json);
                        str = new String(json, "utf-8");
                        JSONArray array = new JSONArray(str);
                        JSONObject item = array.getJSONObject(0);
                        apkVersion = item.getInt("verCode");
                        String apkpath=getResources().getString(R.string.url_server); 
                        apkPath = apkpath;
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                    Bundle data = new Bundle();
                    data.putInt("apkVersion", apkVersion);
                    data.putString("apkPath", apkPath);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.setData(data);
                    hander.sendMessage(msg);
                }
    
            }.start();
        }
        
        private int getLocalVersion(){
            int version=-1;
            try {
                version = this.getPackageManager().getPackageInfo(packageName, 0).versionCode;
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.e("TAG",e.getMessage());
            }
            return version;
        }
        
        
        
        private Handler hander = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                case 1:
                    Bundle b = msg.getData();
                    serverVersion = b.getInt("apkVersion");
                    final String apkPath = b.getString("apkPath");
                    Log.v("apkVersion", serverVersion+"");
                    if(localVersion<serverVersion){
                        AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                    alert.setTitle("软件更新").setMessage("发现新版本,建议立即更新使用.").setPositiveButton("更新", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 确定更新
                            pBar = new ProgressDialog(MainActivity.this);
                            pBar.setTitle("正在下载");
                            pBar.setMessage("请稍后。。。");
                            pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                            String apkpath=getResources().getString(R.string.url_apk); 
                            downFile(apkpath);
                        }
                    }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    alert.create().show();
                    }
                    break;
                }
            }
        };
        
        public void downFile(final String url){
            pBar.show();
            new Thread(){
                public void run(){
                    HttpClient client = new DefaultHttpClient();
                    HttpGet get = new HttpGet(url);
                    HttpResponse response;
                    System.out.println(url);
                    try {
                        response = client.execute(get);
                        HttpEntity entity = response.getEntity();
                        long length = entity.getContentLength();
                        InputStream is =  entity.getContent();
                        FileOutputStream fileOutputStream = null;
                        if(is != null){
                            File file = new File(Environment.getExternalStorageDirectory(),localApkName);
                            fileOutputStream = new FileOutputStream(file);
                            byte[] b = new byte[1024];
                            int charb = -1;
                            int count = 0;
                            while((charb = is.read(b))!=-1){
                                fileOutputStream.write(b, 0, charb);
                                count += charb;
                            }
                        }
                        fileOutputStream.flush();
                        if(fileOutputStream!=null){
                            fileOutputStream.close();
                        }
                        down();
                    }  catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }.start();
        }
        
        
        
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);   
                pBar.cancel();
                update();
            }
        };
        
        public void down(){
            new Thread(){
                public void run(){
                    Message message = handler.obtainMessage();
                    handler.sendMessage(message);
                }
            }.start();
        }
        
        public void update(){
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),localApkName))
                    , "application/vnd.android.package-archive");
            startActivity(intent);
        }
    }
    View Code

    把http请求【HttpURLConnection conn = (HttpURLConnection) url_2.openConnection();】放到了主线程中来运行,

    报错android.os.NetworkOnMainThreadException

    直接翻译就是:网络工作在主线程中的异常;网上一查发现是android中规定网络请求等耗时操作是不允许在主线程中出现的,需要另起线程,线程若有数据需要与主线程交互就可以用handler来接收。

    参考资料连接: http://my.eoe.cn/1222037/archive/21064.html

  • 相关阅读:
    PhpStorm 2019.3 汉化包
    PHP性能监控
    Jsonp post 跨域方案
    解决前后端调用,跨域二次请求Access-Control-Max-Age
    npm安装全局模块之后项目提示找不到的解决
    centos7 安装nodejs 最新版
    基于 ThinkJS 的 WebSocket 通信详解
    php方法注释
    恶意评论过滤插件
    redis与memcached区别
  • 原文地址:https://www.cnblogs.com/Jokers/p/3543393.html
Copyright © 2020-2023  润新知