android實現靜默更新安裝並自動啟動
阿新 • • 發佈:2019-01-01
因為做的專案是裝在固定裝置上的,所有裝置都已root
一:當前版本號與伺服器版本對比 如有更新則去伺服器下載新版本
這個網上很多教程不多說
二:下載完儲存到某目錄下,自動安裝,無需手動點選確認
實現實際使用的是su pm install -r filepath命令。
核心程式碼如下:
protected void excutesucmd(String currenttempfilepath) { Process process = null; OutputStream out = null; InputStream in = null; try { // 請求root process = Runtime.getRuntime().exec("su"); out = process.getOutputStream(); // 呼叫安裝 out.write(("pm install -r " + currenttempfilepath + "\n").getBytes()); in = process.getInputStream(); int len = 0; byte[] bs = new byte[256]; while (-1 != (len = in.read(bs))) { String state = new String(bs, 0, len); if (state.equals("success\n")) { //安裝成功後的操作 //靜態註冊自啟動廣播 Intent intent=new Intent(); //與清單檔案的receiver的anction對應 intent.setAction("android.intent.action.PACKAGE_REPLACED"); //傳送廣播 sendBroadcast(intent); } } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.flush(); out.close(); } if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } } }
三、自啟動
註冊廣播UpdateRestartReceiver,監聽是否重新裝了安裝包
public class UpdateRestartReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){ //Toast.makeText(context,"已升級到新版本",Toast.LENGTH_SHORT).show(); Intent intent2 = new Intent(context, SplashActivity.class); intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent2); } } }
AndroidManifest.xml中
<receiver android:name=".updateversion.UpdateRestartReceiver" > <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> </intent-filter> </receiver>
靜態註冊啟用廣播:
//靜態註冊自啟動廣播
Intent intent=new Intent();
//與清單檔案的receiver的anction對應
intent.setAction("android.intent.action.PACKAGE_REPLACED");
//傳送廣播
sendBroadcast(intent);
所需許可權:
<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" />