Android 通过DownloadManager实现自动更新的demo

时间:2022-09-22 22:54:25

自动更新,其实说白了,就是下载apk,安装apk。

代码下载地址:Android自动更新的demo


实现自动更新的路径两种:

第一种:(可以参考http://blog.csdn.net/furongkang/article/details/6886526

0:下载配置文件

1:查看配置文件里面的版本信息,如果版本信息比当前的版本的大,那么就执行下面的,否则不更新

2:下载apk

3:安装apk
第二种:(可以参考 http://blog.csdn.net/evn512457/article/details/28626621

如果后台可以提供一个接口也可以,就是我们将当前的版本传过去,然后后台返回是否需要更新,如果需要,给出url,

下载apk,

安装apk,


我们这里不考虑下载配置文件和解析配置文件的内容,我们采用第二种,就是我们获取了更新的apk的网络地址,如何更新。


步骤和全部代码如下:


0:服务UpdateServer,里面包含了广播接收者就是接收什么时候下载完了,下载完了就开始安装
1:然后在主界面可以添加一个按钮,也可以不添加,添加主要为了更好的看到效果而已,在按钮的点击事件里面启动上面的服务
2:记得注册服务,权限,还有版本号的修改


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

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始更新"
android:textColor="@android:color/holo_red_dark"
android:onClick="update"/>

</RelativeLayout>


注册服务:

<pre name="code" class="html"><service android:name=".UpdateService"    android:enabled="true"/>


 

权限:

    <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />


版本号:

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 安装到手机上面,点击中间的更新按钮,就可以安装了。


参考: http://blog.csdn.net/evn512457/article/details/28626621