Android apk靜默安裝完成後自啓動

1.apk靜默安裝的代碼

 public boolean silentInstall(Context context, String filePath) {
        File file = new File(filePath);
        PackageManager packageManager = context.getPackageManager();
        Class<?> pmClz = packageManager.getClass();
        try {
            if (Build.VERSION.SDK_INT >= 21) {
                Class<?> aClass = Class.forName("android.app.PackageInstallObserver");
                Constructor<?> constructor = aClass.getDeclaredConstructor();
                constructor.setAccessible(true);
                Object installObserver = constructor.newInstance();
                Method method = pmClz.getDeclaredMethod("installPackage", Uri.class, aClass, int.class, String.class);
                method.setAccessible(true);
                method.invoke(packageManager, Uri.fromFile(file), installObserver, 2, null);
            } else {
                Method method = pmClz.getDeclaredMethod("installPackage",
                        Uri.class, Class.forName("android.content.pm.IPackageInstallObserver"), int.class, String.class);
                method.setAccessible(true);
                method.invoke(packageManager, Uri.fromFile(file), null, 2, null);
            }
            return true;
        } catch (Exception e) {          
            e.printStackTrace();
        }
        return false;
    }

2.apk安裝後自啓動的前提是:

       安裝完成會觸發“android.intent.action.PACKAGE_REPLACED”廣播,apk覆蓋安裝後會接收到該廣播,初次安裝不會觸發。這個廣播需要靜態註冊如下:

        <receiver android:name=".receiver.MyReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>

3.需要如下權限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

4.自己定義的廣播接收器

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String localPkgName = context.getPackageName();
        //取得MyReceiver所在的App的包名
        Uri data = intent.getData();
        String installedPkgName = data.getSchemeSpecificPart();
        //取得安裝的Apk的包名,只在該app覆蓋安裝後自啓動
        if ((action.equals(Intent.ACTION_PACKAGE_ADDED) || action.equals(Intent.ACTION_PACKAGE_REPLACED)) && installedPkgName.equals(localPkgName)) {
            /**
             * 啓動activity
             */
            Intent mIntent = new Intent( );
            mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            ComponentName comp = new ComponentName("xxx包名", "xxx啓動的activity");
            mIntent.setComponent(comp);
            mIntent.setAction("android.intent.action.VIEW");
            context.startActivity(mIntent);

        }
    }
}

5.參考文檔

https://blog.csdn.net/qq_23261197/article/details/86240372

https://blog.csdn.net/mythmayor/article/details/80653621

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章