zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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

Android手机应用程序开发 详解 更新 签名 卫士
2023-06-13 09:20:13 时间

获取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 写上刚才填的

代码:

 

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 ""; 

}

 

5439.html

app程序应用开发手机开发无线开发移动端开发