Activity传递返回参数+生命周期+横竖屏+保持临时数据

阐述了在Android应用中如何在关闭一个Activity时将参数返回给另一个Activity,并详细介绍了Activity的生命周期及其重要性。同时提供了如何在异常情况下保存临时数据、处理事件如触摸、键盘操作等的实用技巧。

转载请注明本文出自Cym的博客(http://blog.youkuaiyun.com/cym492224103),谢谢支持!


前言

我们要讲如果在关闭了第二个Activiy的时候将参数返回给第一个Activity。以及非常重要的Activity生命周期,还有就是实战中经常遇到的开发问题解决方案。


Activity间传递数据打开一个activity关闭之后,返回数据

Activity1

  1. public void open(View v){  
  2.            Intent intent = newIntent(this,OtherActivity.class);  
  3.            //requestCode :请求码(区分请求的来源)  
  4.            startActivityForResult(intent, 100);  
  5.     }  
  6. protected void onActivityResult(intrequestCode, int resultCode, Intent data) {  
  7.            //TODO Auto-generated method stub  
  8.            super.onActivityResult(requestCode,resultCode, data);  
  9.            if(requestCode== 100 && resultCode == 200 && data != null){  
  10.                   String info =data.getStringExtra("info");  
  11.                   et_info.setText(info);  
  12.            }  

Activity2:

  1. public void close(View v){  
  2.            String info =et_info.getText().toString();  
  3.            Intent data = new Intent();  
  4.            data.putExtra("info", info);  
  5.            //resultCode 结果码(区分返回的结果)  
  6.            setResult(200, data);  
  7.              
  8.            //关闭Activity  
  9.            finish();  
  10. }  


Activity生命周期

完整生命周期

  onCreate()  

  --> onStart()

  --> onResume()

   可以在手机上看见activity

  ---> onPause()

  --> onStop()

   看不见了

  ---> onDestory()

   销毁了


前台生命周期

  onstart()  ---> onStop()之间进行切换

  onCreate() --> onStart() --> onResume()

   现在有一个activity完全覆盖

  onPause()  ----> onStop()

   如果上面的activity关闭

  onRestart() ---> onStart() --> onResume()

   

可视生命周期

   onResume()  ---> onPause()之间进行切换

  onCreate() --> onStart() --> onResume()

   现在有一个activity没有完全覆盖

  onPause()

   如果上面的activity关闭

  onResume()


临时数据

临时数据:应用程序出现异常。我们需要保存的数据。

  1. //保存临时数据  
  2.    @Override  
  3.    protected void onSaveInstanceState(Bundle outState) {  
  4.            // TODO Auto-generated method stub  
  5.            super.onSaveInstanceState(outState);  
  6.            outState.putInt("page"88);  
  7.     }  
  8.      
  9.    //用来恢复数据  
  10.    @Override  
  11.    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  12.            // TODO Auto-generated method stub  
  13.            super.onRestoreInstanceState(savedInstanceState);  
  14.            int page = savedInstanceState.getInt("page");  
  15.            Log.i("i","page:"+page);  
  16. }  

横竖屏问题

ctrl+ F12 可以让模拟器横竖屏切换

竖屏---》横屏

先杀死一个Activity,再创建一个Activity

横屏---》竖屏

先杀死一个Activity,再创建一个Activity,

再杀死一个Activity,再创建一个Activity

原因:android的键盘导致

如果要变成一样:

  1. <activity  
  2.            android:label="@string/app_name"  
  3.            android:name=".MainActivity"  
  4.            android:configChanges="keyboardHidden">  

此时会创建一个Activity实例

我不想创建。

  1. <activity  
  2.            android:label="@string/app_name"  
  3.            android:name=".MainActivity"  
  4.            android:configChanges="keyboardHidden|orientation">  

此时不会创建实例

我想横屏和竖屏显示不一样。

  1. //当切屏幕的时候触发  
  2.     public voidonConfigurationChanged(Configuration newConfig) {  
  3.            // TODO Auto-generated method stub  
  4.            super.onConfigurationChanged(newConfig);  
  5.            int orientation = newConfig.orientation;  
  6.            //竖屏  
  7.            if(orientation ==Configuration.ORIENTATION_PORTRAIT){  
  8.                   setContentView(R.layout.main);// 切换视图  
  9.            }else{  
  10.                   setContentView(R.layout.other);  
  11.            }  
  12. }  


事件

//触摸事件

onTouchEvent()

//键盘按下

onKeyDown()

//键盘弹起

onKeyUp()

//键盘长按

onKeyLongPresss()

//键盘重复点击

onKeyMultiple()


必须知道的问题~!(面试经常问到)

activity返回时,如何返回数据?  

Activity1

1.startActivityForResultintent // 请求

3.onActivityResult() // 回调拿到反馈数据

Activity2:

2.setResult()//反馈

activity生命周期有哪些状态,有哪些方法?

onCreate();

onStart();-------------

onResume();

onPause();

onStop(); ---------onReStart();

onDestroy();

异常情况下保存临时数据的方法?      

onSaveInstanceState(); // 保存数据

onRestoreInstanceState(); // 读取数据

常用事件有哪些?

onKeyUp();

onKeyDown();

onKeyLongPress();

onKeyMultiple();

onTouchEvent();

需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕需求响应动态冰蓄冷系统及其优化策略展开研究,结合Matlab代码实现,探讨了在电力需求侧管理背景下,冰蓄冷系统如何通过优化运行策略参与需求响应,以实现削峰填谷、降低用电成本和提升能源利用效率的目标。研究内容包括系统建模、负荷预测、优化算法设计(如智能优化算法)以及多场景仿真验证,重点分析不同需求响应机制下系统的经济性和运行特性,并通过Matlab编程实现模型求解与结果可视化,为实际工程应用提供理论支持和技术路径。; 适合人群:具备一定电力系统、能源工程或自动化背景的研究生、科研人员及从事综合能源系统优化工作的工程师;熟悉Matlab编程且对需求响应、储能优化等领域感兴趣的技术人员。; 使用场景及目标:①用于高校科研中关于冰蓄冷系统与需求响应协同优化的课题研究;②支撑企业开展楼宇能源管理系统、智慧园区调度平台的设计与仿真;③为政策制定者评估需求响应措施的有效性提供量化分析工具。; 阅读建议:建议读者结合文中Matlab代码逐段理解模型构建与算法实现过程,重点关注目标函数设定、约束条件处理及优化结果分析部分,同时可拓展应用其他智能算法进行对比实验,加深对系统优化机制的理解。
<think>我们正在解决相机页面按下Home键后进入横屏的问题。根据之前的讨论和引用,核心原因是系统状态继承与配置冲突,特别是横屏状态未重置以及分屏模式残留影响。现在用户明确要求分析相机页面按下Home键后进入横屏的原因及解决办法,并且提供了几个引用,其中引用[1]和引用[3]与问题相关。 引用[1]提到:按home键退出后再通过最近任务进入,因为不会有竖屏到横屏的切换,所以截图(snapshot)时使用的是竖屏的rect。这说明了在ActivityTaskManager中,当通过Home键退出时,系统会记录当前界面的方向状态,并在下次恢复时使用。如果按下Home键时应用处于横屏状态,那么系统可能会错误地将横屏状态继承到桌面。 引用[3]中提到了一种实现横竖屏的思路:通过在AndroidManifest.xml中设置activity的方向属性来控制。另外,也提到了通过代码动态设置横屏的方法,但这种方法在按下Home键后可能会遗留横屏状态。 因此,我们可以总结原因如下: 1. 相机应用通常被设置为横屏模式(通过AndroidManifest.xml中的`screenOrientation`属性设置为`landscape`,或者通过代码动态设置为横屏),在按下Home键退出时,系统没有及时重置屏幕方向,导致桌面错误地继承了横屏状态。 2. 系统在创建任务快照(snapshot)时,如果应用处于横屏状态,则快照的尺寸也是横屏的尺寸(即宽>高)。但是当按下Home键后,系统需要显示桌面(通常是竖屏),此时由于系统没有重置方向,导致桌面以横屏布局显示。 解决办法: 1. 在相机Activity的`onPause`方法中重置屏幕方向为竖屏(或者用户设定的默认方向)。这样当按下Home键退出时,系统会将方向重置,从而桌面可以正确显示竖屏。 ```java @Override protected void onPause() { super.onPause(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } ``` 2. 在AndroidManifest.xml中,为相机Activity设置`screenOrientation`属性为`user`(或者`sensor`)而不是`landscape`。这样当退出应用时,系统可以自动恢复为用户设置的默认方向。 ```xml <activity android:name=".CameraActivity" android:screenOrientation="user" /> ``` 3. 系统级优化:系统桌面(Launcher)应该能够正确处理屏幕方向的变化,即使上一个应用是横屏,桌面也应该强制设置为当前配置的方向(通常是竖屏)。这需要系统开发者在Launcher中确保方向重置。 4. 针对用户设置:如果用户遇到这个问题,可以暂时关闭自动旋转屏幕功能(设置->显示->旋转屏幕),然后重新打开,可能会重置状态。 另外,引用[2]提到了自动旋转屏幕设置的影响。用户可以开启自动旋转屏幕,这样在需要竖屏的时候设备会自动旋转。但问题的根源在于相机应用退出时没有重置方向。 根据引用[1]中的日志,当通过Home键退出时,系统创建的任务快照(snapshot)是竖屏的(1080x2280,即竖屏分辨率),这说明在快照时屏幕方向已经被重置了。但是为什么有时桌面会横屏呢?可能是以下原因: - 在相机Activity退出后,系统没有立即更新屏幕方向,而是延迟更新,导致桌面在短暂的时间内显示了横屏。 - 系统桌面(Launcher)本身支持横屏模式,当系统检测到当前方向为横屏时,桌面就会以横屏显示。如果用户在相机退出后立即回到桌面,而此时系统方向尚未重置,桌面就会以横屏显示。 因此,除了在应用层重置方向外,还需要在系统层确保方向更新的及时性。但如果用户使用的是定制ROM(如华为、小米等),可能系统桌面对方向的处理有差异。 对于用户的问题,建议的解决方案是: 1. 开发者解决方案:在相机应用的Activity的onPause中重置方向(如上述代码所示)。 2. 临时解决方案:用户按Home键后,如果桌面横屏,可以手动旋转设备(旋转到竖屏再转回)或关闭再打开自动旋转屏幕设置。 生成相关问题: 1. 如何在Android相机应用中正确管理屏幕方向? 2. 为什么桌面应用有时会错误地进入横屏模式? 3. 如何防止应用退出时屏幕方向被错误继承? 4. 在AndroidManifest.xml中设置`screenOrientation`有哪些选项,它们有什么区别? 注意:在回答中,我们引用了引用[1]和引用[3],所以需要在引用的地方标注[^1]和[^3]。 </think>### 相机页面按下Home键后进入横屏的原因及解决方案 #### 一、核心原因分析 1. **相机状态继承异常** 相机应用通常锁定为横屏模式(使用`android:screenOrientation="landscape"`配置[^3])。当按下Home键时: - 系统未及时清除相机遗留的横屏状态参数 - WMS(窗口管理系统)错误地将横屏配置传递给桌面进程 $$ \text{相机状态} \xrightarrow{\text{Home键}} \text{系统错误继承} \to \text{桌面横屏} $$ 2. **快照机制缺陷** 系统创建任务快照时: ```java createTaskSnapshot: { buffer.getWidth(): 1080, buffer.getHeight(): 2280, mTmpRet: Rect(0, 0 - 1080, 2280) } // [^1] ``` 当通过Home键退出而非方向切换时,系统可能保留竖屏快照参数,但与实际横屏状态冲突[^1]。 3. **生命周期管理漏洞** 相机页面未在`onPause()`中重置方向配置: ```java // 错误:缺少方向重置逻辑 protected void onPause() { super.onPause(); // 应添加:setRequestedOrientation(SCREEN_ORIENTATION_USER) } ``` #### 二、解决方案 ##### 开发者端修复 1. **动态重置屏幕方向** 在相机Activity中添加: ```java @Override protected void onPause() { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); super.onPause(); } ``` 确保退出时释放方向锁定(兼容自动旋转[^2])。 2. **优化配置声明** 修改`AndroidManifest.xml`: ```xml <!-- 避免强制横屏 --> <activity android:name=".CameraActivity" android:screenOrientation="user" <!-- 替代landscape --> android:configChanges="orientation|screenSize"/> ``` ##### 用户端临时方案 1. **强制刷新系统UI** - 双击Home键打开最近任务视图 - 滑动关闭相机应用进程 - 返回桌面即可恢复竖屏 2. **重置旋转设置** ```mermaid graph LR A[设置] --> B[显示] B --> C[关闭自动旋转] C --> D[等待10秒] D --> E[重新开启自动旋转] ``` #### 三、系统级优化建议 1. **改进快照机制** 系统应增加方向状态校验: $$ \text{快照方向} = \begin{cases} \text{portrait} & \text{if } \texttt{HomeKeyPressed} \\ \text{currentOrientation} & \text{otherwise} \end{cases} $$ 2. **窗口管理增强** WMS需在应用切换时调用: ```c // Native层伪代码 void onActivitySwitch() { if (prevApp.isCamera && currentApp.isLauncher) { resetDisplayOrientation(DEFAULT_PORTRAIT); } } ``` > **根本原因**:相机强制横屏参数未被系统及时清理 + WMS窗口状态同步机制缺陷[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值