【问题标题】:onActivityResult outside of an activity scopeonActivityResult 在活动范围之外
【发布时间】:2011-10-04 14:53:17
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: android pojo


    【解决方案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() 中阻塞...

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

    【讨论】:

      【解决方案2】:

      我在玩 UNITY3D 时遇到了同样的问题,unity 有它自己的 Activity(unity 播放器),出于某种原因我不想编辑它。但是玩家活动在“onActivityResult”函数中什么都不做。我在访问图像选择器时有一些事情要做,我可以调用“unityPlayer.startActivityForResult”来打开图像选择器,但没有办法编写我自己的“onActivityResult”。

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 嗯,我有一些讨厌的约束需要处理。. 曾经使用我的 POJO 的东西对我来说就像一个黑盒子,我只知道它会调用我的 POJO 上的方法,作为回报,我需要一个结果。至于我想从我的 POJO 中调用的活动,那些是存在于 android 设备中的活动,它们也是我无法控制的。我只需要调用它们(比如说获取联系人)并获得结果。谢谢。
        • @Nitzan Tomer:“我有一些讨厌的约束需要处理”——这些约束需要解除。您不能使用startActivityForResult(),除非您在某些活动中实现了onActivityResult()
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          类似于 Szabolcs Berecz 的建议,这是可能的。没有漂亮的解决方案,但以下是可能的:

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

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

          【讨论】:

            猜你喜欢
            • 2017-12-10
            • 2023-03-13
            • 1970-01-01
            • 2011-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多