SingleTask模式下使用Bundle传值,传值失败分析!

关于Activity的四种启动方式,就不用我多说了。

使用singleTask模式调用已经启动过的Activity时,该Activity不会再去走OnCreate()。

而很多朋友都把Bundle取值放在onCreate()内处理,那当然现在也就取不到值了。

以下是取值示例。(注意!!这里的 intent 是onNewIntent的传参的那个intent,不是getIntent()获取来的!)

@Override
protected void onNewIntent(Intent intent) {
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        searchGoodsName=bundle.getString("myKey");
    }
    initView();
    super.onNewIntent(intent);
}

应该使用onNewIntent的传参的那个intent,这样就可以得到从另一个页面传来的值了。

<think>好的,我现在要处理用户关于Android Activity的问题。首先,我需要回忆用户提供的引用内容,看看有哪些相关的信息可以用来构建回答。用户给出的引用中,引用[1]提到了使用Intent在Activity之间,引用[4]涉及FilePicker在Activity中的正确使用,引用[5]提到了堆内存的配置,可能和Activity生命周期中的内存管理有关。其他引用如[2]关于样式,[3]关于后台任务,可能相关性较低,但需要留意是否有间接联系。 接下来,用户的需求是了解Activity的使用指南及常见问题。我需要确保回答结构清晰,分步骤说明,并且涵盖基本使用数据递、生命周期管理、常见问题等部分。同时,必须按照系统级指令的要求,正确使用LaTeX格式,生成相关问题,并在引用处添加标识。 首先,Activity的基础概念和创建方法。这部分需要简要说明什么是Activity,如何创建,可能需要引用中的例子吗?引用[1]提到了发送方和接收方Activity,可以用来举例说明Intent的使用。然后,Activity的生命周期,这部分是核心,需要详细说明每个回调方法的作用,可能不需要引用,但如果有相关引用的话更好。 接下来,数据部分,重点参考引用[1],使用Intent,包括发送和接收步骤。需要详细说明步骤,比如准备数据、发送,接收方如何获取数据,可能还要提到Bundle使用。这里可以引用[1]的具体步骤作为例子。 然后,常见问题部分,可能包括启动Activity时的Context错误,如引用[4]提到的FilePicker需要正确的Context,比如在Fragment中使用requireActivity()。此外,可能涉及内存泄漏问题,引用[5]提到大堆内存的配置,虽然这可能更多与应用整体相关,但Activity泄漏可能导致内存不足,所以需要强调在生命周期中释放资源。 另外,用户可能遇到的配置变化(如屏幕旋转)导致Activity重建的问题,如何处理状态保存,使用onSaveInstanceState和onRestoreInstanceState。这部分需要加入,但现有引用中没有直接提到,可能需要根据通用知识补充。 最后,生成相关问题,需要确保问题覆盖Activity的生命周期、数据递方式、常见问题解决、启动模式等。可能需要生成4-5个相关问题,参考用户示例中的结构。 现在检查是否符合系统指令:行内公式用$...$,独立公式用$$...$$,但目前用户的问题可能不涉及数学公式,所以这部分可能不需要。但如果有提到性能分析之类的,可能需要用到,但目前看来不需要。LaTeX语法正确,用中文回答,生成相关问题,引用正确添加。例如,在提到Intent时引用[1],在Context错误时引用[4],在内存管理时引用[5]。 需要确保回答的结构清晰,分点说明,每个部分有标题,代码示例用正确的格式,如Java或Kotlin。用户提供的示例中有Python代码,但Android开发一般用Java或Kotlin,所以可能需要调整代码示例的语言。例如,发送Intent的代码示例使用Java,或者在可能的情况下用Kotlin,但需要确认引用中的代码格式。引用[4]中的代码示例是Java风格的:FilePickerManager.from(this).forResult(REQUEST_CODE),所以可能需要用Java示例。 总结回答结构: 1. Activity基础:定义、创建方法 2. 生命周期:各阶段方法 3. 数据递:Intent和Bundle,引用[1] 4. 启动模式:standard、singleTop等 5. 常见问题及解决:Context错误(引用[4])、内存泄漏(引用[5])、状态恢复 6. 代码示例:启动Activity、 7. 相关问题 现在开始组织内容,确保每个引用正确标注,比如在数据部分末尾添加[^1],在Context解决部分添加[^4],内存部分添加[^5]。注意引用标识的位置要自然,比如在相关描述的句末。 可能还需要提到Activity的启动模式,但引用中没有直接信息,可能需要通用知识。另外,关于后台任务,引用[3]提到WorkManager等,但和Activity关系不大,可能不需要涉及。 最后生成相关问题,如生命周期管理、数据递方法、Context错误解决、启动模式区别、防止内存泄漏等,确保问题覆盖回答中的关键点。</think>### Android Activity 使用指南及常见问题 #### 一、Activity 基础 1. **定义与作用** Activity 是 Android 应用的界面容器,负责管理用户交互和界面布局。每个 Activity 对应一个窗口,通常包含一组 UI 控件。 2. **创建 Activity** - 继承 `AppCompatActivity` 类。 - 重写 `onCreate()` 方法,加载布局文件。 ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` --- #### 二、Activity 生命周期 Activity 生命周期由以下核心方法控制: - `onCreate()`:初始化界面和资源。 - `onStart()`:Activity 可见但未获得焦点。 - `onResume()`:Activity 进入交互状态。 - `onPause()`:失去焦点(如弹窗出现)。 - `onStop()`:完全不可见。 - `onDestroy()`:释放资源。 ![Activity 生命周期示意图](https://developer.android.com/static/images/activity_lifecycle.png) (注:图片链接为示意,实际需替换为有效资源。) --- #### 三、Activity 间数据递 1. **使用 Intent 递简单数据** - **发送方**:通过 `putExtra()` 添加键对。 ```java Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("key_name", "Hello from MainActivity!"); startActivity(intent); ``` - **接收方**:在目标 Activity 的 `onCreate()` 中获取数据。 ```java String value = getIntent().getStringExtra("key_name"); ``` 引用示例:通过 Intent 实现跨 Activity 数据递[^1]。 2. **使用 Bundle 递复杂数据** ```java Bundle bundle = new Bundle(); bundle.putSerializable("user", userObject); intent.putExtras(bundle); ``` --- #### 四、Activity 启动模式 在 `AndroidManifest.xml` 中通过 `launchMode` 定义: - `standard`(默认):每次启动新实例。 - `singleTop`:若栈顶已存在相同 Activity,则复用。 - `singleTask`:全局唯一实例,适合主界面。 - `singleInstance`:独立任务栈,避免与其他 Activity 混合。 --- #### 五、常见问题及解决方法 1. **Context 错误导致异常** - **问题**:在 Fragment 中错误使用 `this` 作为 Context。 - **解决**:使用 `requireActivity()` 获取关联的 Activity Context。 ```java FilePickerManager.from(requireActivity()).forResult(REQUEST_CODE); ``` 2. **内存泄漏** - **原因**:未及时释放资源(如静态引用 Activity)。 - **优化**: - 避免长生命周期对象持有 Activity 引用。 - 在 `onDestroy()` 中取消网络请求或异步任务。 - 谨慎使用 `android:largeHeap="true"`(仅临时缓解,非根治方案)[^5]。 3. **配置变更导致重建** - **场景**:屏幕旋转时 Activity 默认会销毁并重建。 - **解决**: - 保存状态:重写 `onSaveInstanceState(Bundle outState)`。 - 恢复状态:在 `onCreate(Bundle savedInstanceState)` 中读取数据。 --- #### 六、代码示例:启动 Activity 并接收返回数据 1. **发送方** ```java Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); ``` 2. **接收方返回数据** ```java Intent resultIntent = new Intent(); resultIntent.putExtra("result_key", "Data from SecondActivity"); setResult(RESULT_OK, resultIntent); finish(); ``` 3. **发送方处理返回结果** ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result_key"); } } ``` --- §§ 相关问题 §§ 1. 如何避免 Activity 内存泄漏? 2. Activity 的启动模式有哪些区别? 3. 屏幕旋转时如何保持 Activity 数据? 4. Fragment 和 Activity 如何通信? 5. 如何通过 Intent 递自定义对象?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值