从TargetActivity

时间:2016-03-02 11:23:36

标签: android android-intent android-activity android-manifest android-activity-alias

我有多个ActivityAliases,它们都会启动一个TargetActivity。 在TargetActivity内,我尝试区分开始的别名 TargetActivity

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

为此,我目前从componentName中提取Intent 给予我的TargetActivity并使用className()

像:

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

这适用于很多设备。但目前我看到一些失败 OnePlus 。在那个设备上,我的技术只返回className 我的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;

我还尝试过元数据:

修改

不幸的是,此方法不适用于所有设备。 如果activity.component中解析的alias-className返回 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>此处</activity-alias>标记内。

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

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()似乎是来自mActivityInfo的{​​{1}}的浅表副本。所以,也许这种方法无法解决问题:

Activity

1 个答案:

答案 0 :(得分:0)

<强> 1。元数据

不幸的是,此方法不适用于所有设备。 如果activity.component中解析的alias-className返回 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>此处</activity-alias>标记内。

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

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()似乎是来自mActivityInfo的{​​{1}}的浅表副本。所以,也许这种方法无法解决问题:

Activity