zoukankan      html  css  js  c++  java
  • [android] 手机卫士应用程序更新和签名

    弹出升级对话框

    获取AlertDialog.Builder对象,通过new出来

    调用Builder对象的setTitle()方法,参数:文本

    调用Builder对象的setMessage()方法,参数:文本,json传回来的信息

    调用Builder对象的setPositiveButton()方法,设置确定按钮

    参数:文本,OnClickListener对象,匿名内部类实现,重写onClick()方法,

    方法里面下载APK,替换安装

    调用Builder对象的setNegativeButton()方法,参数和上面一样,点击后

    关闭对话框调用AlertDialog对象的dismiss()方法,

    跳转到主页

    调用Builder对象的show()方法,显示出来

    替换安装

    检查sdcard是否存在,

    调用Environment.getExternalStorageState()方法,返回状态,

    判断Environment.MEDIA_MOUNTED,如果不想等提示一下,如果相等就下载APK

    下载APK

    使用第三方库,afinal,拷贝到项目的libs目录下面

    实例化FinalHttp对象,通过new出来

    调用FinalHttp对象的download(url,target,callback)方法,下载文件,

    参数:url是路径,target是保存文件路径,callbackAjaxCallback对象

    保存路径:Environment.getExternalStorageDirectory()+"/mobilesafe2.0.apk"

    AjaxCallback是一个接口,通过new它实现接口,

    重写以下方法,onFailure(),onSuccess(),onLoading()

    下载失败

    显示错误信息,吐司

    正在下载 onLoading(long count,long current)

    显示进度,在布局文件中添加一个TextView显示进度,位于左下角

    onLoading()方法里,计算拼接好setText()显示出来

    下载成功 onSuccess()

    安装apk,发送隐式意图,获取Intent对象,通过new

    调用Intent对象的setAction()方法,设置动作,参数:android.intent.action.VIEW

    调用Intent对象的addCategory()添加类型,参数:android.intent.category.DEFAULT

    调用Intent对象的setDataAndType(),设置数据和类型,参数:Uri对象,

    application/vnd.android.package-archive

    Uri对象通过Uri.fromfile(),从文件中湖区Uri对象,参数是FIle对象

    调用startActivity(intent),开启

    需要写SD卡的权限,android.permission.WRITE_EXTERNAL_STORAFE

    签名

    在我们的android系统中,不允许安装两个包名相同的应用

    例如:

    A程序员开发了一款应用 com.tsh.A

    B程序员开发了一款应用 com.tsh.A

    包名相同,签名相同,可以替换安装

    包名相同,签名不相同,安装失败

    项目上右键 ==> export ==> Export Android Application ==>

    create new keystore ==>

    location 选中一个空文件最好命名 xxx.keystore

    password 写上密码

    confirm 重复密码==>

    Alias 例如:mobilesafe

    Password 刚才填的密码

    Confirm 重复密码

    Validity(years) 有效年份,过2030年,例如:40

    下面的不重要,按自己的填 ==>

    Destination APK file APK的保存路径

    生成一个apk,生成了一个keystore文件(非常重要),设置的密码一定要记住

    第二次导出的时候,

    选择Use existing keystore

    Password 写上刚才填的

    代码:

    package com.qingguow.mobilesafe;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import net.tsz.afinal.FinalHttp;
    import net.tsz.afinal.http.AjaxCallBack;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.Intent;
    import android.content.pm.PackageInfo;
    import android.content.pm.PackageManager;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.animation.AlphaAnimation;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.qingguow.mobilesafe.utils.StreamTools;
    
    public class SplashActivity extends Activity {
        private static final String TAG = "SplashActivity";
        protected static final int ENTER_HOME = 0;
        protected static final int VERSION_UPDATE = 1;
        protected static final int URL_ERROR = 2;
        protected static final int NETWORK_ERROR = 3;
        protected static final int JSON_ERROE = 4;
        private TextView tv_splash_version;
        private String description;
        private String apkurl;
        private TextView tv_show_progress;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
            tv_splash_version = (TextView) findViewById(R.id.tv_splash_version);
            tv_splash_version.setText("版本号" + getVersionName());
            // 检查更新
            checkVersion();
            // 界面动画
            AlphaAnimation aa = new AlphaAnimation(0.2f, 1.0f);
            aa.setDuration(1000);
            findViewById(R.id.rl_splash_root).setAnimation(aa);
            tv_show_progress=(TextView) findViewById(R.id.tv_show_progress);
        }
    
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case ENTER_HOME:
                    enterHome();
                    break;
                case VERSION_UPDATE:
                    // 弹窗提示
                    AlertDialog.Builder builder = new Builder(SplashActivity.this);
                    builder.setTitle("提示更新");
                    builder.setMessage(description);
    
                    builder.setPositiveButton("立即更新", new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            if (Environment.getExternalStorageState().equals(
                                    Environment.MEDIA_MOUNTED)) {
                                 FinalHttp finalhttp=new FinalHttp();
                                 finalhttp.download(apkurl,Environment.getExternalStorageDirectory()+"/mobilesafe2.0.apk",new AjaxCallBack<File>(){
                                     //下载失败
                                    @Override
                                    public void onFailure(Throwable t, int errorNo,
                                            String strMsg) {
                                        t.printStackTrace();
                                        Toast.makeText(getApplicationContext(), "下载失败",
                                                1).show();
                                        super.onFailure(t, errorNo, strMsg);
                                        enterHome();
                                    }
                                    //正在下载
                                    @Override
                                    public void onLoading(long count, long current) {
                                        int precent=(int)(current*100/count);
                                        tv_show_progress.setText("正在下载:"+precent+"%");
                                        super.onLoading(count, current);
                                    }
                                    //下载成功
                                    @Override
                                    public void onSuccess(File t) {
                                        Intent intent=new Intent();
                                        intent.setAction("android.intent.action.VIEW");
                                        intent.addCategory("android.intent.category.DEFAULT");
                                        intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");
                                        startActivity(intent);
                                        super.onSuccess(t);
                                    }
                                     
                                 });
                            } else {
                                Toast.makeText(getApplicationContext(), "未检测到SD卡",
                                        1).show();
                            }
    
                        }
                    });
                    builder.setNegativeButton("稍后再说", new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {
                            arg0.dismiss();
                            enterHome();
                        }
                    });
                    builder.show();
                    break;
                case URL_ERROR:
                    Toast.makeText(getApplicationContext(), "URL错误", 0).show();
                    enterHome();
                    break;
                case NETWORK_ERROR:
                    Toast.makeText(getApplicationContext(), "网络错误", 0).show();
                    enterHome();
                    break;
                case JSON_ERROE:
                    Toast.makeText(getApplicationContext(), "JSON解析错误", 0).show();
                    enterHome();
                    break;
    
                }
            }
    
        };
    
        /**
         * 进入主页
         */
        private void enterHome() {
            Intent intent = new Intent(SplashActivity.this, HomeActivity.class);
            startActivity(intent);
            finish();
        };
    
        /**
         * 检查新版本
         */
        private void checkVersion() {
            new Thread() {
                public void run() {
                    long startTime = System.currentTimeMillis();
                    Message mes = Message.obtain();
                    URL url;
                    try {
                        url = new URL(getString(R.string.serverurl));
                        HttpURLConnection conn = (HttpURLConnection) url
                                .openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(4000);
                        int code = conn.getResponseCode();
                        if (code == 200) {
                            InputStream is = conn.getInputStream();
                            String result = StreamTools.readInputStream(is);
                            JSONObject json = new JSONObject(result);
                            String newVersion = (String) json.get("version");
                            if (newVersion.equals(getVersionName())) {
                                // 进入主界面
                                mes.what = ENTER_HOME;
                            } else {
                                // 版本更新
                                mes.what = VERSION_UPDATE;
                                description = (String) json.get("description");
                                apkurl = (String) json.get("apkurl");
                            }
                        }
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                        Log.i(TAG, "URL错误");
                        mes.what = URL_ERROR;
                    } catch (IOException e) {
                        e.printStackTrace();
                        Log.i(TAG, "网络连接错误");
                        mes.what = NETWORK_ERROR;
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.i(TAG, "JSON解析错误");
                        mes.what = JSON_ERROE;
                    } finally {
                        // 延迟效果
                        long endTime = System.currentTimeMillis();
                        long dTime = endTime - startTime;
                        if (dTime < 3000) {
                            try {
                                Thread.sleep(3000 - dTime);
                            } catch (InterruptedException e) {
                            }
                        }
                        handler.sendMessage(mes);
                    }
    
                };
            }.start();
    
        }
    
        // 获得应用版本名称
        private String getVersionName() {
            PackageManager pm = getPackageManager();
            try {
                PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
                return info.versionName;
            } catch (Exception e) {
                e.printStackTrace();
                return "";
            }
    
        }
    }
  • 相关阅读:
    JQuery2
    Java基础复习4
    HTML基础复习4
    Java基础复习3
    HTML基础复习3
    HTML基础复习2
    HTML基础复习1
    shiro权限管理(认证和授权)
    权限管理(认证和授权)
    关于mybatis动态sql的if标签的一个问题
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5357107.html
Copyright © 2011-2022 走看看