1. 程式人生 > >android實現靜默更新安裝並自動啟動

android實現靜默更新安裝並自動啟動

因為做的專案是裝在固定裝置上的,所有裝置都已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" />