我正在开发一个mvvmcross android项目,我需要从图库中选择一张图片
,但是当我在视图中调用StartActivityForResults()时,活动会重新启动并再次显示第一页。
protected override void OnCreate(Bundle bundle)
{
ResourceId = Resource.Layout.StayView;
base.OnCreate(bundle);
int PickImageId = 1000;
Intent = new Intent();
Intent.SetType("image/*");
Intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(Intent, "Select Picture"), PickImageId);
//MvxInternalStartActivityForResult(Intent, 3001);
}
我已经读过这篇文章,但无法想出如何防止重启活动:
“问题是调用的Activity实例 StartActivityForResult不一定是同一个实例 接收OnActivityResult - 而不是Android可以调用 onSaveInstanceState,杀死你的Activity然后重新启动一个新的 实例(它甚至可以在此期间杀死整个应用程序)。 我已经看到这种情况发生在真实的应用程序中,例如,我已经使用过 StartActivityForResult从相机中获取图片。因为 相机可以使用大量的RAM,Android有时可以启动活动 从内存中重新启动它(使用保存的实例状态 选择图片后。这里的问题是私人的 动作onActivityResultHandler很难序列化! (这也是Xamarin.Mobile不再支持旧的原因 其拍照的任务API)。如果要测试此方案, 您可以使用开发人员在Android 4设备上强制执行此操作 设置'不要保持活动'“
我希望找到一个解决方法。
答案 0 :(得分:1)
我遇到了同样的问题,但最终我发现罪魁祸首是移动设备上开发人员选项中的设置。 (不要保留Activity:移至后台后立即终止活动)。希望对您有所帮助。
答案 1 :(得分:0)
来自https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#picturechooser
注意:在Android上使用此界面非常困难。
原因在于Android的活动生命周期。该 Android生命周期意味着可能返回的图像 不同的View和ViewModel比请求它的那个。这是 部分原因是相机应用程序通常使用大量RAM(原始相机 图像是大文件) - 所以当相机应用程序捕获你 图像,然后Android可能会通过杀死您的。来释放额外的RAM 应用程序的活动。
如果你想有效地使用这个IMvxPictureChooserTask 在Android上可靠,你真的需要通过一个调用这个API 服务类,使用Messaging将返回的消息传回给 ViewModel并实现' tombstoning'支持该ViewModel。
或者,您始终可以获取插件的源代码 - https://github.com/MvvmCross/MvvmCross/tree/3.2/Plugins/Cirrious/PictureChooser/Cirrious.MvvmCross.Plugins.PictureChooser.Droid - 并创建适合您应用的变体