【问题标题】:Another "how to find className"另一个“如何找到类名”
【发布时间】:2012-12-15 20:43:12
【问题描述】:

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

我只想将 Intent 发送到 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”!!!

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

【问题讨论】:

    标签: android android-intent broadcastreceiver package classname


    【解决方案1】:

    如果您正在搜索 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 是针对一项特定活动的

    【讨论】:

    • (upvote) 我发誓我浏览了文档以了解这样的方法......这就是问题,这是一个字段变量。
    • 不幸的是,这只是Android SDK的另一个小问题——像这样的不一致。而不是getActivityInfo().getApplicationInfo().getPackageName(),只有一个公共变量:/
    • 天啊。多么糟糕的答案。你不应该使用applicationInfo!!在所有情况下都使用activityInfo.name
    • 欢迎解释为什么applicationInfo 不是可用的解决方案。 activityInfo 对活动本身不是很紧吗?我们需要这里有关应用程序包的信息。
    【解决方案2】:

    简单地说: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

    【讨论】:

    • 不客气,我调整了答案以删除最后的}
    【解决方案3】:

    一点也不奇怪。这里:

    String className = list.get(myPlayer).activityInfo.getClass().getName().toString()
    

    您将获得ActivityInfo 对象的类。我不确定你到底想做什么,但这就是为什么你会看到你所看到的。

    【讨论】:

    • 但是为什么我没有得到“ActivityInfo”的packageName呢?顺便说一句,如果我删除“ActivityInfo”,我会得到“ResolveInfo”的类名...
    • 应该是注释,是的,你指错了代码,但仍然不是答案
    猜你喜欢
    • 2016-02-06
    • 2012-05-27
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2019-09-24
    相关资源
    最近更新 更多