Android调用摄像头后系统回收activity造成数据丢失

在开发Android应用时,遇到红米note手机在调用摄像头后,由于系统回收activity导致图片路径丢失的问题。分析原因是activity被系统回收后重新加载,解决方法是利用onSaveInstanceState和onCreate保存及恢复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做聊天模块时,有发送拍照的功能,奇葩的是别的手机都没问题,唯独红米note调用摄像头后返回页面没有任何响应,调试中发现返回的图片路径为空,返回的路径怎么能为空呢?后来发现是系统把activity回收掉了,返回来的时候,activity重新加载了,所有返回的图片路径已经不存在了,所以只能想办法恢复图片路径的数据,如下代码是开启摄像头和返回的信息:

<span style="white-space:pre">			</span>Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            // 指定调用相机拍照后照片的储存路径
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getCacheFile
                                                                                          (mImageName)));
                            startActivityForResult(intent, PHOTO_REQUEST_TAKE_PHOTO);
<span style="white-space:pre">	</span>if (requestCode == REQUEST_CODE_CAMERA) { // 发送照片
                if (cameraFile != null && cameraFile.exists()) {
<think>我们正在讨论AndroidActivity的生命周期核心方法及其触发场景。根据提供的引用内容,我们可以总结出以下核心方法:onCreate,onStart,onResume,onPause,onStop,onDestroy,onRestart,onWindowFocusChanged(但注意onWindowFocusChanged并不是严格的生命周期方法,而是与窗口焦点相关)。下面我将详细解释每个核心方法的触发场景:1.**onCreate()**:当Activity第一次被创建时调用。在这个方法中,我们通常会进行一些初始化操作,比如设置布局(setContentView)、初始化变量、绑定数据等。这个方法会传入一个Bundle对象,用于保存Activity之前的状态(如果之前被销毁过)。onCreate()之后,Activity进入“Created”状态。2.**onStart()**:在onCreate()之后调用,或者当Activity从停止状态重新变为可见状态时调用(即onRestart()之后)。此时Activity已经可见,但还没有出现在前台,无法与用户交互。在这个方法中,可以做一些资源初始化或者注册广播接收者等操作。调用onStart()后,Activity进入“Started”状态。3.**onResume()**:在onStart()之后调用,或者当Activity从暂停状态恢复时调用。此时Activity位于栈顶,处于运行状态,可以与用户交互。在这个方法中,通常会启动一些动画、传感器注册等需要与用户交互的操作。调用onResume()后,Activity进入“Resumed”状态。4.**onPause()**:当系统准备去启动或者恢复另一个Activity调用(比如有新的Activity启动并覆盖当前Activity,或者当前Activity被部分遮挡)。在这个方法中,应该释放一些消耗资源的操作(比如相机),保存一些轻量级的数据(因为onPause执行时间很短,不能做耗时操作)。注意:如果onPause()执行超过500ms,系统可能会强制关闭该Activity[^3]。调用onPause()后,Activity进入“Paused”状态。5.**onStop()**:当Activity完全不可见时调用(比如被另一个Activity完全覆盖)。在这个方法中,可以释放一些不再需要的资源,比如停止动画、注销广播接收者等。调用onStop()后,Activity进入“Stopped”状态。注意:如果系统内存不足,可能会在onStop()之后直接销毁Activity。6.**onDestroy()**:当Activity被销毁时调用。这可能是由于用户主动关闭Activity(如按返回键)或者系统销毁(如配置变更或内存不足)。在这个方法中,应该释放所有占用的资源,避免内存泄漏。调用onDestroy()后,Activity被销毁。7.**onRestart()**:当Activity从停止状态重新回到活动状态时调用(即从Stopped状态回到Started状态)。这个方法在onStop()之后,onStart()之前调用。通常用于重新初始化在onStop()中释放的资源。另外,还有一个与焦点相关的方法:-**onWindowFocusChanged(booleanhasFocus)**:当Activity的窗口获得或失去焦点时调用。注意,这个方法与生命周期方法的调用顺序没有固定关系,因此不能依赖它与其他生命周期方法的先后顺序[^4]。当hasFocus为true时,表示Activity获得焦点(即可以接收用户输入);为false时,表示失去焦点。下面用一个典型的场景来说明生命周期方法的调用顺序:-**启动Activity**:onCreate()->onStart()->onResume()-**启动另一个Activity(完全覆盖当前Activity)**:当前Activity:onPause()->onStop()-**返回键回到原Activity**:原Activity:onRestart()->onStart()->onResume()-**按返回键退出Activity**:onPause()->onStop()->onDestroy()-**启动一个对话框式的Activity(部分遮挡)**:当前Activity:onPause()(不会调用onStop,因为仍然部分可见)-**关闭对话框**:当前Activity:onResume()注意:在Android中,Activity的生命周期是由系统管理的,开发者需要在这些回调方法中执行适当的操作,以保证应用的流畅性和资源的合理使用。[^1]:【转载请注明出处:5分钟告诉你,Activity的生命周期怎么触发的(onCreateonStartonResumeonPauseonStoponDestroy)(附测试代码)优快云王智博】[^2]:activity1的窗口函数为publicclassActivity1extendsActivity{...}[^3]:androidactivityonstart直接到onstop,AndroidActivity细化出onCreate、onStart、onResume、onPause、...。底层执行AActivity的onPause()时,有一定的时间限制的,当ActivityManagerService通知应用进程暂停指定的Activity时,如果对应的onPause()在500ms内还没有执行完,ActivityManagerService就会强制关闭这个Activity。[^4]:onCreate&onStart&onResume&onStop&onPause&onDestroy&onRestart&onWindowFocusChanged。它也提供了全局的焦点状态,它的管理是独立于activity生命周期的。当焦点改变时一般都伴随着生命周期的改变,你不应该依赖onWindowFocusChanged调用和其他生命周期的方法(例如onResume)的先后顺序,来处理我们要做的事情。§§相关问题§§1.为什么在onPause方法中不能执行耗时操作?2.如何保存Activity的状态以便在重新创建时恢复?3.Activity的启动模式(如singleTop,singleTask)对生命周期有什么影响?4.在什么情况下Activity会被系统销毁?如何避免数据丢失?5.onSaveInstanceState和onRestoreInstanceState方法在生命周期中何时被调用?6.如何通过日志跟踪Activity的生命周期方法调用顺序?</think>### Android Activity 生命周期核心方法及触发场景 Android Activity 的生命周期由一系列核心方法组成,每个方法对应特定的系统回调时机。以下是各方法的触发场景详解: #### 1. **`onCreate()`** - **触发场景**:Activity **首次创建时**(如应用启动或配置变更后重建) - **核心作用**: - 初始化基本组件(布局、变量、数据绑定) - 必须调用 `setContentView()` 设置布局 - 接收 `savedInstanceState` 恢复之前状态 - **生命周期位置**:第一个回调方法,之后进入 `Created` 状态[^1][^2] #### 2. **`onStart()`** - **触发场景**:Activity **变为可见时**(如新 Activity 覆盖后返回、或 `onCreate()` 之后) - **核心作用**: - 准备前台显示(但尚未可交互) - 注册广播接收器、传感器监听等 - **生命周期位置**:`onCreate()` 或 `onRestart()` 之后,进入 `Started` 状态[^1][^3] #### 3. **`onResume()`** - **触发场景**:Activity **进入前台可交互状态**(如覆盖的对话框关闭、或其他 Activity 退出) - **核心作用**: - 恢复用户交互组件(动画、摄像头等) - 获取系统资源(CPU 高优先级) - **生命周期位置**:`onStart()` 之后,进入 `Resumed` 状态[^1][^4] #### 4. **`onPause()`** - **触发场景**:Activity **失去焦点时**(如新 Activity 启动、来电弹窗) - **核心作用**: - 释放占用资源(摄像头、传感器) - 保存轻量级临时数据 - **注意**:必须快速完成(超时 500ms 会强制关闭)[^3] - **生命周期位置**:进入 `Paused` 状态,可能随后触发 `onStop()`[^1][^3] #### 5. **`onStop()`** - **触发场景**:Activity **完全不可见时**(如新 Activity 覆盖全屏) - **核心作用**: - 释放非必要资源(数据库连接、网络请求) - 持久化数据到存储 - **生命周期位置**:`onPause()` 之后,进入 `Stopped` 状态[^1][^3] #### 6. **`onDestroy()`** - **触发场景**:Activity **被销毁前**(用户主动退出、系统回收资源) - **核心作用**: - 清理所有残留资源(线程、监听器) - 确保无内存泄漏 - **生命周期位置**:最终回调,进入 `Destroyed` 状态[^1][^4] #### 7. **`onRestart()`** - **触发场景**:Activity **从停止状态重新激活时**(如返回后台的 Activity) - **核心作用**:重新初始化 `onStop()` 中释放的资源 - **生命周期位置**:`onStop()` 之后、`onStart()` 之前[^1][^4] --- ### 生命周期流程图 ```plaintext 启动Activity → onCreate → onStart → onResume →(运行中) ↑ 返回前台 ↑ ↑ 用户交互 | | | | | onRestart ← onStop ← onPause ← 启动新Activity | | | ↓ ↓ ↓ onDestroy ← 退出/销毁 ← 配置变更 ``` --- ### 特殊方法说明 - **`onWindowFocusChanged()`**: 窗口焦点变化时触发(独立于生命周期),用于处理焦点相关逻辑(如游戏暂停),但不可依赖其与其他生命周期方法的执行顺序[^4]。 --- ### 典型场景示例 1. **启动 Activity1**: `onCreate()` → `onStart()` → `onResume()` 2. **从 Activity1 跳转 Activity2**: Activity1: `onPause()` → Activity2: `onCreate()` → ... → Activity2: `onResume()` → Activity1: `onStop()` 3. **返回 Activity1**: Activity2: `onPause()` → Activity1: `onRestart()` → `onStart()` → `onResume()` → Activity2: `onStop()` → `onDestroy()` 4. **旋转屏幕**: 当前 Activity: `onPause()` → `onStop()` → `onDestroy()` → 重建: `onCreate()` → `onStart()` → `onResume()`[^1][^3] [^1]:【转载请注明出处:5分钟告诉你,Activity的生命周期怎么触发的 优快云 王智博】 [^2]: activity1的窗口函数为 public class Activity1 extends Activity{ ... } [^3]: android activity onstart直接到onstop...当ActivityManagerService通知应用进程暂停指定的Activity时,如果对应的onPause()在500ms内还没有执行完,ActivityManagerService就会强制关闭这个Activity。 [^4]: onCreate & onStart & onResume & onStop & onPause & onDestroy & onRestart & onWindowFocusChanged。...当焦点改变时一般都伴随着生命周期的改变,你不应该依赖onWindowFocusChanged调用和其他生命周期的方法的先后顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值