标签: android-activity-alias

在应用更新时删除了活动别名

我已经实现了两个activity-alias用户应该能够在运行时启用或禁用的功能.

<activity-alias
    android:name=".ui.alias.open_location"
    android:targetActivity=".ui.activity.location"
    android:enabled="false">

    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>
Run Code Online (Sandbox Code Playgroud)

我不希望在开始时启用它们,以免弄乱用户设备的应用程序屏幕.但在运行时,用户应该能够启用别名.我这样做是通过PackageManager:

PackageManager pm  = getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName(context, ".ui.alias.open_location");
pm.setComponentEnabledSetting(componentName,
                              PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                              PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)

这在开始时就像魅力一样,但是当安装了我的应用程序的更新时,别名会再次被禁用.如何防止系统被清单覆盖启用状态?我不希望用户在开始时使用Launcher,我不希望用户在更新后重新创建所有别名快捷方式.

我想我需要类似的东西PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER,但仅限于启用状态.

谢谢!

android android-manifest android-activity android-activity-alias

18
推荐指数
1
解决办法
778
查看次数

从TargetActivity中提取/区分ActivityAlias名称

我有多个ActivityAliases都开始一个单一TargetActivity.在我的内心TargetActivity我尝试区分开始的别名TargetActivity.

别名定义Manifest为可启动(intent-filter),它将在主屏幕上显示为快捷方式.用户将点击快捷方式,android将启动我在" android:targetActivity=.."标签中定义的活动.

对于我目前的提取componentNameIntent,这是考虑到我的TargetActivity和使用className().

喜欢:

String aliasName = targetActivity.getComponentName().getClassName();
Run Code Online (Sandbox Code Playgroud)

这适用于许多设备.但目前我在OnePlus上看到了一些失败.在该设备上,我的技术只返回我的TargetActivity的className,因此我无法根据用户启动的别名传递操作.

有没有其他可靠的方法可以ActivityAlias用来启动TargetActivity?它不需要是名称本身,只要我能区分它们.我不想为每个Alias创建专用的TargetActivities!

谢谢!

Ps.:我看到了另一种方法,它使用PackageManager来检索activityInfo并使用Activity.name.但我怀疑这会带来与我的第一种方法不同的东西.

ActivityInfo aInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);

String aliasName = aInfo.name;
Run Code Online (Sandbox Code Playgroud)

我也尝试过元数据:

编辑:

不幸的是,这种方法并不适用于所有设备.如果alias-className从activity.component 解析后返回 target-activity,那么元数据方法也会失败.

我继续寻找答案,并找到了一个很好的解决方法来区分TargetActivty中的别名.

您可以在ActivityAlias标记内提供元数据,如下所示:

<activity-alias 
    android:name=".aliasName" 
    android:enabled="false" 
    android:exported="true" 
    android:icon="@drawable/someIconRes" 
    android:label="@string/someLabelRes" android:targetActivity=".yourTargetActivity"> 
    <meta-data android:name="alias" android:value="valueToDistinguish"/>
    <intent-filter>  
        <action android:name="android.intent.action.MAIN"/> 
        <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity-alias> …
Run Code Online (Sandbox Code Playgroud)

android android-manifest android-intent android-activity android-activity-alias

9
推荐指数
1
解决办法
663
查看次数

Apk的Aapt转储标记未列出活动别名的任何可启动活动

我最近通过以下更改更改了AndroidManifest.xml:

  • 将我的主启动器活动的名称更改为NewMainActivity。
  • 添加了活动别名,其中旧活动名称指向新活动。

现在,当我这样做时aapt dump badging <apk-path>| grep launchable-activity,没有输出。在上述更改之后发生了这种情况。

  <activity
        android:name="com.a.b.NewMainActivity"
        ....
        android:launchMode="singleTask" >
   </activity>
   <activity-alias
        android:name="com.a.b.OldMainActivity"
        android:launchMode="singleTask" 
        android:targetActivity="com.a.b.NewMainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity-alias>
Run Code Online (Sandbox Code Playgroud)
  • 我如何解决它?
  • 是否有aapt的任何新版本(我正在使用Android Asset Packaging Tool,v0.2-3051502)来解决此问题?

android aapt android-activity-alias

5
推荐指数
1
解决办法
242
查看次数