我已经使用了搜索功能,我已阅读并尝试了很多示例,但我找不到解决问题的方法......所以,我们走了:
我想将Intents只发送到1个BroadcastReceiver。因此,我需要创建一个新的Intent并将其发送到packageName和packageClass:
intent.setComponent(new ComponentName(packageName, className));
要查找packageName和className,请使用以下代码:
String appInfo = list.get(myPlayer).activityInfo.toString();
Log.d("TAG", "app " + appInfo);
String packageName = list.get(myPlayer).activityInfo.packageName.toString();
Log.d("TAG", "package " + packageName);
String className = list.get(myPlayer).activityInfo.getClass().getName().toString();
Log.d("TAG", "class " + className);
从logcat我得到以下结果(播放音乐的例子):
app ActivityInfo{417bd5e0 com.google.android.music.MediaButtonIntentReceiver}
package com.google.android.music
class android.content.pm.ActivityInfo
这不奇怪吗?出于某种原因,我希望类日志只有“MediaButtonIntentReceiver”而不是“android.content.pm.ActivityInfo”!!!
有人知道如何解决这个问题吗?
答案 0 :(得分:3)
如果您正在搜索packageName
和className
来填写有序广播,我建议您查看您可能正在使用的ResolveInfo对象的内容
所以在你的情况下,如果你需要完成意图的内容,我可以建议
ResolveInfo ri = ... // get where you need
Intent intent = new Intent();
intent.setComponent(new ComponentName(
ri.activityInfo.applicationInfo.packageName,
ri.activityInfo.applicationInfo.className));
这适用于你的情况
编辑:如果您获得了ResolveInfo的特定意图,className
应为null
。在这些情况下,我成功使用ri.activityInfo.name
,其返回正确的className
,因为activityInfo
用于一个特定的活动
答案 1 :(得分:1)
简单地说:getClass()
没有按照您的预期行事
然而,使用你拥有的东西你可以得到你想要的东西:
String appInfo = list.get(myPlayer).activityInfo.toString();
String className = appInfo.substring(appInfo.lastIndexOf(".") + 1, appInfo.length() - 1);
Log.d("TAG", "class " + className);
请注意packageName
是ActivityInfo的字段,而不是方法。虽然getClass()
是一种方法,但它是Object
的一种方法,从它的文档中可以看出:
返回表示此对象类的Class的唯一实例。
所以你要的是activityInfo
的名字,(据你所知)ActivityInfo
。
答案 2 :(得分:0)
这一点都不奇怪。这里:
String className = list.get(myPlayer).activityInfo.getClass().getName().toString()
您正在获取ActivityInfo
对象的类。我不确定你到底想要做什么,但这就是你看到你所看到的东西的原因。