前段时间公司要求实现app的静默升级安装并自启动,写完都有一个多月了,现在总结下.公司的app只会安装在我们定制的广告平板上,所以都是有root权限的,至于如何获取root权限,这里就不说了.直接上代码
一:当前版本号与服务器版本对比 如有更新则去服务器下载新版本
// 获取当前软件版本号 versionCode=context.getPackageManager(). getPackageInfo(context.getPackageName(), 0).versionCode;
再去服务器获取新版本号,网络请求就不讲了,方法很多,得到两个版本号之后对比有新的则去服务器下载新版本APK
二:将新版本apk存至sd卡
Process prcess=getRuntime.exec("su");//申请root权限
再执行adb命令:"pm install -r "+apkPath,
这一步就执行完静默安装了,一个执行adb命令的工具(这个工具是我在网上找的,找不到原作者....如被原作者碰到 我就删了):执行adb命令工具
三;自启动,也算是最难的一部分
这块做的时候在网上找了很多资料,发现有的地方并没有网上讲的那么复杂,最后完成的思路是注册了一个广播,监听是否重新装了安装包
<receiver android:name=".broadcastreceiver.BCRUpgradeApk" > <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> </intent-filter> </receiver>
注册这个广播的时候碰到了一个坑爹的问题,我们这个app之前也有一个广播监听开机自启动,把两个广播写在一个receiver里面就不起作用,分开写好了,也不知道为什么.....有人知道可以告诉下我
在收到这个广播的时候自启动就ok了
if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){ Toast.makeText(context,"升级了一个安装包",Toast.LENGTH_SHORT).show(); Intent intent2 = new Intent(context, StartUpActivity.class); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent2); }
我这样写是完美实现哦.....!!!!!,实现了才发现没有网上说的那么复杂
所需的权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name= "android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" />
总共就这么多啦! 完事
一个多月之前完成的现在才总结....以后有时间了及时总结!!!!!!!!