Activity面试问题讲解

一、activity 生命周期
1,activity的四种状态
Android程序中,Activity是程序和用户交互的界面,在系统中存在四种状态:Running, Paused, Stopped, Killed。
Running是指Activity在系统中获得焦点的状态,此时用户可以与该程序进行交互,对程序进行直接操作。

Paused 是指Activity在系统中未获得焦点,但对用户来说仍然可视的状态,该Activity上层可能有一个透明、对于用户不可见的Activity层或者有一个Dialog样式的Activity层,都会让Activity进入Paused状态。此状态下该Activity无法和用户进行直接交互。

Stopped是当该Activity在系统中失去焦点并且上层存在不透明的、非Dialog样式的Activity(即对用户不可视)的状态。此状态下,该Activity的数据毁在RAM中暂时保留,但是,一旦系统需要内存,这种处于Stopped状态的Activity占用的RAM空间会优先被清理并重新利用。所以,在Activity处于Stopped状态时,必须要保存该Activity的UI状态,否则一旦RAM空间被重新利用,UI状态和数据就完全丢失。

Killed是指Activity在RAM中被移除或者关闭的状态。也就是说此时Activity处于关闭的状态,不占用RAM空间。

2,activity 生命周期
activity启动 onCreate–>onStart(可见无法交互)–>onResume(可见可以交互)

点击home键回到主界面(activity不可见)onPause–>onStop

再次回到activity onRestart–>onStart–>onResume

退出activity onPause–>onStop–>onDestroy

3,android进程优先级

一.前台进程(Foreground process)
  前台进程是用户当前做的事所必须的进程,如果满足下面各种情况中的一种,一个进程被认为是在前台:

进程持有一个正在与用户交互的Activity。

进程持有一个Service,这个Service处于这几种状态:①Service与用户正在交互的Activity绑定。②Service是在前台运行的,即它调用了 startForeground()。③Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。

进程持有一个BroadcastReceiver,这个BroadcastReceiver正在执行它的 onReceive() 方法。

杀死前台进程需要用户交互,因为前台进程的优先级是最高的。

二.可见进程(Visible process)
  如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:

进程持有一个Activity,这个Activity不在前台,但是仍然被用户可见(处于onPause()调用后又没有调用onStop()的状态,比如,前台的activity打开了一个对话框,这样activity就会在其后可见)。

进程持有一个Service,这个Service和一个可见的(或者前台的)Activity绑定。

可见的进程也被认为是很重要的,一般不会被销毁,除非是为了保证所有前台进程的运行而不得不杀死可见进程的时候。

三.服务进程 (Service process)
  如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程。

尽管服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要。

四.后台进程 (Background process)
  如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity(activity的onStop()被调用,但是onDestroy()没有调用的状态),就认为进程是一个后台进程。

后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程。

通常会有很多个后台进程存在,它们会被保存在一个LRU (least recently used)列表中,这样就可以确保用户最近使用的activity最后被销毁,即最先销毁时间最远的activity。

五.空进程
如果一个进程不包含任何活跃的应用组件,则认为是空进程。
例如:一个进程当中已经没有数据在运行了,但是内存当中还为这个应用驻留了一个进程空间。
保存这种进程的唯一理由是为了缓存的需要,为了加快下次要启动这个进程中的组件时的启动时间。系统为了平衡进程缓存和底层内核缓存的资源,经常会杀死空进程。

二、activity 启动模式
1,standard-默认模式

   这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。

2,singleTop-栈顶复用模式

   这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。 

3,singleTask-栈内复用模式

   这个模式十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。 

4,singleInstance-全局唯一模式

   该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

三、scheme 跳转协议

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值