Android生命周期 & Activity生命周期


了解Android系统的进程优先级的变化方式

1.Android系统一般是运行在资源受限的硬件平台上,因此资源管理对Android系统很重要

2.为了保证高优先级程序正常运行,可以在无任何警告的情况下终止低优先级程序,并回收其使用的系统资源,因此,Android程序并不能完全控制自身的生命周期,而是由ANdroid系统进行调度和控制的

3.Android系统尽可能地不主动去终止应用程序,即使生命周期结束的程序也会保存在内存中,以便再次快速启动

4.但在内存紧张时,系统会根据进程的优先级清除进程,回收系统资源

Android系统中的进程优先级:

前台进程——>可见进程——>服务进程——>后台进程——>空进程

(高优先级) ( 中优先级 ) ( 低优先级 )

前台进程:是Android系统中最重要的进程,是与用户正在交互的进程

可见进程:指部分程序界面能被用户看见,却不在前台与用户交互,不响应界面时间的进程

服务进程:一个包含已启动服务的进程就是服务进程。服务进程没有用户界面,不与用户直接交互,但能够在后台长期运行,提供用户关心的重要功能(例如播放MP3文件或从网络下载数据)

后台进程:如果一个进程不包含任何已经启动的服务,而且没有任何用户可见的Activity,则这个进程就是后台进程(例如一个仅有Activity组件的进程,当用户启动了其他应用程序使这个进程的Activity完全被遮挡,则这个进程便成为了后台进程)

空进程:空进程就是不包含任何活跃组件的进程(例如一个仅有Activity组件的进程,当用户关闭Activity后,这个进程就成为了空进程)

注:

进程的优先级取决于所有组件中的优先级最高的部分(例如在进程中同时包含部分可见的Activity和已经启动的服务,则该进程是可见进程而不是服务进程),

进程的优先级会根据与其他进程的依赖关系而变化(例如进程A的服务被进程B调用,如果调用前进程A是服务进程,进程B是前台进程,则调用后进程A也具有前台进程的优先级)

Android组件

1.Android应用程序由组件组成,组件是可以被调用的基本功能模块

2.Android系统利用组件实现程序内部或程序间的模块调用,以解决代码复用的问题

3.程序设计时,在AndroidManifest.xml中声明可共享的组件,声明后其他应用程序可以直接调用这些共享组件

4.Android允许共享组件被Android系统直接实例化,从而保证能够调用进程没有启动的共享组件(Android系统没有使用常见的应用程序入口(Main函数))

Android的四大组件

分别是:Activity、Service、BroadcastReceiver和ContentProvider

Activity:

是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件(类似于窗体的概念)一个Activity是一个界面,是整个程序的门面,负责与用户交互(充当程序UI) 例:将Activity比作网站,网站里有很多网页(ACtivity),网页负责显示内容和接收用户数据

Service:

一般用于没有用户界面,但需要长时间在后台运行的应用,负责耗时较长的操作,没有图形化界面 (西游里的沙僧,脏活累活他干)

BroadcastReceiver:

是用来接收并响应广播消息的组件,广播接收器, 监听手机发生的一切事情(监听系统行为(没电,断网....)), 针对手机当中出现的各种情况作出相应的对策

ContentProvider:

是Android系统提供的一种标准的数据共享机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据。向外暴露数据的方法,负责对外提供数据,并允许有需要的应用程序访问这些数据 (图书馆)

其他重要的组件:

Intent和IntentFilter:

是Android应用内不同组件之间的通信载体,Activity、Service、BroadcastReceiver三种组件之间的通信都以Intent作为载体

UI组件通用属性:

android: id 指定标识, 使用: @+id/<标识符代号> 例: android: id = "@+id/show"

Java中获取组件 : findViewById("id"); 例: findViewById(R.id.show);

android: layout_width 指定界面组件宽度.

android: layout_height 指定界面组件高度.

属性值: wrap_content 包裹内容 match_parent 与父容器具有相同宽(高)度

Activity:

简单的说:Activity就是布满整个窗口或者悬浮于其他窗口上的交互界面。在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的Activity,如下设置

<activity

android:label="@string/app_name"

android:name=".MainActivity" >

<intent-filter >

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

  • 当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关操作。
  • 当启动其他的Activity时这个当前的这个Activity将会停止,新的Activity将会压入栈中,同时获取用户焦点,这时就可在这个Activity上操作了。
  • 我們都知道栈是先进后出的原则,那么当用户按Back键时,当前的这个Activity销毁,前一个Activity重新恢复。

Activity生命周期

Activity生命周期是指Activity从启动到销毁的过程,在这个过程中有4个状态:

活动状态、暂停状态、停止状态、非活动状态

1.活动状态:完全可见,正交互(当前Activity位于前台,用户可见,可以获得焦点)

2.暂停状态:部分可见,未交互(其他Activity位于前台,该Activity依然可见,只是不能获得焦点)

3.停止状态:不可见,未交互(该Activity不可见,失去焦点)

4.销毁状态:该Activity结束,或Activity所在的Dalvik进程被结束

一个Activity通常是一个单独的屏幕,一个程序通常有多个Activity,Activity生命周期是指Activity从启动到销毁的过程。系统中的Activity被一个Activity栈所管理。

当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到运行中的Activity退出为止。

栈是先进后出的原则,那么当用户按Back键时,当前的这个Activity销毁,前一个Activity重新恢复。

Activity生命周期的7个方法和3个阶段:

7个方法(事件回调函数):

void onCreate(Bundle savedlnstanceState)

创建Activity时被回调,该方法只会被调用一次

void onStart()

启动Activity时被回调

void onRestart()

重新启动Activity时被回调

void onResume()

恢复Activity时被回调,onStart()方法后一定会回调onResume()方法

void onPause()

暂停Activity时被回调

void onStop()

停止Activity时被回调

void onDestroy()

销毁Activity时被回调,该方法只会被回调一次

覆盖onPause()的情形:用户正在玩一个游戏,此时有电话打进来,需要将当前(游戏)暂停,并保存该游戏的进行状态,此时可覆盖onPause()方法来实现.

接下来当用户再次切换到该游戏的进行状态时,onResume()会被回调,因此可以通过重写onResume()方法来恢复游戏状态.

随着Activity自身状态的变化,Android系统会调用不同的时间回调函数,

开发人员在事件回调函数中添加代码,就可以在Activity状态变化时完成适当的工作

  • Activity经历如下3个阶段:
  • 开始Activity:在这个阶段依次执行3个生命周期的方法,分别是onCreate、onStart和onResume方法。
  • Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期,分别是 onRestart、onStart和onResume
  • 关闭Activity:当Activity被关闭时系统会依次执行3个生命周期方法,分别是:onPause、onStop和onDestory。

Activity生命周期可以分为完全生命周期、可视生命周期和活动生命周期

完全生命周期:

从Activity建立到销毁的全部过程,始于onCreate(),结束于onDestroy().一般情况下,在onCreate()中初始化Activity所能使用的全局资源和状态,

并在onDestroy()中释放这些资源.例如,Activity中使用后台线程,则需要在onCreate()中创建线程,在onDestroy()中停止并销毁线程.

在一些极端的情况下,Android系统会不调用onDestroy(),直接终止进程.

可视生命周期:

Activity在界面上从可见到不可见的过程,开始于onStart(),结束于onStop(). onStrat()一般用来初始化或启动与更新界面相关的资源.

onStop()一般用来暂停或停止一切与更新界面相关的线程、计时器或Service等,因为在调用onStop()后,Activity对用户不再可见,更新用户界面也就没有意义了.

onRestart()函数在onStart()前被调用,用来在Activity从不可见变为可见的过程中进行一些特定的处理过程.因为Activity不断从可见变为不可见,再不可见变为可见,

所以onStart()和onStop()会被多次调用.另外,onStart()和onStop()也经常被用来注册和注销BroadcastReceiver.

活动生命周期:

此时Activity在屏幕最上层,并能够与用户进行交互的阶段,开始于onResume(),结束于onPause().

因为在Activity的状态变换过程中,onResume()和onPause()经常被调用,因此这两个函数中应该使用简单高效的代码.

优质内容筛选与推荐>>
1、bzoj4199
2、linux 安装memcached
3、[高级]android应用开发之intent的妙用二
4、javascript/dom:固定居中效果
5、使用burpsuite的几点经验


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号