使用非活动状态下的startActivityForResult

91

我有一个名为MainActivity的Activity和另一个类(一个简单的java类),我们称之为“SimpleClass”。

现在我想从那个类中运行命令startActivityForResult

我以为我可以只使用MainActivity的上下文传递该类(SimpleClass),但问题是我们不能运行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(...);
    }

}

现在它可以工作了,但是有没有更好的方法呢?我担心将来可能会出现一些内存泄漏问题。


我不知道你试图做什么,但你应该阅读这篇文章 - Macarse
1
通过这样做,您是否可以在simpleClass内使用onActivityResult方法,或者您并不打算这样做? 这里也有同样的问题.. - Vivere_FlowCoder
3个回答

69

我不确定这是否是一个好的做法,但是将 Context对象转换为Activity对象 可以顺利编译。

可以尝试以下代码:

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

这段代码应该可以编译通过,且结果会被传递到当前持有上下文的活动中。


如果上下文是从服务传递的呢? - Madhur Ahuja
9
不,它确实会引发一个类型转换异常! - Lisa Anne
2
一个Context不一定是一个Activity(例如如果使用myActivity.getApplicationContext()获取它)。 - Hugo Gresse
如果目标是避免内存泄漏,将上下文作为类的成员变量持有与持有活动有何优势?存储上下文是否具有导致内存泄漏的潜在风险,就像存储活动一样? - stevehs17

4
如果您需要从上一个Activity中获取结果,则调用类必须是Activity类型。
如果您从未使用结果(至少根据您发布的示例代码),那么您为什么要调用Activity.startActivityForResult()呢?
myMainActivity是否会对结果执行任何操作?如果是这样,则只需将SimpleClass作为Activity的子类,并在SimpleClass本身中处理结果即可。
如果myMainActivity需要结果,则可能应该重构代码以从myMainActivity启动活动。

2
我正在使用result,只是想将其分离到不同的类中,所以我想知道如何将Activity参数传递给非Activity类,而不会在未来引起泄漏。 - rayman
1
将SimpleClass作为嵌套类如何? - codinguser

1
更好的解决方案是:
  1. SimpleClass 设为你的 Activity 类的子类
  2. 使用 startActivityForResult 调用另一个 Activity
  3. SimpleClass 中处理结果

3
听起来这应该可以工作,但我收到了这个错误信息:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference - Boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接