Android软件自动更新功能实现的方法
相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能
首先看一下程序目录结构
步骤:
1、新建一个类UpdateManger,用于显示提示更新
publicclassUpdateManger{
//应用程序Context
privateContextmContext;
//提示消息
privateStringupdateMsg="有最新的软件包,请下载!";
//下载安装包的网络路径
privateStringapkUrl="http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk";
privateDialognoticeDialog;//提示有软件更新的对话框
privateDialogdownloadDialog;//下载对话框
privatestaticfinalStringsavePath="/sdcard/updatedemo/";//保存apk的文件夹
privatestaticfinalStringsaveFileName=savePath+"UpdateDemoRelease.apk";
//进度条与通知UI刷新的handler和msg常量
privateProgressBarmProgress;
privatestaticfinalintDOWN_UPDATE=1;
privatestaticfinalintDOWN_OVER=2;
privateintprogress;//当前进度
privateThreaddownLoadThread;//下载线程
privatebooleaninterceptFlag=false;//用户取消下载
//通知处理刷新界面的handler
privateHandlermHandler=newHandler(){
@SuppressLint("HandlerLeak")
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseDOWN_UPDATE:
mProgress.setProgress(progress);
break;
caseDOWN_OVER:
installApk();
break;
}
super.handleMessage(msg);
}
};
publicUpdateManger(Contextcontext){
this.mContext=context;
}
//显示更新程序对话框,供主程序调用
publicvoidcheckUpdateInfo(){
showNoticeDialog();
}
privatevoidshowNoticeDialog(){
android.app.AlertDialog.Builderbuilder=newandroid.app.AlertDialog.Builder(
mContext);//Builder,可以通过此builder设置改变AleartDialog的默认的主题样式及属性相关信息
builder.setTitle("软件版本更新");
builder.setMessage(updateMsg);
builder.setPositiveButton("下载",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();//当取消对话框后进行操作一定的代码?取消对话框
showDownloadDialog();
}
});
builder.setNegativeButton("以后再说",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();
}
});
noticeDialog=builder.create();
noticeDialog.show();
}
protectedvoidshowDownloadDialog(){
android.app.AlertDialog.Builderbuilder=newandroid.app.AlertDialog.Builder(mContext);
builder.setTitle("软件版本更新");
finalLayoutInflaterinflater=LayoutInflater.from(mContext);
Viewv=inflater.inflate(R.layout.progress,null);mProgress=(ProgressBar)v.findViewById(R.id.progress);
builder.setView(v);//设置对话框的内容为一个View
builder.setNegativeButton("取消",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();
interceptFlag=true;
}
});
downloadDialog=builder.create();
downloadDialog.show();
downloadApk();
}
privatevoiddownloadApk(){
downLoadThread=newThread(mdownApkRunnable);
downLoadThread.start();
}
protectedvoidinstallApk(){
Fileapkfile=newFile(saveFileName);
if(!apkfile.exists()){
return;
}
Intenti=newIntent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://"+apkfile.toString()),
"application/vnd.android.package-archive");//File.toString()会返回路径信息
mContext.startActivity(i);
}
privateRunnablemdownApkRunnable=newRunnable(){
@Override
publicvoidrun(){
URLurl;
try{
url=newURL(apkUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
conn.connect();
intlength=conn.getContentLength();
InputStreamins=conn.getInputStream();Filefile=newFile(savePath);
if(!file.exists()){
file.mkdir();
}
StringapkFile=saveFileName;
FileApkFile=newFile(apkFile);
FileOutputStreamoutStream=newFileOutputStream(ApkFile);
intcount=0;
bytebuf[]=newbyte[1024];
do{
intnumread=ins.read(buf);
count+=numread;
progress=(int)(((float)count/length)*100);
//下载进度
mHandler.sendEmptyMessage(DOWN_UPDATE);
if(numread<=0){
//下载完成通知安装
mHandler.sendEmptyMessage(DOWN_OVER);
break;
}
outStream.write(buf,0,numread);
}while(!interceptFlag);//点击取消停止下载
outStream.close();
ins.close();
}catch(Exceptione){
e.printStackTrace();
}
}
};
}
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3、在MainActivity中onCreate()方法中,进行软件更新的检测
mUpdateManger=newUpdateManger(MainActivity.this);//注意此处不能传入getApplicationContext();会报错,因为只有是一个Activity才可以添加窗体
mUpdateManger.checkUpdateInfo();
并且在配置清单文件中添加网络权限 <uses-permissionandroid:name="android.permission.INTERNET"/>
4、运行程序
相关文章
- Android SDK 安装及环境配置教程
- android activity singletask,Android Activity启动模式之singleTask实例详解
- Android 性能采集之Fps,Memory,Cpu | 性能监控系列
- [译] 将通用 Android 音乐播放器转化为 instant 应用
- 谷歌自研数据中心芯片预计明年下半年量产;Bing即将发布iOS和Android移动版;百度收购GBI,加码AI医疗丨每日大事件
- 【Android 应用开发】 ActionBar 基础
- 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )
- 【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )
- 【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )
- [android] 天气app布局练习(三)详解手机开发
- 关于Android PullTorefreshScrollview回到顶部实例详解手机开发
- android最新更新方法详解手机开发
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅详解手机开发
- android 巧用finish方法详解手机开发
- Android Auto 为何学 Carplay?
- 初识Facebook的强大Android图片加载的框架:Fresco
- 解决Fedora14下eclipse进行android开发,ibus提示没有输入窗口的方法详解
- Android往Framework中添加新资源的方法详解
- android开发教程之时间对话框核心代码
- Android判断和监听底座状态和类型的方法介绍
- Android实现检查并下载APK更新、安装APK及获取网络信息的方法
- Android天气预报之基于HttpGet对象解析天气数据的方法