Android四大组件学习之Activity

生命周期

Activity生命周期.jpg
  • onCreate( ): 表示Activity正在被创建,这是生命周期的第一个方法,可以做一些初始化的工作。
  • onRestart( ): 表示Activity正在重新启动,Activity从不可见变为可见状态时,会被调用,比如点击Home键又回到这个Activity时,就会调用onRestart( )。
  • onStart( ): 表示Activity正在被启动,即将开始,这时Activity已经可见了,但还没出现在前台,无法跟用户交互。
  • onResume( ): 表示Activity已经可见了,并且出现在前台并开始活动了。
  • onPause( ) : 表示Activity正在停止,正常情况下,onStop紧接着被调用,此时可以做一些存储数据、状态存储等轻量级的存储工作,在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
  • onStop( ) : 表示Activity即将停止,如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。
  • onDestroy :当Activity销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个Activity而不会触发该方法。我们可以在这里做一些回收工作和最终的资源释放。
  • onSaveInstanceState ():系统调用该方法,允许Activity保存之前的状态,比如说在一串字符串中的光标所处的位置等。 通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。
几种常见情况的生命周期调用流程:

1.针对一个特定的Activity,第一次启动,回调是 onCreate -> onStart -> onResume.
2.当打开新的Activity或者切换到桌面时: onPause -> onStop。
有一个特殊情况是当新Activity是透明主题时,那么当前Activity不会回调onStop。

3.当用户回到原Activity,且原Activity未被销毁时: onRestart -. onStart -> onResume .

4.当用户按下back键时: onPause -> onStop -> onDestroy.

Activity之间的协调

当一个activity启动另一个时,两者都在走生命周期。如果这两个activity之间要共享数据,那么重点要理解当第二个activity被创建时,第一个activity还没有执行到onStop()。开始新一个和结束前一个之间有交集。
当activityA启动ActivityB时,会按以下顺序执行:
1Activity A 的onPause()执行。
2Activity B的onCreate(),onStart(),onResume()依次执行(此时actvityB具有用户焦点)。
3Activity A的onStop()被执行(假设A被B完全遮盖)。
你应跟据这个顺序来管理两者之间的数据传递。比如,如果A要向数据库中写入数据,要保证B在初始化时能读到A写入的完整数据,那么A应在onPause()方法中写入数据,而不能在onStop()中写入。

四种启动方式

任务栈的概念:
1.程序打开时就创建了一个任务栈, 用于存储当前程序的activity,所有的activity属于一个任务栈。
2.一个任务栈包含了一个activity的集合, 去有序的选择哪一个activity和用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。
3.任务栈可以移动到后台, 并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
4.退出应用程序时:当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。
任务栈的缺点:
1.每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用,户体验差, 需要点击多次返回才可以把程序退出了。
2.每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余, 重复数据太多, 会导致内存溢出的问题(OOM)。

因此,我们引入了启动模式来修改系统的默认行为:
<activity android:name=".MainActivity" android:launchMode="standard" />
其中的launchMode有四种方式:

1.singleTask:标准模式,每次启动一个Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。
2.singleTop: 栈顶复用模式,如果新Activity 已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数,我们可以取出当前请求的信息。
3.singleTask: 栈内复用模式,只要Activity在一个栈中存在,那么多次启动都不会重新创建实例,当需要运行的Activity不在栈顶时,系统会清空目标Activity上面的其他Activity(clearTop),使目标Activity实例成为栈顶。
**4.singleInstance **:单实例模式,在这种加载模式下,系统保证只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载该Activity实例。采用singleInstance模式加载的activity所在的Task只包含该Activity.

使用场景

  • singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。

  • singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。

  • singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
    另外,stackflow的一位大神也总结得很好:
    Between the Browser and Alarm Clock applications, you cover all four launch modes:

1.BrowserActivity uses singleTask. There is only one browser activity at a time and it doesn't become part tasks that send it intents to open web pages. While it might return to whatever most recently launched it when you hit back it is actually fixed at the bottom of its own task activity stack. It will share its task with activities that it launches like bookmarks.

2.BrowserBookmarksPage uses singleTop. While there can be multiple instances of this activity, if there is already one at the top of the task's activity stack it will be reused and onNewIntent() will be called. This way you only have to hit back once to return to the browser if the bookmarks activity is started multiple times.

3.AlarmClock uses standard. The user can launch multiple instances of this activity and these instances can be part of any task and anywhere in the activity stack. As a fairly simple application it doesn't really demand tight control of its activity.

4.AlarmAlert uses singleInstance. Only one alert activity at a time and it is always its own task. Anything it launches (if anything) becomes part of its own new task.

启动一个Activity

你可以用startActivity()启动一个activity,它有一个参数是intent,你需要在这个intent中指明要调用的activity。Intent中你可以明确地指定要启动的activity,或只指定activity的类型,此时系统会为你挑选一个合适的activity,这个activity可能位于其它程序中,也可能位于你自己的程序中。Intent的putextra方法中可以带一些被新activity使用的数据(相当于参数传递)。然后在新Activity中调用getIntent方法获取Intent实例,并得到里面的数据。

  Intent intent = new Intent(this, SignInActivity.class);  
  startActivity(intent);  

** Activity的关闭**:Activity可以内部调用finish()方法关闭它自己,也可以调用finishActivity()方法关闭其它的activity。

下一篇:
Android四大组件学习之BroadcastReceiver

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

推荐阅读更多精彩内容