Activity重点

生命周期图

1.启动Activity:系统会先调用onCreate,然后调用onStart,最后调用onResume,Activity进入运行状态。

2.当前Activity被锁屏:系统会调用onPause,onSaveInstanceState,onStop暂停当前Activity的执行。解锁之后onRestart,onStart,onResume。

3.当前Activity被被其他Activity覆盖其上(仍然可见),系统会调用onPause,暂停当前Activity的执行。由被覆盖状态回到前台系统调用onResume。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会调用onPause,onSaveInstanceState,onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会调用onRestart,onStart,onResume方法,再次进入运行状态。

6.用户退出当前Activity:系统调用onPause,onStop,onDestory,结束当前Activity.


重要的几个方法

onSaveInstanceState

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;

(2)在用户改变屏幕方向时,此方法会被调用;

(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。

第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。(onSaveInstanceState的调用顺序是在onPause之后)

onRestoreInstanceState

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;

(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。

(onRestoreInstanceState的调用顺序是在onStart之后)

onWindowFocusChanged:在Activity窗口获得或失去焦点时被调用,可以获取视特定视图组件的尺寸大小

注:系统会在资源不足的情况下,回收Activity,但是系统会调用onSaveInstanceState,在Bundle savedInstanceState中为保存一些状态数据,所以在onCreate(Bundle savedInstanceState)中会有savedInstanceState,所以我们可以在onRestoreInstanceState中存储少量数据(为什么是少量,因为采用Bundle,比如bitmap等无法存储,要是可序列化的,所以这并不是最好的方案),在onCreate或者onSaveInstanceState之中恢复,正常finish是不会走onSaveInstanceState的,所以在操作的时候注意对Bundle进行判断。


保存状态信息

从前面生命周期中可以看到,当Activity处于onPause和onStop状态时都有可能被系统回收,因此对于我们该Activity中的一些关键数据最好能够保存下来,当用户再次进入时能够回到原来的状态。官方文档中是推荐我们在onPause()中区保存信息的,比如将数据写入到SharedPreference中。Android还提供了onSaveInstanceState(Bundle)方法来保存数据,通过Bundle来持久化数据。另外,关于大量数据可以使用Fragment来保存。

(至于具体是在onPause中保存,还是onSaveInstanceState中保存,还是看项目需求,大部分情况下,使用onSaveInstanceState能够满足需求)

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案


Activity的跳转

Activity跳转,无返回结果

这是最简单的Activity跳转方式。从一个Activity启动另一个Activity,直接startActivity(new Intent(当前Activity.this, 下一Activity.class))。

Activity跳转,返回数据/结果

需要返回数据或结果的,则使用startActivityForResult (Intent intent, int requestCode),requestCode的值是自定义的,用于识别跳转的目标Activity。跳转的目标Activity所要做的就是返回数据/结果,setResult(int resultCode)只返回结果不带数据,或者setResult(int resultCode, Intent data)两者都返回!而接收返回的数据/结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是setResult里面的resultCode,返回的数据在data里面。

** 注意,在setResult后,要调用finish()销毁当前的Activity,否则无法返回到原来的Activity,就无法执行原来Activity的onActivityResult函数,看到当前的Activity没反应。

Intent intent = new Intent(MainActivity.this,  OtherActivity.class);

intent.putExtra("a", a);

 intent.putExtra("b", b);

startActivityForResult(intent, REQUESTCODE); //REQUESTCODE--->1

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data)

    super.onActivityResult(requestCode, resultCode, data); 

// RESULT_OK,判断另外一个activity已经结束数据输入功能,Standard activity result:

// operation succeeded. 默认值是-1

     if (resultCode == 2) {

         if (requestCode == REQUESTCODE)

{ } }}

Intent intent = new Intent();

intent.putExtra("three", three);

setResult(2, intent);

finish(); //结束当前的activity的生命周期

其实我们在Activity中调用startActivity的内部也是调用的startActivityForResult的。那么为什么调用startActivityForResult可以在Activity中回调onActivityResult而调用startActivity则不可以呢?可以发现其主要的区别是调用startActivity内部调用startActivityForResult传递的传输requestCode值为-1,也就是说我们在Activity调用startActivityForResult的时候传递的requestCode值为-1的话,那么onActivityResult是不起作用的。 

实际上,经测试requestCode的值小于0的时候都是不起作用的,所以当我们调用startActivityForResult的时候需要注意这一点。


Activity的启动流程 ,布局文件加载绘制流程

源码分析:

Android源码解析之(十四)-->Activity启动流程

Android源码解析之(十五)-->Activity销毁流程

Android源码解析(十七)-->Activity布局加载流程

Android源码解析(十八)-->Activity布局绘制流程

Activity启动过程中获取组件宽高的五种方式

综上:

Activity的启动流程一般是通过调用startActivity或者是startActivityForResult来开始的

startActivity内部也是通过调用startActivityForResult来启动Activity,只不过传递的requestCode小于0

Activity启动过程是:onPause 1 –> onCreate2 –> onStart 2–> onResume2 –> onStop1

Activity销毁过程是:onPause2 –> onRestart1 –> onStart1 –> onResume1 –> onStop2 –> onDestroy2

Activity的启动流程和Activity的布局文件加载绘制流程,其实没有相关的关系的,其实两个异步的加载流程,这样我们在Activity的onCreate和onResume方法调用textView.getHeight或者是textView.getWidth方法的时候,其组件并没有执行完绘制流程,因此此时获取到的组件的宽高都是默认的0,也就是无法获取组件的宽和高。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容