[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;
 java.io.IOException;
 java.io.InputStream;
 java.net.HttpURLConnection;
 java.net.MalformedURLException;
 java.net.URL;

 net.tsz.afinal.FinalHttp;
 net.tsz.afinal.http.AjaxCallBack;

 org.json.JSONException;
 org.json.JSONObject;

 android.app.Activity;
 android.app.AlertDialog;
 android.app.AlertDialog.Builder;
 android.content.DialogInterface;
 android.content.DialogInterface.OnClickListener;
 android.content.Intent;
 android.content.pm.PackageInfo;
 android.content.pm.PackageManager;
 android.net.Uri;
 android.os.Bundle;
 android.os.Environment;
 android.os.Handler;
 android.os.Message;
 android.util.Log;
 android.view.animation.AlphaAnimation;
 android.widget.TextView;
 android.widget.Toast;

 com.qingguow.mobilesafe.utils.StreamTools;

public class SplashActivity extends Activity {
    private static final String TAG = "SplashActivity";
    protected final int ENTER_HOME = 0int VERSION_UPDATE = 1int URL_ERROR = 2int NETWORK_ERROR = 3int JSON_ERROE = 4private TextView tv_splash_version;
     String description;
     String apkurl;
     TextView tv_show_progress;

    @Override
    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() {
         handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case ENTER_HOME:
                enterHome();
                break;
             VERSION_UPDATE:
                 弹窗提示
                AlertDialog.Builder builder = new Builder(SplashActivity.this);
                builder.setTitle("提示更新");
                builder.setMessage(description);

                builder.setPositiveButton("立即更新", OnClickListener() {
                    @Override
                    void onClick(DialogInterface arg0,1)">int arg1) {
                        if (Environment.getExternalStorageState().equals(
                                Environment.MEDIA_MOUNTED)) {
                             FinalHttp finalhttp= FinalHttp();
                             finalhttp.download(apkurl,Environment.getExternalStorageDirectory()+"/mobilesafe2.0.apk",1)">new AjaxCallBack<File>(){
                                 下载失败
                                @Override
                                void onFailure(Throwable t,1)"> errorNo,String strMsg) {
                                    t.printStackTrace();
                                    Toast.makeText(getApplicationContext(),"下载失败",1).show();
                                    .onFailure(t,errorNo,strMsg);
                                    enterHome();
                                }
                                正在下载
void onLoading(long count,1)">long current) {
                                    int precent=(int)(current*100/count);
                                    tv_show_progress.setText("正在下载:"+precent+"%");
                                    .onLoading(count,current);
                                }
                                下载成功
 onSuccess(File t) {
                                    Intent intent= 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);
                                    .onSuccess(t);
                                }
                                 
                             });
                        } else {
                            Toast.makeText(getApplicationContext(),"未检测到SD卡").show();
                        }

                    }
                });
                builder.setNegativeButton("稍后再说",1)"> arg1) {
                        arg0.dismiss();
                        enterHome();
                    }
                });
                builder.show();
                 URL_ERROR:
                Toast.makeText(getApplicationContext(),"URL错误",0).show();
                enterHome();
                 NETWORK_ERROR:
                Toast.makeText(getApplicationContext(),"网络错误",1)"> JSON_ERROE:
                Toast.makeText(getApplicationContext(),"JSON解析错误",1)">;

            }
        }

    };

    /**
     * 进入主页
     */
     enterHome() {
        Intent intent = new Intent(SplashActivity.this,HomeActivity.class);
        startActivity(intent);
        finish();
    };

    
     * 检查新版本
      checkVersion() {
         Thread() {
             run() {
                long startTime = System.currentTimeMillis();
                Message mes = Message.obtain();
                URL url;
                try {
                    url =  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 =  JSONObject(result);
                        String newVersion = (String) json.get("version");
                         (newVersion.equals(getVersionName())) {
                             进入主界面
                            mes.what = ENTER_HOME;
                        }  {
                             版本更新
                            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;
                }  (IOException e) {
                    e.printStackTrace();
                    Log.i(TAG,"网络连接错误" NETWORK_ERROR;
                }  (JSONException e) {
                    e.printStackTrace();
                    Log.i(TAG,"JSON解析错误" JSON_ERROE;
                } finally {
                     延迟效果
                    long endTime = System.currentTimeMillis();
                    long dTime = endTime - startTime;
                    if (dTime < 3000) {
                         {
                            Thread.sleep(3000 - dTime);
                        }  (InterruptedException e) {
                        }
                    }
                    handler.sendMessage(mes);
                }

            };
        }.start();

    }

     获得应用版本名称
     String getVersionName() {
        PackageManager pm = getPackageManager();
         {
            PackageInfo info = pm.getPackageInfo(getPackageName(),1)">);
            return info.versionName;
        }  (Exception e) {
            e.printStackTrace();
            return "";
        }

    }
}

 

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...