【问题标题】:Android use component name to launch an activityAndroid 使用组件名称来启动一个活动
【发布时间】:2012-03-11 02:00:58
【问题描述】:

有很多方法可以开始另一个活动。 大多数重载方法都需要您传递上下文。

但是当使用 componentName 来启动一个活动时使用

public Intent setComponent (ComponentName component)

以及 ComponentName 的构造函数

ComponentName(String pkg, String cls)

如上所示,我可以在不使用任何上下文参数的情况下启动活动

但它必须以某种方式在内部使用一些“上下文”,对吗?如果是这样,哪个上下文?申请一还是活动一? 这是否意味着每次我使用这两种方法(如上)时,我不需要担心内存泄漏,因为我没有传递任何上下文??

谢谢

【问题讨论】:

    标签: android memory-leaks android-activity components


    【解决方案1】:

    adamp 的答案是正确的(他在我发帖之前就已经回答了)。

    只是为了扩展它,这是 Intent(Context packageContext, Class<?> cls) 构造函数的来源...

    public Intent(Context packageContext, Class<?> cls) {
        mComponent = new ComponentName(packageContext, cls);
    }
    

    ...这是ComponentName(Context pkg, Class&lt;?&gt; cls)构造函数的来源

    public ComponentName(Context pkg, Class<?> cls) {
        mPackage = pkg.getPackageName();
        mClass = cls.getName();
    }
    

    正如 adamp 所暗示的那样,采用 ContextIntent 方法是仅使用它来创建 ComponentName 的便捷方法,而 ComponentName 又只处理 String 类型(mPackagemClass) . IntentComponentName 都没有对 Context 的引用。

    【讨论】:

    • 感谢 MisterSquoink!如果允许的话,我会接受你的两个答案。但无论如何,谢谢你的源代码。现在很清楚了。
    【解决方案2】:

    在任何一种情况下,您都不必担心内存泄漏,但您最好注意传递 Context 对象的位置。当您使用 Intent(Context, Class) 构造函数或 setClass(Context, Class) 方法时,Intent 只需使用 Context 参数来查找您的包名称。它们只是方便的方法。

    【讨论】:

      【解决方案3】:

      也许我不明白你的问题。但是在定义意图时不要使用上下文。您使用上下文来调用使用意图的组件。例如,您使用:

      context.startActivity(intent)
      

      但通常您在扩展 Context 的活动和服务中调用这些方法。因此,您只需使用:

      startActivity(intent)
      

      【讨论】:

        【解决方案4】:

        startActivity() 不需要上下文作为参数;它是已经从(或实现)上下文派生的类中的方法。也就是说——如果你没有可以调用它的上下文,你就不能调用startActivity()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多