自动更新,其实说白了,就是下载apk,安装apk。
代码下载地址:Android自动更新的demo
实现自动更新的路径两种:
第一种:(可以参考http://blog.csdn.net/furongkang/article/details/6886526)
第二种:(可以参考 http://blog.csdn.net/evn512457/article/details/28626621)0:下载配置文件
1:查看配置文件里面的版本信息,如果版本信息比当前的版本的大,那么就执行下面的,否则不更新
2:下载apk
3:安装apk
如果后台可以提供一个接口也可以,就是我们将当前的版本传过去,然后后台返回是否需要更新,如果需要,给出url,
下载apk,
安装apk,
我们这里不考虑下载配置文件和解析配置文件的内容,我们采用第二种,就是我们获取了更新的apk的网络地址,如何更新。
步骤和全部代码如下:
UpdateService
/**
* Created by Kodulf on 2017/5/8.
*/
import android.app.DownloadManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
/**
* http://blog.csdn.net/rodulf/article/details/51706788
*/
public class UpdateService extends Service {
public UpdateService() {
}
/** 安卓系统下载类 **/
DownloadManager manager;
/** 接收下载完的广播 **/
DownloadCompleteReceiver receiver;
/** 初始化下载器 **/
private void initDownManager() {
manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
receiver = new DownloadCompleteReceiver();
//设置下载地址
String urlPath = "http://47.93.61.22/wordpress/app-release.apk";
Uri parse = Uri.parse(urlPath);
DownloadManager.Request down = new DownloadManager.Request(parse);
// 百度音乐 Uri.parse("http://gdown.baidu.com/data/wisegame/fd84b7f6746f0b18/baiduyinyue_4802.apk"));
// 乐视体育
//Uri.parse("http://122.228.237.132/apk.r1.market.hiapk.com/data/upload/apkres/2016/6_12/16/com.lesports.glivesports_040405.apk"));
// 设置允许使用的网络类型,这里是移动网络和wifi都可以
down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
// 下载时,通知栏显示途中
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
}
// 显示下载界面
down.setVisibleInDownloadsUi(true);
// 设置下载后文件存放的位置
String apkName = parse.getLastPathSegment();
down.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, apkName);
// 将下载请求放入队列
manager.enqueue(down);
//注册下载广播
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 调用下载
initDownManager();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
// 注销下载广播
if (receiver != null)
unregisterReceiver(receiver);
super.onDestroy();
}
// 接受下载完成后的intent
class DownloadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断是否下载完成的广播
if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
//获取下载的文件id
long downId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Log.d("kodulf","id="+downId);
//自动安装apk
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
Uri uriForDownloadedFile = manager.getUriForDownloadedFile(downId);
Log.d("kodulf","uri="+uriForDownloadedFile);
installApkNew(uriForDownloadedFile);
}
//停止服务并关闭广播
UpdateService.this.stopSelf();
}
}
//安装apk
protected void installApkNew(Uri uri) {
Intent intent = new Intent();
//执行动作
intent.setAction(Intent.ACTION_VIEW);
//执行的数据类型
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
//不加下面这句话是可以的,查考的里面说如果不加上这句的话在apk安装完成之后点击单开会崩溃
// android.os.Process.killProcess(android.os.Process.myPid());
try {
startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*
* @param view
*/
public void update(View view) {
new Thread(new Runnable() {
@Override
public void run() {
//启动服务
Intent service = new Intent(MainActivity.this,UpdateService.class);
startService(service);
}
}).start();
}
}
xml:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="tech.androidstudio.autoupdate.MainActivity">
注册服务:
权限:
版本号:
builder.gradler 里面的
defaultConfig {
applicationId "tech.androidstudio.autoupdate"
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName "1.0.0"
}
0:将代码中的gradler 里面的版本号修改为2,生成app-release.apk,将这个apk 放到我们的服务器上面,例如我们自己的tomcat的服务器上面
1:修改DownloadManager里面的URL 指向我们的tomcat 上面的地址,一定要记住了不能使用127.0.0.1 而是要用实际的ip地址例如192.168.0.128
要保证这个URL 在浏览器中输入的时候可以直接下载上面的版本2的apk
2:将代码中的gradler里面的版本号修改为1,生成app-release.apk
3:将这个apk 安装到手机上面,点击中间的更新按钮,就可以安装了。