0

我有一个从 Windows 移植到 Andriod 和 iOS 的应用程序。在此应用程序中,应使用预定义的 xml 通过反射加载屏幕(活动),并且需要在屏幕(活动)启动之前在屏幕(活动)上完成一些业务逻辑。所以问题是如何启动我已经加载的活动。示例代码如下:

MyActivity activity = Activity.LoadActivityFromReflection(/* some parameters passed*/);
DoSomeWork_PrepareAndBindActivityToItsController(activity);
// now how can I start this activity. I know I could do the following 
Intent intent = new Intent(Application.Context, typeOf(MyActivity));
startActivity(intent);

但我担心这会重新实例化活动,并且为准备和绑定它所做的所有工作都会消失。

任何帮助,将不胜感激。

4

2 回答 2

0

以下是 Xamarin 的答案,我将其发布在这里以帮助任何尝试做同样事情的人。另外,我找到了解决此问题的方法,完成后我将在此处发布我的解决方案。

亲爱的哈斯,

通过反射加载Activities听起来是一种有趣的方法。由于我自己没有尝试过,我不能 100% 确定这会回答你的问题,但这是我的第一个想法:

看起来您正在构建要显示的特殊实例。Activity要完成这项工作,您需要一种将实例推送到“ task stack”(http://developer.android.com/guide/components/tasks-and-back-stack.html)的方法,但不可能直接操作现有的任务堆栈(在http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack的幻灯片 #105 中提到)。TaskStackBuilder实际上,即使使用(http://developer.android.com/reference/android/app/TaskStackBuilder.html )生成一个全新的任务堆栈也需要使用Intents.

简而言之,Intent 是在 Android 中启动 Activity 的唯一方式。

我认为在您的情况下最直接的解决方案是通过反射创建整个MyActivity 班级。然后您可以使用 Intent 并以正常方式启动 Activity。" DoSomeWork_PrepareAndBindActivityToItsController(activity)" 可能是 " onStart()" 回调的一部分。

最好的,布伦丹@Xamarin

于 2013-06-13T23:23:00.267 回答
0

我知道能够存储数据并以任何类型的一致性重新访问它的唯一方法是将其放置在 Application 类中。据我了解整个 Android 生命周期,我不知道我是否会建议走这条路。如果您尝试显式定义它,我发现很难确保使用正确的参数启动 Activity。

例如,如果您只是转动您的设备,则会调用 OnCreate 活动(加上 onresume 等)。话虽如此,如果您尝试以编程方式控制布局,或者做一些耗时的初始工作来定义布局,您可能只想在包被销毁时将值存储在包中,并且在重新加载时尝试使用保存的值作为你以前有过。

于 2013-06-12T20:03:37.123 回答