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

为什么我的android活动被停止?,android,android-activity,android-camera,surfaceview,surfaceholder,Android,Android Activity,Android Camera,Surfaceview,Surfaceholder,我从一个需要修改的应用程序继承了一些代码(糟糕)。该活动实现了SurfaceHolder.Callback和SensorEventListener。此活动适用于自定义相机 代码可以很好地自动对焦和拍照。拍摄完照片后,我会启动另一个活动,以获得裁剪图像的结果。一旦该活动启动,就会调用SurfaceHolder.Callback for SurfaceedStroyed(如预期的那样)。此时,现有应用程序将释放摄影机(如预期的那样)。但是,当启动新的裁剪活动时,原始摄影机活动将停止(堆栈跟踪:Ins

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

代码可以很好地自动对焦和拍照。拍摄完照片后,我会启动另一个活动,以获得裁剪图像的结果。一旦该活动启动,就会调用SurfaceHolder.Callback for SurfaceedStroyed(如预期的那样)。此时,现有应用程序将释放摄影机(如预期的那样)。但是,当启动新的裁剪活动时,原始摄影机活动将停止(堆栈跟踪:Instrumentation.callActivityOnStop->activity.performStop)

编辑:调用“我的活动”顶部时完成堆栈跟踪:

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] 
因此,“摄影机”活动不再处于活动状态,并且不会从“裁剪”活动接收结果


为什么破坏表面/释放相机会导致相机活动停止?我必须在此处缺少某些内容…

请确保传递给startActivityForResult的请求代码为正数,否则您的活动将无法获得结果。这是API中一个奇怪的部分,它曾经让我感到痛苦:

要引用文档:

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

通常,只要您的活动不是前台活动,就可以随时调用onStop。这并不妨碍接收活动结果。可以重新启动活动以接收结果

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


所以,我做了我在这种情况下通常做的事情,并试图简化问题。我根据android开发者网站上的指南创建了一个全新的项目:

一旦我得到了一个新的简单应用程序来拍照,我就修改了它,将其称为“作物活动”,它就可以正常工作了

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


因此,除非有人能更好地向我解释,否则解决办法是不要在活动中实现SurfaceHolder.Callback。

你能显示你的相机活动代码吗?它非常大而且笨拙(大约900行)。既然不是我写的,我不确定我是否可以出于法律原因把整件事都说出来。但是,如果有有用的部分,我可以把它放进去(可能是SurfaceHolder.callback方法?)。在
onStop()
中放一个断点,找出是什么调用了它。我做到了。这就是我上面的注释:Instrumentation.callActivityOnStop->Activity.performStop。我现在确实用完整的堆栈跟踪更新了原始问题。我的请求代码是0。我真的不认为这是操作系统选择结束我的活动,因为资源或任何东西。因为如果是这样,那么在crop活动从堆栈中弹出后,该活动是否仍应重新创建?我认为任务相关性可能是问题所在,因为某些活动(而不是摄影机活动)的启动模式为singleTask。但是,我将所有singleTask更改为standard,问题仍然存在。请尝试请求代码1。另外,请尝试重写finish(),并查看您是否从不希望的地方调用finish。(抛出异常,捕获它并打印堆栈跟踪,或调试该方法以查看调用它的位置。