【问题标题】:Accessing instance of the parent activity?访问父活动的实例?
【发布时间】:2011-02-09 12:10:51
【问题描述】:

假设我有一个类 first.java(活动类),我在这个类(second.java - 活动类)中启动另一个活动。

如何从 second.java 访问 first.java 的实例?

谁能给我一个很好的解释...一个例子会很棒...

【问题讨论】:

    标签: android android-activity parent


    【解决方案1】:

    如果您需要您的第二个活动将一些数据返回到您的第一个活动,我建议您使用 startActivityForResult() 开始您的第二个活动。然后在您的第一个活动中的 onResult() 中,您可以完成所需的工作。

    在您启动 Second.java 的 First.java 中:

    Intent intent = new Intent(this, Second.class);
    int requestCode = 1; // Or some number you choose
    startActivityForResult(intent, requestCode);
    

    结果方法:

    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
      // Collect data from the intent and use it
      String value = data.getString("someValue");
    }
    

    在 Second.java 中:

    Intent intent = new Intent();
    intent.putExtra("someValue", "data");
    setResult(RESULT_OK, intent);
    finish();
    

    如果您不希望在第一个活动中做一些工作之前等待第二个活动结束,您可以改为发送一个广播,第一个活动对此做出反应。

    【讨论】:

    • 你是对的 cant0na,但我认为你不能正确回答问题。他不希望第二个活动 2 返回一些结果,但他实际上想要 2 从第一个活动 2 第二个传输数据(上下文)....
    • 他还要求解释和示例。 A 举了一个例子来说明如何做到这一点。
    • 我知道这一点,但这是如何做到这一点的一个例子。我认为应该允许人们就如何处理 Android 框架提出建议。
    • 如何使用您的解决方案我可以访问第二类中的第一个活动对象。这是问题
    • 您可以对问题发表评论,而不是将其作为答案发布。
    【解决方案2】:

    您可以简单地从子活动中调用getParent()

    我不知道为什么其他答案如此复杂。

    【讨论】:

    • 因为这是一个不完整的答案。 getParent() 仅适用于作为子嵌入的活动,它会在其他活动上返回 null。
    • @acib708 如果您以startActivity 启动SecondActivity,那么它们之间就没有“父子”关系。您可以将startActivityForResult 用于回调机制。或者分享一些可以观察到的单例。类似的东西。
    【解决方案3】:

    只有这样才能工作

    class first
    {
        public static first instance;
        oncreate()
        {
            instance = this;
        }
    }
    

    first.instance 是可以从第二类访问的必需的东西

    【讨论】:

    • 当您从第二个活动中访问您的实例时,不能保证它仍然有效。
    • 您应该将 onDestroy() 设置实例添加到 null
    【解决方案4】:

    如果这行得通,试试这个 4 u.........
    像这样.....

    class first
    {
    public static first instance;
    oncreate()
    {
    instance=this;
    }
    
    public static getInstance()
    {
    return instance;
    }
    

    }

    现在从第二类调用 first.getInstance();

    你也可以像 first.instance 一样以静态方式直接访问实例......
    谢谢...

    【讨论】:

    • 请记住,只要类存在于 jvm 中,静态引用就一直存在。因此,如果将 Activity 设置为静态变量,即使 Activity 运行了其 onDestroy 方法,您也可能会遇到内存问题。
    • 我们需要了解 为什么 OP 想要访问“父级”Activity。我真的不认为持有 static 引用和 getInstance() 方法是正确的方法,因为您正在颠覆 Activity 生命周期。
    • 什么是可取的不是问题。伙计们读了这个问题。从二等课询问一等课的参考。
    • 哦,伙计,这只是一个案例......有两种方法可以做到这一点...... 1)试试我所建议的,2)只需在第二类中首先制作一个类的对象,然后调用实例的getter ..(不要使getInstance方法静态)在第二类中做这样的事情........ firstObject.getInstance();在第一类中制作相应的getter方法......
    • 如果可以直接访问first.intance的话,请问大家需要什么getInstance方法
    【解决方案5】:

    您不能直接创建活动。 在第一个活动中,采用这样的静态活动变量,

    public static Activity activity;
    

    在 onCreate 中执行此操作。

    activity = this;
    

    然后在第二个活动中这样做,

    Activity activity = (your activity name).activity;
    

    编辑: 对于将数据从一个活动传递到另一个活动,这不是方法。 上面的答案是从最初询问的其他活动中获取活动实例。

    要将数据从一个活动传递到另一个活动,通常使用捆绑。但如果数据不是原始数据类型,则使用对象类,该对象类应实现可打包或可序列化接口。然后通过 bundle only parcelable list of objects 我们可以传递。

    【讨论】:

    • 请永远不要这样做。它会泄漏。
    • @Alex 为什么会泄露?
    • 查看泄漏的最简单方法是旋转您的设备。这样活动将重新启动(而不是应用程序),并且您的静态变量仍将保留对旧活动上下文的引用,直到应用程序被系统杀死(这不是您可以控制或在 Android 上应该担心的事情)。 Debarati 在这里写的东西被认为是非常糟糕的做法,每个有能力的人都应该投反对票。
    • 为了更好地理解,请看这篇文章:android-developers.blogspot.fr/2009/01/…(一个活动就是一个上下文)。
    • Alex,屏幕旋转时会调用 OnCreate 对吧?那么静态变量会在轮换时采用新的活动吗?
    猜你喜欢
    • 2011-08-26
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    相关资源
    最近更新 更多