我正在尝试创建一个包含其他人将使用的共享代码的android项目。 在这个项目中,我只有POJO,没有特定于android的类。
某些功能需要调用某些活动,并且取决于结果。 我的POJO类在使用时会引用调用活动,但这是在运行时发生的,我无法控制这些活动的实现。
我的问题是,通过调用活动的引用,我可以 startActivityForResult 但我无法添加 onActivityResult ,这可能存在于调用活动中但是不知道我使用的requestCode。
我的问题是如何在活动返回时从常规java对象中知道?因为,据我所知,我只能在Activity类上实现 onActivityResult 。
谢谢!
答案 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 的建议,这是可能的。没有完美的解决方案,但可以执行以下操作:
startActivityForResult
并等待其结果通常是非阻塞性的我已经在应用程序设置库中对此进行了设置,并且某些设置确实启动了系统意图(例如,选择图像),并且需要等待其结果,并且即使在屏幕旋转后也可以使用,而无需进行任何代码调整由图书馆用户提供。