简述更新的实现原理(想直奔主题的小伙伴可以略过这些):
服务器上存放要更新的 安装包、Json串,Json里主要是关于要更新内容的描述,例,
分别针对两种安卓设备:1.已root 2.未root
1.询问用户是否更新的弹窗是自己实现的,也就是说,可以不弹窗,直接下载。
2.下载完成后,进行静默安装,此方法不会弹窗提示用户
静默安装是需要root权限的,直接上方法吧
/* @pararm apkPath 等待安装的app全路径,如:/sdcard/app/app.apk **/ private static boolean clientInstall(String apkPath) { PrintWriter PrintWriter = null; Process process = null; try { process = Runtime.getRuntime().exec("su"); PrintWriter = new PrintWriter(process.getOutputStream()); PrintWriter.println("chmod 777 " + apkPath); PrintWriter .println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib"); PrintWriter.println("pm install -r " + apkPath); // PrintWriter.println("exit"); PrintWriter.flush(); PrintWriter.close(); int value = process.waitFor(); Log.d("TAG","静默安装返回值:"+value); return true; } catch (Exception e) { e.printStackTrace(); Log.d("TAG","安装apk出现异常"); } finally { if (process != null) { process.destroy(); } } return false; }
3.安装完成后自动打开的方法:
在软件升级、安装、卸载时,系统会分别发这三个广播:
<action android:name="android.intent.action.PACKAGE_REPLACED"/> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REMOVED" />
所以我们根据自己需要可以分别接收这几个广播,我做的是升级,所以接收 "PACKAGE_REPLACED" 这个广播,
接收到广播后要判断软件包名是否一致。如果一致则自启动软件,下面是我接收的广播,
public class UpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){ if (intent.getDataString().equals(context.getPackageName())){ Log.d("TAG","收到广播,包名一致"); Intent intent2 = new Intent(context, MainActivity.class); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent2); }else { Log.d("TAG","收到广播,包名不一致"); } } } }
如果不判断包名是否一致,有别的软件安装或升级,而你是接收了这个广播的,只要接收了这个广播的都会启动,
所以会造成启动混乱。这时候你用 intent.getDataString(),取到传过来的包名与自己的包名进行一下比较一下,
符合条件启动就OK了。
注册广播:
<receiver android:name=".receiver.UpdateReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> intent-filter> receiver>
如果你的使用场景不是升级自身,而是安装别的apk并打开,你监听 "PACKAGE_ADDED"这个就可以实现了。