使用StartActivityForResult()选择图片后从内存重新启动活动

时间:2014-10-08 13:15:21

标签: android image mvvmcross

我正在开发一个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设备上强制执行此操作   设置'不要保持活动'“

我希望找到一个解决方法。

2 个答案:

答案 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 - 并创建适合您应用的变体