细读Google提供的开发文档,可以帮助我们更好的理解Android和开发。文档中组件,资源,媒体等都做了具体说明,所以当我们读懂了之后,会发现,以前在做开发的时候,按照习惯,只知道要这样做。但是读懂了原理后,会理解为什么要这样做了。
由于文档全英文的,一个字一个字去翻译的话,没有时间,同时也没有必要。所以只将其中认为重要的知识点,或是被自己忽略的知识点翻译出来,记录保存,以便加深理解和学习。
先看组件的基本原理:
1.apk :Android SDK 工具把代码,一些数据和资源文件打包成一个Android 包,这个包就是一个带后缀.apk文件。
2.每一个进程都是在自己的VM下运行,因此每个app是独立于其他app的。
3.默认的,每个app都是在自己的Linux进程下运行,当这个app中任何一个组件被执行的时候,Android就会开启一个进程,关闭那些不再需要的或是要给其他app让内存的进程。
4.Android系统是按照最小特权(least privilege)运行的。即每个app都只对指点的组件有权访问。没有允许,是不能访问系统任何一部分的。
5.然而,一个app有以下方法可以访问系统、和其他app共享数据。
- 2个app共享同一个Linux user ID,在这种情况下,可以互相访问文件。为了保存系统资源,有着同一个Linux user ID的app安排运行在同样的Linux 进程,共享同样的VM(这些app必须是同样的签名)
- app可以请求开通权限访问contacts, SMS messages,SD card,camera, Bluetooth。权限必须在app初始化的时候被用户授予。
6.组件:Android有4大组件,每个组件都有自己的生命周期。
- Activities:有界面,能与用户交互。比如一个email app,就包括了展示邮件,写邮件,发送邮件等activity.这些activity都是独立的.基于此,只要email app 允许,另外一个app就可以开启email的任何一个activity。
- Services:运行在后台,或是耗时的操作或是远程通信的组件。不提供图形界面。比如用户在使用另外一个app,后台也可以执行播放音乐,或是从网络获取数据而不影响用户与actvity的交互。其他组件如Activity可以开启和运行service 。如果要和Service交互的话,需要绑定.
- Content providers:管理一组共享的应用程序数据。你可以用系统中的文件(内存),SQLite database,web,设备上其他存储地方。通过Content provider,其他app可以查询或是修改数据。provider 也可以读写你app上的私有数据,并且不共享出去。
- Broadcast receivers:响应系统范围的广播通知,如:屏幕关闭,电池偏低,抓取照片。不提供与用户交互的界面,但是可以通过创建状态通知栏告知用户什么时候这个Broadcast 被开启了。receiver仅仅是进入其他组件的一个通道,做的是最少的工作,比如基于一个事件,初始化服务来做。
7.Android系统设计的独到之处是:任何一个app都可以开启其他app上的组件。比如你要拍照,如果你设别上其他app有这个功能的话,你就可以 调用。
8.系统开启一个组件,就开启了这个app的进程,比如你要拍照,你就开启了camera app, 这个拍照的activity就在属于camera app 的进程中运行,而不是在你的app进程中。因此,不像其他系统的app, android app 并不是只有一个单一入口。
9.在系统中,每个app都是运行在不同的进程中,并都带有访问权限限制其他app的访问,所以你的app不能直接激活其他app的组件。但是Android 系统却可以。你只需要向系统传递一个消息,指定你要激活特定组件的意图,系统就能为你激活该组件。
10.激活组件: 三大组件:activities, services, broadcast receivers都是通过异步信息即intent 来激活的。Intent 定义了一个消息,用来激活特定的组件或是特定类型的组件(因为意图可以是隐式或是非隐式)
11.对于activities and services,intent定义了要做的action 或是对数据进行操作的URI.例如一个Intent 可能包含请求一个activity 来展示图片或是打开网页。在某种情况下,你可以开启一个activity 来接收result,在这种情况下,这个activity 会返回result 到Intent 中。
12.对于broadcast receivers, intent仅仅是定义需要被广播的通知(例如,告知设备电池偏低的broadcast 就是只包含一个已知的字符串来表明“battery is low“)
13.其他组件类型, content provider, 不是被intents激活的,相反它是被从ContentResolver发过来的请求激活的。resolver 直接处理所有的content provider事务。
14.提供以下方法来激活组件:
开启activity ==>传递Intent 来startActivity() /startActivityForResult()
开启service==>传递Intent 来startService()。或是可以将意图绑定到service (bindService()).
开启broadcast ==>传递Intent到方法中,比如sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcast().
通过调用ContentResolver的query方法,来查询content provider。