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

Posted 陶士涵的菜地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 "";
        }

    }
}

 

以上是关于[android] 手机卫士应用程序更新和签名的主要内容,如果未能解决你的问题,请参考以下文章

Android 手机卫士--弹出对话框

Android 手机卫士--打包生成apk维护到服务器

Android 手机卫士11--窗体弹出PopupWindow

Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

[android] 手机卫士欢迎页检测更新

Android 手机卫士--是否有密码区分对话框类型