我正在使用活动别名来支持特定设备的不同应用程序图标,代码如下:
<activity-alias
android:name=".MainActivity-Vendor"
android:enabled="false"
android:icon="@mipmap/app_logo_vendor"
android:label="@string/app_name_vendor"
android:exported="true"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
----- 定义主活动应用程序图标和文本:
<activity
android:name=".MainActivity"
android:icon="@mipmap/app_logo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
直到 Android 7.0 之前它工作正常,但是当我将我的应用程序定位到 Android 8.0 时,其中连字符 (-( 不支持活动别名,所以我更改了活动别名名称,如下所示,
MainActivity-Vendor ---> MainActivityVendor
我还根据设备供应商更改了启用/禁用的活动别名代码,如下所示:
旧代码 :
PackageManager pm = this.getPackageManager();
// Enable/disable activity-aliases
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivity-Vendor"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
);
int enabled = pm.getComponentEnabledSetting(new ComponentName(this, "com.app.MainActivity"));
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
);
新代码 :
PackageManager pm = this.getPackageManager();
// Enable/disable activity-aliases
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivityVendor"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
);
int enabled = pm.getComponentEnabledSetting(new ComponentName(this, "com.app.MainActivity"));
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
);
请注意,在上面,我也更改了代码,
MainActivity-Vendor ---> MainActivityVendor
但是在应用程序升级后,应用程序图标对用户消失了。 并且在应用程序升级后,用户不会获得应用程序的"打开"选项。请帮助我如何解决此问题。
虽然我没有找到确切的解决方案,但我设法通过执行以下操作来实现这一点:
<receiver android:name=".AppUpdateReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
然后在 AppUpdateReceiver 类中启用/禁用处理活动别名。
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context, "Gaana App updated : " + intent.getAction(), Toast.LENGTH_SHORT).show();
//Log.v(TAG, "app is updated - " + intent.getAction());
mContext = context;
if(intent.getAction() != null && intent.getAction().equals("android.intent.action.MY_PACKAGE_REPLACED")) {
MmxUtils.init();
if (MmxUtils.isMmxBuild()) {
setIcon();
}
}
}
private void setIcon() {
PackageManager pm = this.getPackageManager();
// Enable/disable activity-aliases
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivityVendor"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
);
int enabled = pm.getComponentEnabledSetting(new ComponentName(this, "com.app.MainActivity"));
pm.setComponentEnabledSetting(
new ComponentName(this, "com.app.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
);
}
它解决了我的问题。