我在Xamarin Forms中使用Plugin.CrossMedia,有时候,在相机拍照后,应用程序会转回主页面,所有工作都会在实际页面中丢失,包括图像。这发生在Android(5和6)上。
我这样做:
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
return;
}
var photoName= "photo.png";
var sizeImg= Plugin.Media.Abstractions.PhotoSize.Small;
var mediaOptions = new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
SaveToAlbum = false,
AllowCropping = true,
DefaultCamera = Plugin.Media.Abstractions.CameraDevice.Rear,
Name = photoName,
PhotoSize = sizeImg
};
using (var file = await CrossMedia.Current.TakePhotoAsync(mediaOptions))
{
if (file == null)
return;
var filePath = file.Path;
... move image
}
答案 0 :(得分:3)
当操作系统需要内存来执行应用程序的请求时,在这种情况下使用摄像头,重新启动Activity会在低端设备上出现;有限的内存,Android One
和新的基于Oreo的Android Go
设备。
Xamarin.Forms
在一个Activity
内运行(通常是模板创建的MainActivity
)及其应用程序&页面生命周期事件在活动的生命周期事件中映射。
Xamarin.Forms
'终止:
请注意,没有应用程序终止的方法。在正常情况下(即不是崩溃),应用程序终止将发生在OnSleep状态,而不会向您的代码发送任何其他通知。
要遵循的一些做法:
描述应用的内存使用情况
确保您正在发布不再需要的资源,图像通常应用程序中最大的内存使用者
通过创建虚拟Service
并从Android操作系统请求ImportanceReason.ServiceInUse
,在启动外部应用时请求更高的应用重要性。
Note: This does not prevent the OS from terminating your process,
it provides another hint to the OS...
打开外部应用程序(如相机,Chrome通过自定义标签(Xamarin.Auth
)等等...并且用户希望返回相同状态时,请确保您已保留应用程序的状态状态,以便你可以恢复它。
阅读Android's Activity Lifecycle,以便在使用OnCreate
调用活动Bundle
时,您知道您的应用正在重新启动,并且您可以检索并传递某些特定于应用的状态表单的Application子类的信息,用于确定要重建的Forms导航堆栈以及要打开的页面,即:
if (bundle is null)
LoadApplication(new App());
else
{
var restoreAppState = GetPriorAppState();
LoadApplication(new App(restoreAppState.Restore2Page));
}