另一个“如何找到className”

时间:2012-12-31 20:32:03

标签: android android-intent broadcastreceiver package classname

我已经使用了搜索功能,我已阅读并尝试了很多示例,但我找不到解决问题的方法......所以,我们走了:

我想将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”!!!

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

如果您正在搜索packageNameclassName来填写有序广播,我建议您查看您可能正在使用的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对象的类。我不确定你到底想要做什么,但这就是你看到你所看到的东西的原因。