[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是保存文件路径,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程序应用开发手机开发无线开发移动端开发相关文章
- python线程间通信的方式_android 线程间通信
- android签名命令行,Android系统签名位置及命令
- Android TV androidx.leanback:leanback 开箱体验
- android应用程序_chrome Android
- Android平台GB28181设备接入侧(编码前|编码后|RTSP|RTMP)支持功能浅析
- Android 系统 目录 分析「建议收藏」
- Android 13 SDK更新内容
- 【Android 应用开发】自定义View 和 ViewGroup
- 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 后续分析 )
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
- 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
- 【Android Gradle 插件】Gradle 构建机制 ① ( 空白工程 Gradle 构建文件 | IntelliJ IDEA 工程构建文件 | Android Studio 工程构建文件 )
- 【错误记录】Android Studio 编译报错 ( To use data binding annotations in Kotlin, apply the ‘kotlin-kapt‘ plu )
- Java反射改变Android属性详解手机开发
- Android OkHttp(1)详解手机开发
- Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件详解手机开发
- 报告:数千款iOS/Android应用泄露了113 GB数据详解手机开发
- [android] 看博客学习Android常见的几种RuntimeException详解手机开发
- [android] 手机卫士保存安全号码详解手机开发
- [android] 网络html查看器详解手机开发
- android VPN编程详解手机开发
- Android存储系统的架构与设计详解手机开发
- Android ListView SimpleAdapter支持Bitmap类型图片显示详解手机开发
- 铃声多多下载 铃声多多手机版 7.7.3.0 Android版下载
- android获取手机cpu并判断是单核还是多核
- android中sqlite的按条件查找的小例子
- Android对sdcard扩展卡文件操作实例详解
- Android提高之Android手机与BLE终端通信