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 "";
            }
    
        }
    }
  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5357107.html
Copyright © 2011-2022 走看看