为啥我的 android 活动被停止?

Posted

技术标签:

【中文标题】为啥我的 android 活动被停止?【英文标题】:Why is my android activity being stopped?为什么我的 android 活动被停止? 【发布时间】:2013-05-02 19:36:06 【问题描述】:

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

代码可以很好地自动对焦和拍照。拍完照片后,我开始另一个活动以裁剪图像。一旦启动该活动,就会调用 surfaceDestroyed 的 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] 

因此,相机活动不再处于活动状态,并且它不会从裁剪活动中接收结果。

为什么破坏表面/释放相机会导致相机活动停止?我一定是在这里遗漏了什么......

【问题讨论】:

您能出示您的相机活动代码吗? 它很大而且很笨拙(大约 900 行)。而且由于我没有写它,我不确定是否可以出于法律原因将整个内容放在那里。但是,如果有一些有用的部分,我可以提出(也许是 SurfaceHolder.callback 方法?)。 onStop() 中放置一个断点并找出调用它的原因。 我做到了。这是我上面的注释:Instrumentation.callActivityOnStop->Activity.performStop。我现在确实使用完整的堆栈跟踪更新了原始问题。 【参考方案1】:

确保传递给 startActivityForResult 的请求代码是肯定的,否则您的活动将不会得到结果。这是之前困扰我的 API 的一个奇怪部分:

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

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

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

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

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

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

【讨论】:

我的请求代码是0。我真的不认为这是操作系统因为资源或其他原因而选择结束我的活动。因为如果确实如此,那么在裁剪活动从堆栈中弹出后,该活动是否仍会重新创建?我认为任务关联性可能是问题,因为某些活动(不是相机活动)具有单任务的启动模式。但是,我将所有 singleTask 更改为标准,问题仍然存在。 尝试请求代码 1。此外,尝试覆盖 finish() 并查看是否从您不希望的地方调用完成。 (抛出异常,捕获它并打印堆栈跟踪或调试该方法以查看它是从哪里调用的。【参考方案2】:

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

一旦我有了新的简单应用程序来拍照,我对其进行了修改以调用裁剪活动,它可以正常工作。

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

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

【讨论】:

以上是关于为啥我的 android 活动被停止?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的相机在另一个活动开始后停止预览?

为啥在 Android Oreo 上关闭屏幕时前台服务停止?

为啥我的应用安装后 Google Pay 停止工作?

为啥Android要使用各种BroadcastReceiver

为啥当主应用停止时我的小部件广播接收器服务停止

Android:底部弹出活动