为什么我的android活动被停止了?

时间:2013-05-08 14:10:21

标签: android android-activity android-camera surfaceview surfaceholder

我从我需要修改的应用程序(yuck)继承了一些代码。有问题的活动实现了SurfaceHolder.Callback和SensorEventListener。此活动适用于自定义相机。

该代码可以自动对焦并拍照。拍摄照片后,我会开始另一项活动,以便裁剪图像。一旦该活动开始,就会调用SurfaceDestroy的SurfaceHolder.Callback(如预期的那样)。此时,现有应用程序会释放相机(如预期的那样)。但是,当启动新的裁剪活动时,原始相机活动将停止(堆栈跟踪:Instrumentation.callActivityOnStop-> Activity.performStop)。

编辑:调用我的活动的onStop时完成堆栈跟踪:

CameraActivity.onStop() line: 784      
Instrumentation.callActivityOnStop(Activity) line: 1219
CameraActivity(Activity).performStop() line: 5186      
ActivityThread.performStopActivityInner(ActivityThread$ActivityClientRecord, ActivityThread$StopInfo, boolean, boolean) line: 3003     
ActivityThread.handleStopActivity(IBinder, boolean, int) line: 3052    
ActivityThread.access$1000(ActivityThread, IBinder, boolean, int) line: 139    
ActivityThread$H.handleMessage(Message) line: 1251     
ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
Looper.loop() line: 137
ActivityThread.main(String[]) line: 4918       
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 511     
ZygoteInit$MethodAndArgsCaller.run() line: 1004
ZygoteInit.main(String[]) line: 771    
NativeStart.main(String[]) line: not available [native method] 

因此,相机活动不再有效,并且不会从作物活动中收到结果。

为什么破坏表面/释放相机会导致相机活动停止?我必须在这里遗漏一些东西......

2 个答案:

答案 0 :(得分:0)

确保传递给startActivityForResult的请求代码是肯定的,否则您的活动将无法获得结果。这是以前咬过我的API的一个奇怪部分:

引用文档:https://developer.android.com/reference/android/app/Activity.html#startActivityForResult

  

requestCode如果> = 0,当活动退出时,将在onActivityResult()中返回此代码。

通常,只要您的活动不是前台活动,就可以调用onStop。这不会阻止接收活动结果。可以重新启动活动以便接收结果。

http://developer.android.com/guide/components/activities.html

此外,请注意任务关联性和后台堆栈,并确保您的裁剪活动作为同一任务的一部分运行,因为这将有助于防止您的活动被停止,但再次无法保证。

http://developer.android.com/guide/components/tasks-and-back-stack.html

答案 1 :(得分:0)

所以,我在这种情况下做了我通常做的事情,并试图简化问题。我按照Android开发者网站上的指南创建了一个全新的项目:http://developer.android.com/guide/topics/media/camera.html#custom-camera

一旦我得到了一个新的简单应用程序来拍照,我修改了它来调用裁剪活动,它没有问题。

示例应用程序之间最大的不同之处在于它使用单独的CameraPreview类来实现SurfaceHolder.Callback,而我的应用程序直接在Activity中实现了该接口。我不知道这是不是真正的问题,但是一旦我改变代码来做到这一点,它似乎有效。

因此,除非有人能够更好地向我解释,否则解决方法是在您的活动中不实施SurfaceHolder.Callback。