Android面试(一):Activity面试你所需知道的一切

1. 什么是Activity:

四大组件之一,通常一个用户交互界面对应一个activity。activity是Context的子类,同时实现了window.callback和keyevent.callback,可以处理与窗体用户交互的事件。
我开发中常用的有FragmentActivity、ListActivity、TabActivity(Android 4.0被Fragment取代)

2. Activity生命周期:

1.png

onCreate:当Activity第一次启动调用
onDestory:当Activity销毁的时候调用
onStart:当Activity变成可见调用
onStop:当Activity不可见调用
onResume:当Activity可以交互调用这个方法 当界面上的按钮被点击的时候调用
onPause:当Activity不可以交互调用这个方法 当界面上的按钮不可以点击
onRestart:当界面重新启动的时候调用

调用的依次顺序是:onCreate ---> onStart ---> onResume ---> onPause ---> onStop ---> onDestory,还有一个onRestart,其中onRestart是在Acitivity被onStop后,但是没有被onDestory,在再次启动此Activity时调用的(而不再调用onCreate)方法;
如果被onDestory了,则是调用onCreate方法。

  • 点击Home键回到主界面(Activity不可见):onPause ---> onStop

  • 当我们再次回到原Activity时: onRestart ---> onStart ---> onResume
    onRestart:已经启动的activity,又从桌面回到activity时,再次启动

  • 退出当前Activity时: onPause ---> onStop ---> onDestory

3. Activity的四种状态:

running / paused / stopped / killed

  1. runnig:用户可以点击,activity处于栈顶状态。
  2. paused:activity失去焦点的时候,被一个非全屏的activity占据或者被一个透明的activity覆盖,这个状态的activity并没有销毁,它所有的状态信息和成员变量仍然存在,只是不能够被点击。(除了内存紧张的情况,这个activity有可能被回收)
  3. stopped:这个activity被另外一个activity完全覆盖,但是这个activity的所有状态信息和成员变量仍然存在(除了内存紧张)
  4. killed:这个activity已经被销毁,其所有的状态信息和成员变量已经不存在了。
  5. Android进程优先级:
    前台 / 可见 / 服务 / 后台 / 空
    1. 前台进程:Foreground process
    • 用户正在交互的Activity(onResume())
    • 当某个Service绑定正在交互的Activity
    • 被主动调用为前台Service(startForeground())
    • 组件正在执行生命周期的回调(onCreate()、onStart()、onDestory())
    • BroadcastReceiver正在执行onReceive()
    2. 可见进程:Visible process
    • 我们的Activity处在onPause()(没有进入onStop())
    • 绑定到前台Activity的Service
    3. 服务进程:Service process
    • 简单的startService()启动。
    4. 后台进程:Background process
    • 对用户没有直接影响的进程 --- Activity处于onStop()的时候。
      android:process=":xxx"
    5. 空进程:Empty process
    • 不含有任何的活动的组件。(Android设计的,处于缓存的目的,为了第二次启动更快,采取的一个权衡)

5. 两个Activity之间跳转必然会执行的是哪几个方法:

a、一般情况比如说有两个activity,分别叫A、B ,当在A里面激活B组件的时候,A 会调用 onPause()方法,然后B 调用onCreate、onStart、 OnResume,这个时候B覆盖了窗体,A会调用onStop方法. 。
b、如果B是个透明的界面,或者是对话框的样式,,就不会调用onStop方法。

6. 横竖屏切换的生命周期变化:

这个生命周期跟清单文件里的配置有关系:
a、不设置Activity的android:configChanges时,切屏会销毁当前Activity,然后重新加载,重新调用各个生命周期。onPause ---> onStop ---> onDestory ---> onCreate --->onStart ---> onResume。

b、设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。

7. Activity的四种启动模式:

清单文件中可以配置每个activity的启动模式,例如:
android:launchMode="standard"
(1) standard 标准模式:
特点:此模式不管有没有已存在的实例,都生成新的实例。每次调用startActivity()启动Activity时都会创建一个新的Activity放在栈顶,每次返回都会销毁实例并出栈,可以重复创建。
(2) singleTop 单一顶部模式:
特点:会检查任务栈栈顶的Activity,如果发现栈顶已经存在实例,就不会创建新的实例,直接复用。但如果不在栈顶,那么还是会创建新的实例。
应用场景:浏览器书签的页面,流氓的网站,避免创建过多的书签页面
(3) singleTask 单一任务模式:
特点:这种模式不会检查任务栈的栈顶,检查当前任务栈,如果发现有实例存在,直接复用。任务栈中只有一个实例存储(把当前activity上面的所有的其它activity都清空,复用这个已经存在的activity)
应用场景:浏览器浏览页面的Activity,播放器播放的activity。
(4) singleinstance 单一实例模式
特点:系统会为这个Activity单独创建一个任务栈,这个任务栈里面只有一个实例存在并且保证不再有其它activity实例进入。
应用场景:来电页面。

8. scheme跳转协议:

Android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉app跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远
Android产品研发(十一)-->应用内跳转Scheme协议

9. 如果后台的activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态:

除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性就越大。
一般来说,调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内存中,activity 的所有信息和状态数据不会消失,当 activity 重新回到前台之后,所有的改变都会得到保留。但是当系统内存不足时, 调用onPause()和onStop()方法后的 activity可能会被系统摧毁,,此时内存中就不会存有该 activity 的实例对象了。如果之后这个 activity 重新回到前台,之前所作的改变就会消失。
为了避免此种情况,我们可以覆写onSaveInstanceState()方法。onSaveInstanceState()方法接受一个 Bundle 类型的参数,开发者可以将状态数据存储到这个 Bundle 对象中,这样即使 activity 被系统摧毁,当用户重新启动这个 activity 而调用它的onCreate()方法时,上述的 Bundle 对象会作为实参传递给 onCreate()方法,开发者可以从 Bundle 对象中取出保存的数据,然后利用这些数据将 activity 恢复到被摧毁之前的状态。

但是有些情况用上面这种方式是解决不了的,比如说我们正在播放一个视频,结果手机突然没电了,我们想在手机充电之后,还能返回到我们之前播放的位置,就可以仿照WPS等软件的保存机制,可以在播放视频的时候,每隔一段时间保存当前进度到一个文件中(不能是内存),这样即使没电了,但是我们之前的某个时间有保存当前进度,所以仍然能够回到之前播放的位置。

喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!

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

推荐阅读更多精彩内容