Android四大组件之Activity

一.概述

通过学习本篇文章,你将学会:

1.Activity的生命周期

2.Activity生命周期的交互设计思想

3.onSaveInstanceState方法和onRestoreInstanceState方法作用和调用时机

4.Activity的启动模式

5.Activity之间的数据交互

6.启动系统中常见的Activity

二.Activity的生命周期

Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件。我们可以把它理解为可以和用户直接直接进行交互的载体,就是能实实在在看得见的界面。学习Activity,我们首先需要了解它的一个生命周期,Android官方文档给出的生命周期:

从上图可以看到,Activity的基本生命周期是:onCreate--->onStart--->onResume--->onPause--->onStop--->onDestory,可以记忆成“创始人,盘丝洞”。下面讲一下每个函数的作用:

onCreate:当Activity第一次被创建的时候调用此方法,一般在此方法中进行控件的声明,添加事件等初始化工作。

onStart:当Activity被显示到屏幕上的时候调用此方法,但是还没出现在前台,我们还看不到,无法与Activity交互。

onResume:当Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.

onRestart:当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法

onPause:当Activity失去焦点,去重新开启另外一个活动的时候调用,可以在这里做一些数据的的保存和资源的释放,但是不能做耗时操作

onStop:此Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。

onDestory:此Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作

三.Activity生命周期的交互设计思想

1.A启动B,然后从B返回A生命周期会怎么调用:

onPause(A)--->onCreat(B)--->onStart(B)--->onResume(B)--->onStop(A)

思考:

1.为什么先调用第一个Activity的onPause()方法,然后再调用第二个Activity的onCreate()

2.为什么不是先调用A的onStop方法结束了再去调用B的onCreate

解答:

1.假如有这样一个情况,你正在使用APP听音乐,突然来了一个电话,那么当然需要先暂停音乐,然后进行电话的处理。所以这就是onPause()方法的作用,可以用来保存当前的各种信息.可以在这个APP的onPause()方法中实现暂停音乐的逻辑,然后再处理电话的业务处理,这就是这个方法的设计之初

2.根据上面生命周期相关方法的作用我们知道,只有当A完全不可见的时候activity才会调用onStop方法,而B只有在调用onResume的时候才是可见获取到焦点可操作的,因此需要等到B调用完onResume才会调用A的onStop。同时,也是谷歌对安全性的考虑,假如先调用第一个Activity的onStop()方法,那么此时第一个Activity将不可见,如果接下来调用第二个Activity的一系列创建方法失败了,那么就会导致这两个Activity都没显示在屏幕上,就会出现黑屏等不友好界面.如果是调用完第二个Activity一系列创建方法后,再调用第一个Activity的onStop()方法,就会避免这种情况的发生。

2.A启动B(Dialog风格的Activity),生命周期会怎么调用:

onPause(A)--->onCreate(B)--->onStart(B)--->onResume(B)

注意:如果A只是弹出dialog对话框的时候,A不会回调onPause。

四.onSaveInstanceState方法和onRestoreInstanceState方法作用和调用时机

Activity的onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况时由系统去销毁一个activity的时候比如因系统资源配置发生改变或者内存不足导致的activity的销毁。我们看下面这张图:


我们可以看到:由于activity是在异常情况下终止的,系统会调用onSaveInstance来保存当前activity状态,这个方法的调用时机是在onStop之前。当activity重新创建后,系统会调用onRestoreInstanceState,并且把activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,onRestoreInstanceState会在onCreate之后,onResume之前调用。

注意: 通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

五.Activity的启动模式

Activity有四种启动模式:standard,singleTop,singleTask,singleInstance

1.standard:标准模式,也是默认的启动模式,启动activity时直接创建新的实例并压入启动它的任务栈顶。

2.singleTop:单顶模式,栈顶复用模式,该模式唯一与standard不同的就是,如果启动singleTop模式的activity时发现当前任务的栈顶已经存在着这个activity的实例,那么就不会创建新的实例,其他的跟标准模式一样。

3.singleTask:单任务模式,栈内复用模式,当我们将要启动该模式的activity时,系统会判断当前是否有它想要的任务栈:没有它要的任务栈 系统会新创建一个任务,并将该activity实例化作为该任务的根activity。有它要的任务栈 这时候系统会找到该任务栈,如果任务栈里只有它自己则直接调用该activity实例的onNewIntent()方法。如果任务栈中它的上方还存在别的activity,那么这些activity会被全部弹出栈。

4.singleInstance:单例模式,会为activity单独创建一个任务并能够复用。但是该模式的activity不允许其他activity跟自己存在于同一个任务中,由此 activity 启动的任何 activity 均会被在其他的任务中打开。

六.Activity之间的数据交互

1.通过Intent的putExtra方法传递JAVA八大基本类型及其数组类型等:

intent.putExtra("name","zhangsan");//发送

getIntent().getStringExtra("name");//接收

2.通过Bundle将数据达成一捆进行传递                                                                                                                  //发送                                                                                                                                                              Bundle bundle =new Bundle();                                                                                                                               bundle.putString("name","zhangsan");                                                                                                                 bundle.putInt("age",23);                                                                                                       intent.putExtras(bundle);

//接收                                                                                

intent.getStringExtra("name")

3.使用Bundle对象的putSerializable()方法

新建一个Person实现Serializable,通过bundle的putSerializable("person",person); intent.putExtras(bundle);

Person person = (Person) intent.getSerializableExtra("person");

七.启动系统中常见的Activity

1.打开浏览器网页:

Intent intent =new Intent();

intent.setAction(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

2.打开相册:

Intent intent =new Intent();

intent.setAction(Intent.ACTION_GET_CONTENT);

intent.setType("image/*");

startActivity(intent);

3.打开发送短信界面:

Intent intent =new Intent();

intent.setAction(Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_TEXT,"Hello World !");

startActivity(intent);

4.打开拨号界面:

Intent intent =new Intent();

intent.setAction(Intent.ACTION_VIEW);

intent.setData(Uri.parse("tel:110"));

startActivity(intent);

八.总结

以上就是关于activity的知识点,如有不足或者错误的地方,请指正。不管怎样,代码的东西不只是需要多看,更需要通过自己动手去写去熟悉代码才能有更深的印象,更好更全面的了解。这是在简书上的第一篇文章,用的不是很熟练。

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

推荐阅读更多精彩内容