Jac*_*1re 9 android android-manifest android-intent android-activity android-activity-alias
我有多个ActivityAliases
都开始一个单一TargetActivity
.在我的内心TargetActivity
我尝试区分开始的别名TargetActivity
.
别名定义Manifest
为可启动(intent-filter),它将在主屏幕上显示为快捷方式.用户将点击快捷方式,android将启动我在" android:targetActivity=..
"标签中定义的活动.
对于我目前的提取componentName
从Intent
,这是考虑到我的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)
这里的重要部分是:
<meta-data android:name="alias" android:value="valueToDistinguish"/>
Run Code Online (Sandbox Code Playgroud)
这是在<activity-alias>
这里的</activity-alias>
标签.
要提取元数据,您可以使用TargetActivity从PackageManager获取ActivityInfo:
ActivityInfo appInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);
Run Code Online (Sandbox Code Playgroud)
并通过以下方式提取元数据:
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Activity
使用调试器检查类,它包含一个mActivityInfo
与ActivityInfo
返回的字段不同的字段,getPackageManager().getActivityInfo()
因此您可以使用反射提取它并检查它的名称.
注:看来,ActivityInfo
返回的getPackageManager().getActivityInfo()
是的浅拷贝mActivityInfo
从Activity
.所以,也许这种方法无法解决问题:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
这里重要的部分是:
<meta-data android:name="alias" android:value="valueToDistinguish"/>
Run Code Online (Sandbox Code Playgroud)
这是在<activity-alias>
here</activity-alias>
标签内的。
要提取元数据,您可以使用 TargetActivity 从 PackageManager 获取 ActivityInfo:
ActivityInfo appInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);
Run Code Online (Sandbox Code Playgroud)
并通过以下方式提取元数据:
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;
}
Run Code Online (Sandbox Code Playgroud)
2.mActivityInfo
Activity
使用调试器检查类,它包含一个与返回的mActivityInfo
字段不同的字段,因此您可以使用反射提取它并检查它的名称。ActivityInfo
getPackageManager().getActivityInfo()
ActivityInfo
注意:返回的似乎是的getPackageManager().getActivityInfo()
浅拷贝。所以,也许这个方法不能解决问题:mActivityInfo
Activity
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
663 次 |
最近记录: |