Android开发文档之App组件基本原理

细读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共享数据。
  1. 2个app共享同一个Linux user ID,在这种情况下,可以互相访问文件。为了保存系统资源,有着同一个Linux user ID的app安排运行在同样的Linux 进程,共享同样的VM(这些app必须是同样的签名)
  2. app可以请求开通权限访问contacts, SMS messages,SD card,camera, Bluetooth。权限必须在app初始化的时候被用户授予。
6.组件:Android有4大组件,每个组件都有自己的生命周期。
  1. Activities:有界面,能与用户交互。比如一个email app,就包括了展示邮件,写邮件,发送邮件等activity.这些activity都是独立的.基于此,只要email app 允许,另外一个app就可以开启email的任何一个activity。
  2. Services:运行在后台,或是耗时的操作或是远程通信的组件。不提供图形界面。比如用户在使用另外一个app,后台也可以执行播放音乐,或是从网络获取数据而不影响用户与actvity的交互。其他组件如Activity可以开启和运行service 。如果要和Service交互的话,需要绑定.
  3. Content providers:管理一组共享的应用程序数据。你可以用系统中的文件(内存),SQLite database,web,设备上其他存储地方。通过Content provider,其他app可以查询或是修改数据。provider 也可以读写你app上的私有数据,并且不共享出去。
  4. 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。

15.配置文件:四大组件必须在此申明。除此之外,权限、最低API Level 、app需要运行软件/硬件特征、app关联的API 库也是在此文件中。没有在此文件中申明的activities, services, content providers 对系统来说就是不可见的,并不会被执行。broadcast 既可以在此注册,也可以通过调用registerReceiver()来注册。
16. intents 真正的强大之处在于intent的actions。有了这个,你只需要简单描述你要执行的action 类型(需要的话,也可以带上你要执行的action的data ),系统就会查找能够执行该action 的组件并启动它。如果有多个组件能够执行该action的话,用户就可以从中选择一个。
17系统是通过intent 中的intent filters 来确定哪些组件能够响应intent 。所以当申明一个组件的时候,你也可以申明intent filters来表明这个组件具有的功能。格式是在组件中增加 。比如一个email app, 在写邮件的activity上申明intent filter,响应“send”意图。在你的app上的某一activity中创建一个intent ,带上send action , 系统就会匹配到email app 的”send” activity,当你startActivity() 就会激活intent。
18. 当设计和开发app的时候,应该注意设备的一些重要参数:(1) 屏幕尺寸和密度。为了简化不同类型的屏幕配置,Android 系统将他们概括成组,使得带有目的性去匹配。(2)屏幕有4种类型: small, normal, large, extra large.密度有: low density, medium density, high density, extra high density.(3) 默认,你的app是可以兼容任何的屏幕尺寸和密度的,因为Android 系统在你的UI 布局和image 资源上做了适当的调整。(4)但是,你应该提供特定的布局给特定的屏幕尺寸,特定的图片给特定的屏幕密度。可以通过在manifest 文件中配置。
19.app 资源:一个app包括了code,code中要求的的资源,比如图片,audio ,或是其他的可视化资源。比如,你可以定义animations, menus, styles, colors,layout等xml文件。通过资源,可以更加容易更新app界面效果,而不需要更改代码。对于Android 项目中的资源,通过ID来管理。当然还有一些其他的资源,比如不同国家语言的适配。
20.以上是组件大致的介绍,只将重要的部分展示出来。详细理解组件的话,需要细读文档中单独的介绍。

你可能感兴趣的:(Android开发,开发文档,四大组件)