分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
自动更新,其实说白了,就是下载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的网络地址,如何更新。
步骤和全部代码如下:
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