【问题标题】:use startActivityForResult from non-activity从非活动中使用 startActivityForResult
【发布时间】:2010-05-17 11:56:47
【问题描述】:

我有 MainActivity,它是一个 Activity 和其他类(这是一个简单的 java 类),我们称之为“SimpleClass”。 现在我想从该类运行命令 startActivityForResult。

现在我虽然可以通过那个类(SimpleClass),但只有 MainActivity 的上下文,问题是,你不能运行 context.startActivityForResult(...);

所以使 SimpleClass 使用 'startActivityForResult; 的唯一方法;就是把MainActivity的引用作为Activity变量传递给SimpleClass 类似的东西:

在 MainActivity 类中,我以这种方式创建 SimpleClass 的实例:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

现在这是 SimpleClass 的样子:

public Class SimpleClass {

Activity myMainActivity;

   public SimpleClass(Activity mainActivity) {
       super();
       this.myMainActivity=mainActivity;    
   }
....


    public void someMethod(...) {
        myMainActivity.startActivityForResult(...);
    }

}

现在它的工作,但不是这样做的正确方法吗?恐怕我以后可能会出现一些内存泄漏。

谢谢。 射线。

【问题讨论】:

  • 我不知道你想做什么,但你应该阅读this
  • 通过这样做,您是否可以在您的 simpleClass 中使用 onActivityResult 方法,或者您不打算这样做? Same problem here..

标签: java android


【解决方案1】:

我不知道这是否是好的做法,但casting a Context object to an Activity object 编译得很好。

试试这个:

if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(...);
} else {
        Log.e("mContext should be an instanceof Activity.");
} 

这应该编译,结果应该传递给持有上下文的实际活动。

【讨论】:

  • 如果上下文是从服务传递过来的呢?
  • 不,它确实会引发强制转换异常!
  • 一个上下文不一定是一个活动(例如,如果它与myActivity.getApplicationContext()一起获得)
  • 如果目标是避免内存泄漏,那么将上下文作为类的成员变量保存比保存活动有什么优势?存储上下文是否与存储活动具有相同的导致内存泄漏的可能性?
【解决方案2】:

如果你需要从上一个Activity中获取结果,那么你的调用类需要是Activity类型。

如果您从不使用结果(至少根据您发布的示例代码),您调用Activity.startActivityForResult() 的目的是什么。

myMainActivity 对结果有什么作用吗?如果是这样,那么只需将 SimpleClass 设为 Activity 的子类并从 SimpleClass 本身处理结果。
如果myMainActivity 需要结果,那么也许您应该重构代码以从myMainActivity 开始活动。

【讨论】:

  • 我正在使用结果,只是我想将它分离到不同的类,所以我想知道如何将 Activity 参数传递给非活动类,而不会在未来造成泄漏。
  • 让 SimpleClass 成为嵌套类怎么样?
【解决方案3】:

更好的解决方案是:

  1. 使SimpleClass 成为Activity 类的子类
  2. startActivityForResult 调用另一个Activity
  3. SimpleClass 自身内处理结果

【讨论】:

  • 听起来应该可以,但我明白了:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多