摘要: 从这篇文章开始,每次学习android开发都会做一个记录,一是可以分享学习过程,二是可以当作笔记,知识遗漏的时候可以回头查看一下。第一篇就从Android基本组件和Activity开始吧。
关键字: android 学习,基本组件,Acticity
1 Android组件介绍
Android主要是由Activity,Broadcast,Service, Intent,Content Provider组成的,下面对这几个组件分别介绍一下。
1.1 Activity
对面向对象的语言Java,C++,C#等熟悉的同学会对封装比较熟悉。封装就是将一类事物的属性和功能集成到一个类里面,我们要使用或者设置这类事物的功能或属性,只要通过操作该类的对象就可以。在Android中道理也一样,Android中每次与我们交互的一个界面,这就是一个Activity对象,这个Activity对象包含有各种View组件,比如按钮,文本框,还有事件监听器等,我们与该Activity对象交互主要就是通过这些View组件。通常一个Activity都会是一个独立的功能或模块,比如Email,而且Activity往往是可以共享的,我们在写应用的时候,比如需要收发邮件,可以直接使用已有的Email Activity而不是自己再重新写一个Email的Activity。当然Activity之间是不可以直接互相访问的,需要通过Intent或者Content Provider。这两个会在后面介绍。
1.2 Intent
Intent是可以让一个Activity启动另一个Activity的机制。Intent由操作描述和操作数据构成,而且Intent可以有显式(explicit)和隐式(implicit)两种,显式即是通过类名来启动另外一个Activity,而隐式则是先指定需要的操作类型或者操作数据类型,然后Android Runtime会通过一个叫Intent Resolution的进程来找到最匹配的Activity并启动它。
1.3 Broadcast Intent
Broadcast Intent是一种系统层面的intent,他会将intent发送给所有注册某变化的Broadcast Receiver。比如手机连接充电器开始充电后,系统会发送intent到所有对该事件“感兴趣”的Broadcast receiver。
Broadcast intent可以是异步发送的,也就是可以将intent同时或将近同时地发给所有的Broadcast Receivers,也可以是有序的,也就是intent可以在同一时间发送给一个Broadcast Receiver,然后决定放弃继续发送还是继续发送给下一个。
1.4 Broadcast Receiver
从名字上可以看出,Broadcast Receiver即是与Broadcast intent对应的一种机制,它可以接收后者发送的intent,但是Broadcast Receiver必须通过注册并且配置intent Filter项指定对哪种intent感兴趣。当一个应用收到一个感兴趣的intent后,Android runtime会调用receiver 应用不管该应用是否在运行,该应用要在5s内完成要求的工作并返回。
1.5 Service
Android service是一个在后台进行的进程,没有用户界面,它可以通过Activity,Broadcast receiver 或其它service启动和管理。Service适合于完成一些任务,但不需要用户界面的场合,比如音频服务等,如果service一定要和用户交互,可以通过notification,toast和intent。在系统中,service比其它进程的优先级都高,也就是在释放资源时,service只会在最后被释放,在资源够的时候又会自动启动,而且一个service也可以通过调用startForeground()使应用在前端运行减少被终止的风险,这一般是对于那些会严重影响用户体验的service。
1.6 Content Provider
当应用需要共享一些数据时就需要Content Provider,是一种应用间共享数据的机制,任何应用在实现Content Provider之后就可以让其他应用通过Universal Resource Identifier (URI) 访问它的基础数据,包括查询,增加,删除,更新。其中数据是以文件或SQLite数据库的形式共享的。比如通讯录就是典型的实现了Content Provider的应用。
1.7 Manifest
Application Manifest如同胶水一样,将一个应用的所有元素组合起来,在Manifest.xml里面有关于activity,service,broadcast receiver,content provider和权限的所有配置。
1.8 Resource
顾名思义,资源也就是安卓应用中的字符串,图像,字体,颜色,还有配置用户界面的xml文件。
1.9 Context
当一个应用编译好后,就会生成一个名字是R的类,该类包含了应用资源的引用。前面的manifest文件和这些资源组合起来就成了Application Context,在安卓中用Context类表示,可以通过它提供的方法访问应用的资源,也可以通过它提供的方法或许或者修改应用的环境参数。
2 Activity 生命周期
在介绍Activity 生命周期之前先介绍一下Android的进程状态。因为Android的每个应用在操作系统中都是一个独立的进程,而每个应用又是由Android组件基本构成的,在android系统中,一个进程的当前状态是由进程对应的应用中的活动组件的最高优先级状态决定的。如下图所示,一个进程状态有以下五种。
- foreground process: 该类进程拥有最高优先级,在任何时候不可能有超过2个的前台进程,而且该类进程往往是属于被系统最后终止的进程,满足以下条件的进程是前台进程:
- 拥有一个用户正在交互的activity;
- 拥有一个service,而这个service正在连着一个与用户交互的activity;
- 拥有一个调用了startforeground()的服务;
- 拥有一个正在执行onCreate(),onResume(),onStart()回调的服务
- 拥有一个正在执行onReceive()方法的Broadcast Receiver
- visible Process:进程包含一个用户可见但不是正在交互的activity属于visible process;
- service Process: 拥有一个正在运行的service的进程;
- Background Process: 没有包含用户可见的Activity,而且没有包含正在运行service的进程。处于这种状态的进程很容易在内存不够的时候被系统杀掉。Android有一个后台进程列表,会定时清除里面的进程;
- Empty Process: 这种进程不包含任何应用,类似于作为新启动应用的“宿主”,这样可以加快应用的启动速度。很明显,这种进程在资源不够的时候是最先被杀掉的。
现在我们可以发现,进程的状态很大程度上是由Activity的状态决定的,而Activity的状态可以从该Activity在Activity Stack中的位置判断出来。
## 2.1 Activity Stack
runtime system 会为android设备上运行的每个应用维护一个activity stack,如下图所示:
当一个应用运行的时候,第一个运行的activity会被放到stack栈顶,当第二个activity运行的时候,前面的activity会被压栈,当用户按back或者第二个activity执行的任务完成exit的时候,会被弹栈移除,这时第一个activity会再次处于栈顶,处于栈顶的activity处于running状态。当资源不够的时候,runtime会从栈底开始杀死activity。
2.1 Activity States
在一个activity执行的时候会处于一下几种状态
- Active/Running :activity处于activity stack的栈顶,用户可见并且正在与用户交互
- Paused:该activity用户可见,但是没有与用户交互,但在内存中保存,移除栈顶activity就可以恢复成running状态
- Stopped: 该activity用户不可见,但信息在内存中保存,在内存不够时容易被清掉
- Killed: 该activity已经被runtime system终止掉,而且也不activity stack中。
下图可以更加清楚地看到activity的状态。
- onCreate: 这个方法在activity第一次被创建的时候调用,很多初始化操作都是在这个函数中完成的。这个函数有一个Bundle参数,可以用来恢复动态状态信息
- onRestart: 当activity在被runtime system停止后恢复运行时调用
- onStart: 在调用onCreate或者onRestart之后调用的函数,调用该函数意味着这个activity将要变得用户可见
- onResume: 表示该activity位于activity stack的栈顶,正在与用户交互
- onPause: 表示有其它activity位于activity stack栈顶,可以根据后面需要与用户交互还是变得用户不可见调用onResume或者onStop
- onStop: 调用该方法意味着该activity变得用户不可见
- onDestory: 表示这个activity要被销毁,可能是由于该activity已经完成需要的任务主动要求销毁,也可能是由于内存不足被runtime system销毁
- onRestoreInstanceState(Bundle saveInstanceSate):该方法在onStart之后调用,用于恢复之前保存的信息
- onSaveInstanceState(Bundle outState): 在调用onDestory之前被调用,用户保存动态的信息。
2.2 Activity lifetime
Activity在执行onCreate到onDestory之间的状态可以分为entire,visible,foreground,如下图所示:
- Entire Lifetime - 从onCreate到onDestory之间的阶段
- Visible Lifetime - 可以看见activity的阶段,从Onstart到onStop
- Foreground Lifetime - 表示正在与用户交互的阶段,从onResume到onPause
3 总结
本文介绍了一下android的基本组件和activity的生命周期,通过了解activity的各个阶段,我们就可以在增加方法时有针对性,知道哪个方法该放到哪个阶段,也便于在合适的地方增加log调试手机,接下来就是涉及到android的具体开发内容了。