活动范围之外的onActivityResult

时间:2011-10-04 14:53:18

标签: android pojo

我正在尝试创建一个包含其他人将使用的共享代码的android项目。 在这个项目中,我只有POJO,没有特定于android的类。

某些功能需要调用某些活动,并且取决于结果。 我的POJO类在使用时会引用调用活动,但这是在运行时发生的,我无法控制这些活动的实现。

我的问题是,通过调用活动的引用,我可以 startActivityForResult 但我无法添加 onActivityResult ,这可能存在于调用活动中但是不知道我使用的requestCode。

我的问题是如何在活动返回时从常规java对象中知道?因为,据我所知,我只能在Activity类上实现 onActivityResult

谢谢!

5 个答案:

答案 0 :(得分:1)

这个设置会遇到很多问题,但这就是你想要开始的方式:

您必须在项目中包含一项活动,除了启动您希望从中获取结果的活动之外,它只会将其存储在全局可访问的存储中(例如单个或静态字段)。

class Pojo {
    static final ConditionVariable gate = new ConditionVariable();
    static int result;

    int m(Context context) {
        context.startActivity(new Intent(context, ForwarderActivity.class));
        gate.block();
        return result;
    }
}

class ForwarderActivity extends Activity {
    private boolean started = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!started) {
            started = true;
            startActivityForResult(new Intent("ContactsProvider"), 1);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Pojo.result = resultCode;
        Pojo.gate.open();
    }
}

但是有几个问题。就像你的POJO的方法不能从主(UI)线程调用,因为你需要将异步调用(startActivityForResult())转换为同步调用(Pojo.m())和要从中接收信息的活动将在主线程上启动,因此您无法在Pojo.m()...

中阻止它

无论如何,代码不起作用,但如果你真的必须坚持这个设置,你可以看到要走的路。但是你应该尝试提出一些其他方法来获取数据,比如内容提供商。

答案 1 :(得分:1)

我在使用UNITY3D时遇到同样的问题,团结拥有它自己的活动(统一玩家),我不想因某种原因编辑它。但是玩家活动在“onActivityResult”功能中没有任何作用。我在访问图像选择器时有一些事情要做,我可以调用“unityPlayer.startActivityForResult”来打开图像选择器,但是没有办法自己编写“onActivityResult”。

我认为我们希望是这样的:

OtherActivityClass.onActivityResultListener=function(){My Own CODE}..........OR OtherActivityClass.onActivityResultListener.add(myResultListener)..................

答案 2 :(得分:0)

  

我的问题是如何在活动返回时从常规java对象中知道?

让活动调用POJO,提供结果。

  

我的POJO类在使用时会引用调用活动,但这是在运行时发生的,我无法控制这些活动的实现。

然后,无论谁“控制这些活动的实施”,都需要让活动调用POJO,提供结果。这与任何其他回调/监听器机制没什么不同。

答案 3 :(得分:0)

也许PendingIntent http://developer.android.com/reference/android/app/PendingIntent.html可以帮助你。我仍然在寻找解决问题的方法,对我来说,这个课看起来非常有希望。

另一种方法可能是让你自己的类抽象,并有一个需要被覆盖的方法onActivityResult。当然,您必须依赖JavaDoc并“请调用super.onActivityResult”才能处理代码中的结果。但是,如果您的班级用户希望您的代码取得一些成功,他们应该遵循您的JavaDoc说明。

答案 4 :(得分:0)

类似于 Szabolcs Berecz 的建议,这是可能的。没有完美的解决方案,但可以执行以下操作:

  • 创建一个简单的无视图活动,为您启动意图
  • 通过全局侦听器管理器分发结果,感兴趣的类可以在其中注册和注销自身(例如POJO)
  • 这是非阻塞性的,但startActivityForResult并等待其结果通常是非阻塞性的

我已经在应用程序设置库中对此进行了设置,并且某些设置确实启动了系统意图(例如,选择图像),并且需要等待其结果,并且即使在屏幕旋转后也可以使用,而无需进行任何代码调整由图书馆用户提供。