深入Activity生命周期(三)

简介: 在上一篇中说,用实例说明了Activity的生命周期,从onCreate()到onDestroy(),以及当按下home键,按下Call键弹出对话框时,Activity的生命周期,接下来给大家分享,深入Activity生命周期。

      在上一篇中说,用实例说明了Activity的生命周期,从onCreate()到onDestroy(),以及当按下home键,按下Call键弹出对话框时,Activity的生命周期,接下来给大家分享,深入Activity生命周期。

     还是上面这个(二)中的例子,如果我们在EditText中编辑了一些文字,如:

              

 当切换手机横屏时,发现结果如下:

   

 EditText中的数据没有了, 在这个屏幕切换过程中Activity的生命周期是什么样子的呢?我们来分析一下,还是先来看log,

  

07-31 06:39:46.820: INFO/my(1498): onCreate---
07-31 06:39:46.820: INFO/my(1498): onStart---
07-31 06:39:46.830: INFO/my(1498): onResume---
07-31 06:40:30.089: INFO/my(1498): onSaveInstanceState---
07-31 06:40:30.089: INFO/my(1498): onPause---
07-31 06:40:30.089: INFO/my(1498): onStop---
07-31 06:40:30.089: INFO/my(1498): onDestroy---
07-31 06:40:30.199: INFO/my(1498): onCreate---
07-31 06:40:30.209: INFO/my(1498): onStart---
07-31 06:40:30.209: INFO/my(1498): onResume---

      发现在切换屏幕时,先调用了onSaveInstanceState(),这个函数式用来保存状态的,数据就存放在bundle中,保存的数据会同时发送给onCreate()和onRestoreInstanceState()。

保存数据后会先暂停Activity 然后停止,销毁程序,然后重新创建Acitivty,在这个过程中,新的Activity中的EditText和过去的Activity中EditText不是同一个,因为在不同Context中,

而且是新创建出来的。过去的EditText中有数据,但是这个数据在新创建出来的EditText中是没有保存的,因此新的EditText中是没有数据的。如果我们需要保存这个数据,该怎么做?

    从log中可以知道,函数onSaveInstanceState(),是用来保存状态的,因此我们可以在onSaveInstanceState()中添加代码:

 @Override
    protected void onSaveInstanceState(Bundle outState)
    {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
        String str = et.getText().toString();
        Log.i("my", "onSaveInstanceState---str="+str);
        outState.putString("content", str);
        
    }

   有同学会问,那么我们再Bundle中把数据放进去了,在哪里取出来,然后把数据填充到EditText中呢?

   其实在2.2的版本中,实测实验表明我们只需给EditText添加Id即可,系统自动把原有数据填充到EditText中,切换屏幕实验一下,截图如下:
  

 

  这里有很多博文中讲到需要在onSaveInstanceState()中做数据保存的工作,指的是一些复杂操作,而如果是简单的控件保存原来的数据,则只需添加控件Id即可。大家可以亲测下。

当然如果需要做复杂点操作,比如我们需要将整个EditText数据取出来,或者其他的,这里提供给大家一个例子,可以试试

代码如下:

View Code
  1 public class AaaaaaActivity extends Activity {
  2     
  3     EditText et;
  4     TextView tv;
  5     static boolean orientation = false;
  6     
  7     
  8     /** Called when the activity is first created. */
  9     @Override
 10     public void onCreate(Bundle savedInstanceState) {
 11         super.onCreate(savedInstanceState);
 12         setContentView(R.layout.main);
 13         initUI();
 14         Log.i("my", "orientation---"+orientation );
 15         if(orientation)
 16         {
 17             String str = savedInstanceState.getString("content");
 18             Log.i("my", "str---"+str );
 19         }
 20         Log.i("my", "onCreate---" );
 21     }
 22   
 23     
 24     private void initUI()
 25     {
 26         et = (EditText)findViewById(R.id.et);
 27         tv = (TextView)findViewById(R.id.tv);
 28     }
 29     
 30     @Override
 31     protected void onRestart()
 32     {
 33         // TODO Auto-generated method stub
 34         super.onRestart();
 35         Log.i("my", "onRestart---");
 36     }
 37 
 38 
 39     @Override
 40     protected void onStart()
 41     {
 42         // TODO Auto-generated method stub
 43         super.onStart();
 44         Log.i("my", "onStart---");
 45     }
 46 
 47 
 48     @Override
 49     protected void onResume()
 50     {
 51         // TODO Auto-generated method stub
 52         super.onResume();
 53         Log.i("my", "onResume---");
 54     }
 55 
 56 
 57     @Override
 58     protected void onSaveInstanceState(Bundle outState)
 59     {
 60         // TODO Auto-generated method stub
 61         super.onSaveInstanceState(outState);
 62         String str = et.getText().toString();
 63         Log.i("my", "onSaveInstanceState---str="+str );
 64         outState.putString("content", str);
 65         orientation = true;
 66     }
 67     
 68     @Override
 69     protected void onRestoreInstanceState(Bundle savedInstanceState)
 70     {
 71         // TODO Auto-generated method stub
 72         super.onRestoreInstanceState(savedInstanceState);
 73         Log.i("my", "onRestoreInstanceState---");
 74         String str = savedInstanceState.getString("content");
 75         Log.i("my", "content="+str);
 76     }
 77     
 78 
 79     @Override
 80     protected void onPause()
 81     {
 82         
 83         // TODO Auto-generated method stub
 84         super.onPause();
 85         Log.i("my", "onPause---");
 86     }
 87 
 88     @Override
 89     protected void onStop()
 90     {
 91         // TODO Auto-generated method stub
 92         super.onStop();
 93         Log.i("my", "onStop---");
 94     }
 95 
 96     @Override
 97     protected void onDestroy()
 98     {
 99         // TODO Auto-generated method stub
100         super.onDestroy();
101         Log.i("my", "onDestroy---");
102     }
103 }

 

 

(为什么不能上传附件??)

  分析log,证实onSaveInstanceState()会在onStart(),和onResume()之间执行。

  附:

   如果需要设置横屏不重启Activity,那么在manifest中注明 :

        

android:configChanges="orientation|keyboardHidden"

又或者根本不允许屏幕切换只能竖屏,设置如下:

android:screenOrientation=”landscape”

只能横屏,设置如下:

 

android:screenOrientation=”portrait”

 

 

               

 

  

目录
相关文章
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1283 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1312 87
|
1天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
171 82
2025年阿里云域名备案流程(新手图文详细流程)
|
1天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
152 86