前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[android] 手机卫士应用程序更新和签名

[android] 手机卫士应用程序更新和签名

作者头像
唯一Chat
发布2019-09-10 12:08:06
5420
发布2019-09-10 12:08:06
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

弹出升级对话框

获取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是保存文件路径,callback是AjaxCallback对象

保存路径: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 写上刚才填的

代码:

代码语言:javascript
复制
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 "";
        }

    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-04-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档