是否可以在运行时以编程方式更新Android Manifest?

Mas*_*han 5 android android-manifest

我要实现的目标:

我正在创建一个应用程序,该程序可以通过编程方式更改应用程序图标和应用程序名称。

我所取得的成就:

我已经实现了这一点,因为通过在Android清单中声明活动别名,只有5个名称和图标。

我面临的问题:

如果您只有5个名字,那么很容易在清单中声明它。但是,如果您不知道该怎么办。名称,您必须以编程方式更新清单。

下面是我的代码:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.drawerstack">

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity-alias android:label="@string/app_name1"
            android:icon="@drawable/ic_launcher"
            android:name=".MainActivity-Red"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name2"
            android:icon="@drawable/ic_launcher_1"
            android:name=".MainActivity-Pink"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name3"
            android:icon="@drawable/ic_launcher_2"
            android:name=".MainActivity-Blue"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias android:label="@string/app_name4"
            android:icon="@drawable/ic_launcher_3"
            android:name=".MainActivity-Grey"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java中

    img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (view.getTag().equals(0)) {
                changeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Grey");
            } else if (view.getTag().equals(1)) {
                changeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
            } else if (view.getTag().equals(2)) {
                changeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity");
            } else if (view.getTag().equals(3)) {
                changeIcon("com.drawerstack.MainActivity-Grey");
                removeIcon("com.drawerstack.MainActivity-Pink");
                removeIcon("com.drawerstack.MainActivity-Red");
                removeIcon("com.drawerstack.MainActivity-Blue");
                removeIcon("com.drawerstack.MainActivity");
            }
        }
    });


private void changeIcon(final String pkgName) {

    doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Date now = new Date();
            if(now.after(afterDate)){
                timer.cancel();
                Common.dismissProgressDialog(MainActivity.this);
                finish();
            }
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000);

    Common.loadProgressDialog(MainActivity.this,false);
    getPackageManager().setComponentEnabledSetting(
            new ComponentName("com.drawerstack", pkgName),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}


private void removeIcon(String removePkg) {
        getPackageManager().setComponentEnabledSetting(
                new ComponentName("com.drawerstack", removePkg),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }
Run Code Online (Sandbox Code Playgroud)

azi*_*ian 5

假设您的问题是标题中的问题:

是否可以通过编程方式更新Android Manifest?

答案是否定的,不可能以编程方式进行。

您可以启用/禁用清单中声明的​​组件,但不能在其中添加或删除某些组件,因为顾名思义,这是清单文件,系统在安装应用程序时会“读取”该文件。因此,您要在该清单中声明您的应用程序界面,以后您将无法更改它,除非您使用其他清单重新安装该应用程序。

假设系统提供了您执行此操作的能力。然后,您会为清单动态添加一些权限,而用户从Play商店下载您的应用时并未批准该权限。