9

我有多个ActivityAliases都从一个开始TargetActivity。在我的内部,我TargetActivity尝试区分启动TargetActivity.

别名被定义Manifest为可启动项(意图过滤器),它将在主屏幕上显示为快捷方式。用户将单击快捷方式,android 将启动我在“ android:targetActivity=..”标签中定义的活动。

为此,我目前componentNameIntent提供给我的 TargetActivity 并使用className().

喜欢:

String aliasName = targetActivity.getComponentName().getClassName();

这适用于很多设备。但目前我在OnePlus上看到了一些故障。在该设备上,我的技术仅返回我的 TargetActivity 的类名,因此我无法根据用户启动的别名来交付操作。

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

谢谢!

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

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

String aliasName = aInfo.name;

我还尝试了元数据:

编辑:

不幸的是,这种方法不适用于所有设备。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>

这里的重要部分是:

<meta-data android:name="alias" android:value="valueToDistinguish"/>

这是在<activity-alias>here</activity-alias>标签内。

要提取元数据,您可以使用 TargetActivity 从 PackageManager 获取 ActivityInfo:

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

并通过以下方式提取元数据:

    private static String getAliasNameByMetaData(ActivityInfo app) {
    String aliasName = "";
    if (app.metaData != null && app.metaData.containsKey(ALIAS_META_DATA_KEY)) {
        aliasName = app.metaData.getString(ALIAS_META_DATA_KEY, "");
    } else {
        LOG.i("AliasName by META-DATA didn't work!");
    }
    LOG.v("AliasName by META-DATA: " + aliasName);
    return aliasName;
}

编辑:

使用调试器检查Activity类,它包含一个mActivityInfo不同于ActivityInfo返回的字段,getPackageManager().getActivityInfo()因此您可以使用反射提取它并检查它的名称。

ActivityInfo注意:返回的似乎getPackageManager().getActivityInfo()是. 所以,也许这种方法不能解决问题:mActivityInfoActivity

Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
4

1 回答 1

0

1. 元数据

不幸的是,这种方法不适用于所有设备。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>

这里的重要部分是:

<meta-data android:name="alias" android:value="valueToDistinguish"/>

这是在<activity-alias>here</activity-alias>标签内。

要提取元数据,您可以使用 TargetActivity 从 PackageManager 获取 ActivityInfo:

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

并通过以下方式提取元数据:

    private static String getAliasNameByMetaData(ActivityInfo app) {
    String aliasName = "";
    if (app.metaData != null && app.metaData.containsKey(ALIAS_META_DATA_KEY)) {
        aliasName = app.metaData.getString(ALIAS_META_DATA_KEY, "");
    } else {
        LOG.i("AliasName by META-DATA didn't work!");
    }
    LOG.v("AliasName by META-DATA: " + aliasName);
    return aliasName;
}

2.mActivityInfo

使用调试器检查Activity类,它包含一个mActivityInfo不同于ActivityInfo返回的字段,getPackageManager().getActivityInfo()因此您可以使用反射提取它并检查它的名称。

ActivityInfo注意:返回的似乎getPackageManager().getActivityInfo()是. 所以,也许这种方法不能解决问题:mActivityInfoActivity

Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
于 2016-03-02T17:07:55.190 回答