Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从TargetActivity提取/区分ActivityAlias名称_Android_Android Intent_Android Activity_Android Manifest_Android Activity Alias - Fatal编程技术网

Android 从TargetActivity提取/区分ActivityAlias名称

Android 从TargetActivity提取/区分ActivityAlias名称,android,android-intent,android-activity,android-manifest,android-activity-alias,Android,Android Intent,Android Activity,Android Manifest,Android Activity Alias,我有多个ActivityAlias,它们都从一个TargetActivity开始。 在我的TargetActivity中,我尝试区分开始的别名 目标活动 这些别名在清单中定义为launchables意图过滤器,它将显示为 主屏幕上的快捷方式。用户将单击快捷方式和android 将启动我在android中定义的活动:targetActivity=。。标签 为此,我目前从Intent中提取componentName,即 指定给我的TargetActivity并使用类名 比如: 这适用于许多设备。但是

我有多个ActivityAlias,它们都从一个TargetActivity开始。 在我的TargetActivity中,我尝试区分开始的别名 目标活动

这些别名在清单中定义为launchables意图过滤器,它将显示为 主屏幕上的快捷方式。用户将单击快捷方式和android 将启动我在android中定义的活动:targetActivity=。。标签

为此,我目前从Intent中提取componentName,即 指定给我的TargetActivity并使用类名

比如:

这适用于许多设备。但是现在我看到了一些失败 OnePlus。在该设备上,我的技术只返回 我的目标活动,因此我无法根据 用户启动的别名

是否有其他可靠的方法来获取用于 启动目标活动?它不需要是名称本身,只要 因为我能分辨出来。我不想为每个别名创建专用的TargetActivity

谢谢

注:我看到了另一种方法,它使用PackageManager来检索 activityInfo并使用Activity.name。但我怀疑这是否会发生 返回与我的第一个方法不同的内容

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

String aliasName = aInfo.name;
我还尝试了元数据:

编辑:

不幸的是,这种方法并不适用于所有设备。 如果activity.component中解析的别名类名返回 目标活动,那么元数据方法也失败了

我继续寻找答案,并找到了解决问题的好办法 在TargetActivity中区分我的别名

您可以在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>
<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>
并通过以下方式提取元数据:

    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;
}
    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字段,该字段与getPackageManager.getActivityInfo返回的ActivityInfo不同,因此您可以使用反射提取它并检查它的名称

注意:getPackageManager.getActivityInfo返回的ActivityInfo似乎是活动中mActivityInfo的浅拷贝。因此,这种方法可能无法解决问题:

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

不幸的是,这种方法并不适用于所有设备。 如果activity.component中解析的别名类名返回 目标活动,那么元数据方法也失败了

我继续寻找答案,并找到了解决问题的好办法 在TargetActivity中区分我的别名

您可以在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>
<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>
并通过以下方式提取元数据:

    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;
}
    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;
}
二,。mActivityInfo

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

注意:getPackageManager.getActivityInfo返回的ActivityInfo似乎是活动中mActivityInfo的浅拷贝。因此,这种方法可能无法解决问题:

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

元数据方法究竟是如何失败的?ActivityInfo中没有元数据。如果在调试时检查targetActivity,mActivityInfo字段是否显示您的活动或别名?对于我,在我的测试设备上,它显示别名。过去,我使用mActivityInfo.name来区分我的别名。但不幸的是,在野外,有些设备的mActivityInfo返回targetActivity。您应该回答自己的问题。这将从未回答的问题列表中删除该问题,并可能帮助其他有类似问题的人。