android开发过程中涉及到的“概念”摘要

来源:互联网 发布:怀化学院教育网络系统 编辑:程序博客网 时间:2024/05/21 10:40


1、一个apk文件就是一个android应用;
2、Android操作系统是多用户系统,运行其中的每个应用都是不同的用户;
3、Android系统为每个应用(用户)分配一个用户ID(该用户ID只有操作
系统使用,应用程序是知道其用户ID)。系统为应用中的所有文件分配权限
(permissions),只有用户该用户ID的程序才能够访问这些文件;
4、操作系统启动的每个进程都有自己的VM,因此所有应用程序的代码执行是
相互独立的;
5、非特殊情况下,每个进程都运行在自己的Linux进程环境中。任何时候只要
应用中的任何部分组建需要运行,andorid系统就启动该Linux进程,当不再
执行应用的任何代码或需要回收内存用于其它应用时,操作系统会关闭该进程。

因此、Android系统实现了最小特权原则(principle of least privilege);
也就是说运行在Android系统上的所有应用,在没有得到授权的情况下,都只
能访问属于自己的资源,不能随意访问其它应用或系统的资源。

6、可将Activity,Service和content provider可以绑定到service,但是不能
将broadcast receiver绑定到service.

7、Content provider负责管理一组结构化的数据;它封装数据并提供定义数据
安全策略的机制。Content provider提供一组标准的接口,让一个进程中的代码
能够访问另一个进程中的数据。
让需要访问一个content provider中的数据时,应用程序使用ContentResolver
对象作为客户端与provider进行通信。Provider对象接收来自客户端的数据访问
请求、指向请求制定的操作、并且返回操作结果。

8、一个content URI是用来标识provider中数据的。一个content URI由“标识provider
整体的符号名称(authority)”和“标识一张表结构名称(path)”组成;比如:
content://user_dictionary/words
provider的authority:user_dictionary
table的path:words
scheme:content://

9、一个应用可以在AndroidManifest.xml文件中,使用<uses-permission>指出该
应用运行所需要的授权(permission);这些授权都是在程序安装过程中,而不是在
运行过程中被授予。在安装过程中,如果用户同意了这些授权,则Android Package
Manager继续完成apk包的安装,否则中断安装。

10、当一个应用没有权限访问某个provider时(安装时没有使用<uses-permission>
为该应用授权),其可以使用发送intent的方式间接的获得对provider中特定URI的
零时访问权限,注意这里只是获得对provider中某个特定URI的零时访问权限,而不
获得对整个provider的访问权限。具体操作:给具有访问该provider权限的应用发
intent;具有权限的应用将为其返回一个包含零时访问授权的URI(通过intent返回)。

11、Contact class位于应用和provider之间,定义了很多可以帮助应用与provider
进行协同工作的常量,比如:content URIs、column names、intent actions以及
其它的content provider的特性。Contact class不会自动被包含在一个provider中,
provider的开发者必须定义其contact class并使得该类对其它开发者可见。该类在
provider与其它应用程序之间建立一种签约(contract),保证当URIs、column名字等
发送改变时,provider也能被正确的访问。

12、Authority作为provider在andorid系统内部的名称。为了避免providers之间名称
的冲突,使用网络域名反序的格式来为provider的Authority命名。格式如下:
com.example.<appname>.provider

13、provider六大基本函数
query()
insert()
update() 
delete() 
getType() 
onCreate() 
其它函数是由provider客户端调用,只有onCreate()是由android系统调用。onCreate()
负责初始化provider。注意:当ContentResolver开始访问provider时,andorid系统才
创建该provider。

14、用于table的MIME类型
android商家自定义的MIME格式:
Type部分:vnd
Subtype部分:
如果单row模式的URI:android.cursor.item/ 
如果多行row模式URI:android.cursor.dir/
provider相关部分:vnd.<name>.<type> 
            <name>值必须全局唯一;<type>值对应与URI pattern必须是唯一值。
例如一个provider的authority为com.example.app.provider:
vnd.android.cursor.dir/vnd.com.example.provider.table1
vnd.android.cursor.item/vnd.com.example.provider.table1
15、尽管底层数据是provider私有的,但是在不设置访问权限时,仍然可以被所有其它
应用程序读取和写入。

16、Android应用中的三大核心组件(activity、service和broadcast receiver)
都是通过intent消息被激活地。在运行过程中,应用通过intent消息在各个组件之
间进行绑定。


17、Intent对象本身是一种被动(passive)的数据结构;该对象中存有诸如将执行
操作的抽象描述,或者在消息广播情况下,intent中包含已发生事件的描述。对于
Android中的三大核心组件,系统为它们各自提供了三种不同的消息分发机制,三个
核心组件的消息之间不会重叠。

18、Action:一个字符串,标识将要被操作的名称;
开发者可以定义自己的action strings,用于启动本应用中的components;这些action
字符串需要添加应用程序包作为前缀。例如:
com.example.project.SHOW_COLOR

Action绝大部分意义在于,它暗示了剩余的intent信息如何被组织(structured)——主
要指的是data和extra区域。

19、Data:被访问数据的URI和该数据的MIME类型。不同的action与各自特定数据
类型对应。在查找能处理该intent的应用components时,MIME类型很重要,因为不能让只有
处理image数据的components来处理MIME类型为audio file的intent。

20、Category:一个字符串,其进一步给出附加信息,用于进一步明确处理该intent的
components类型。

21、Extras:key-value值对,用于向接收该intent的components传递附加信息;如action
与特定data数据一一对应一样,有些action也需要一一对应的Extras信息。例如:
ACTION_HEADSET_PLUG 有一个与之对应的表示状态的extra信息,标识headset的当前状态为
plugged or unplugged。

22、Flags:Intent使用它来指导android系统如何启用一个activity(比如:该activity应该
归属于那个task),如何处理一个已经启动的activity(比如:该activity是否需要在
“最近活动的activities列表”中显示)。

23、在android系统进行intent对象matching过程中主要使用intent中的如下三个域:
action 
data (both URI and data type) 
category
另外extra和flag两个域,在matching过程中不起作用。

24、任何一个<data>元素都可以指定一个URI和一个data类型。对应一个URI有如下几部分组成:
       scheme, host, port, and path;组织格式为:scheme://host:port/path;host和port一起
组成了该URI的authority。URI的每部分都是可选的,但是它们之间又是相互依赖的,比如说:
如果要使得一个authority有效,则scheme必须被指定;如果使一个path有效,则scheme和
authority都必须指定。
<intent-filter . . . >
<data android:mimeType="video/mpeg" android:scheme="http" . . . /> 
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
. . .
</intent-filter>

25、Intent通过filter检测的规则:
    将intent中的URI与filters中规定的URI进程比对时,比对的只是由filters真正给出的部分,
没有给出的部分对比对结果过程不起作用;比如:如果filter中只指定了scheme,只要
intent中的URI有一样的scheme,则该intent就通过filter的检测。
a、如果一个intent对象没有URI和data type信息,则只能通过即没有指定URI也没有指定
       data type信息的filters检测。
b、如果一个intent对象只包含URI信息,没有包含data type(并且data type也没有隐含在
   scheme中),则该intent只能通过同样没有指定data type,只指定URI的filters检测。
c、如果一个intent对象只包含data type信息,不包含URI信息,则该intent只通过指定
  了data type信息并且没有指定URI filter的检测。
d、如果一个intent即包含URI也包含data type(或者通过URI隐含给出data type),如果
  Filters中的type与消息中的一致,则通过data类型的检测;如果Filters中的URI
  与消息中请求的URI匹配,则该intent通过Filter的URI检测;或者如果intent中给出的
  content:或file:并且filter在<data>中只列出数据类型,则这些系统默认该component
  已经支持ontent:和file:schemes。
  
  

26、DEFAULT category是所有filters所必须指定的,但是有个两个例外情况:
         a、包含MAIN action和LAUNCHER category的filters,不需要包含DEFAULT;
b、对于显式intents,Intent filters不起任何过滤作用。
 
27、DEFAULT必须在filters指定,是因为Context.startActivity() 和 
       Activity.startActivityForResult()方法认为所有发出去的intent都包含DEFAULT category。
有两个例外:
a、Intents that explicitly name the target activity
       b、Intents consisting of the MAIN action and LAUNCHER category

28、默认情况下,同一个用于的所有components都运行在同一个进程中。但是在需要时,可以在文件
manifest中,使用各个组件的android:process属性,将各个components分配到不同的进程中。

29、当android系统启动一个应用时,系统为该应用创建一个执行线程,即主线程。该线程非常重要,
其掌控着事件的分发过程;同时应用程序使用该线程与来自android UI tookit的components进行交互,
因此,主线程也称为UI线程。此外android UI tookit是非thread-safe的。因此不能在一worker线程中
操作UI。Android的单线程模式有两条规则:
a、Do not block the UI thread 
b、Do not access the Android UI toolkit from outside the UI thread 

30、Android系统安全框架的核心理念是,默认情况下,任何一个应用的任何操作都不能对另为一个应用
程序、操作系统或者用户有任何的负面影响。Android系统将各个applications都限制在各自的sandbox
中运行,这些应用必须显式的声明它们所需要共享的资源和数据;它们通过声明permissions,来获得自身
sandbox不能提供的额外功能。应用通过在manifest文件中静态的声明所需要的permissions,android系统
在应用安装时向用户给出提示。

31、在安装过程中,android系统为每个安装包分配一个唯一的Linux user ID。这些ID一旦安装后就保持
不变。但是不同的安装过程或不同的设备上,同一个应用包可能被分配不同的Linux user ID。

32、一个apk需要使用其它应用授权时使用<uses-permission> tags,去申请。
       一个apk提供授权给其它应用使用时使用<permission> tags,进行声明;
<permission>用于控制谁可以启动本应用中的components。
而一个android:permission attribute 则限制到某个特定的components,功能与<permission>同,只是
声明的范围进一步缩小到components而不是整个application。
33、@[package:]type:name  资源值来自于资源库
        ?[package:]type:name  资源值来自于主题库
如果资源来自应用程序字节的apk,则这里的package名称可以被删除;type是资料的类型标识——比如:
“string”或“drawable”
<activity android:icon="@drawable/smallPic" . . . >
原创粉丝点击