使用非活动中的startActivityForResult


80

我有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(...);
    }

}

现在可以正常工作了,但是不是正确的方法吗?恐怕将来我可能会发生一些内存泄漏。

谢谢。射线。


我不知道您要做什么,但是您应该阅读此内容
Macarse'5

1
通过这样做,您可以onActivityResult在您的simpleClass中使用该方法,还是不打算?同样的问题在这里..
Vivere_FlowCoder 2014年

Answers:


63

我不知道这是否是个好习惯,但casting a Context object to an Activity object编译良好。

试试这个:

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

应该进行编译,并将结果传递到具有上下文的实际活动中。


如果上下文是从服务传递的呢?
Madhur Ahuja

9
不,它确实会引发强制转换异常!
丽莎·安妮

1
情境并非不可避免地是一项活动(例如,如果与myActivity.getApplicationContext()
Hugo Gresse

如果目标是避免内存泄漏,那么将上下文作为类的成员变量进行保存比保留活动有什么好处?存储上下文是否与存储活动有相同的可能性导致内存泄漏?
stevehs17 '02

4

如果您需要从上一个活动中获取结果,则您的调用类必须是活动类型。

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

是否myMainActivity做了什么结果?如果是这样,则只需创建SimpleClassActivity的子类并从SimpleClass自身内部处理结果即可。
如果myMainActivity需要结果,那么也许您应该重构代码以从开始活动myMainActivity


2
我正在使用结果,只是我想将其分离到不同的类,所以我想知道我应该如何将Activity参数传递给非活动类,而又不会导致将来的泄漏。
rayman

1
使SimpleClass成为嵌套类该怎么办?
codinguser

0

更好的解决方案是:

  1. 使SimpleClass你的子Activity
  2. 调用另一个活动为 startActivityForResult
  3. 处理中的结果SimpleClass本身

3
听起来像这样应该可以,但是我知道了:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
男孩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.