android开发总结

时间:2024.3.15

Android开发简介

Android应用程序的五大基本组件 Activity —— 应用表示层( 基类 Activity ) 一个活动表示一个可视化的用户界面,关注一个用户从事的事件。例如,一个活动可能表示一个用户可选择的菜单项列表,或者可能显示照片连同它的标题。一个文本短信应用程序可能有一个活动,显示联系人的名单发送信息;第二个活动,写信息给选定的联系人;其他活动,重新查看旧信息或更改设置。虽然他们一起工作形成一个整体的用户界面,但是每个活动是独立于其他活动的。每一个都是作为Activity基类的一个子类的实现。

应用程序中的每个屏幕都是通过继承和扩展基类 Activity 来实现的。

同一应用中的每个 Activity 是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个 Activity (默认窗口),而后可以根据需要从这个 Activity 启动另一个新的 Activity 。 Activity 利用 View 来实现应用中的 GUI (用户直接通过 GUI 和应用程序做交互)。 Activity 窗口内的可见内容通过基类 View 提供。使用 Activity.setContentView() 方法设置当前 Activity 中的 View 对象。

每个 View 对象控制着窗口内的一个矩形空间;

View 是一种层次化结构, Parent View 中的布局属性会被子 View 继承; 位于 View 层次关系最底层的子 View 对象所代表的矩形空间就是跟用户进行交互的地方

android开发总结

Activity 状态回调:

onCreate

onStart

onRestart

onResume

onPause

onStop

onDestroy

Service

没有可见的用户界面,但能够长时间运行于后台( 基类 Service ) 一个服务没有一个可视化用户界面,而是在后台无期限地运行。例如一个服务可能是播放背景音乐而用户做其他一些事情,或者它可能从网络扩取数据,或计算一些东西并提供结果给需要的活动(activities)。每个服务都继承自Service基类。

运行于应用程序进程的主线程中,因此 Service 不会阻塞其他组件和用户界面。 Service 是不能自己启动的,必须通过 Context 对象(如一个 Activity )调用

startService 或 bindService 方法来启动(用这两种方法启动的 Service 的生命周期不同)。

1. 调用 startService 方法

a) 若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法,然后再调用 onStart 方法。

b) 若 Service 已经启动,则会直接调用 onStart 方法 c) 该方法启动的 Service ,可以通过 Context 对象调用 stopService 来关闭,也可以通过 Service 自身调用 stopSelf() 或 stopSelfResult() 来关闭,关闭之前调用 onDestory 方法。 2. 调用 bindService 方法,使当前 Context 对象通过一个 ServiceConnection 的对象绑定到所指定的 Service

a) 若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法初始化启动,然后调用 Service 的 onBind 方法初始化绑定。

b) 如果绑定 Service 的 Context 对象被销毁时,被绑定的 Service 也会调用 onUnbind 和 onDestroy 方法停止运行

c) 注意: BroadcastReceiver 是不能绑定服务的。

d) 一个绑定 Service 的 Context 对象还可以通过 unbindService() 来取消对服务的绑定。

e) 取消时, Service 会调用 unbind 方法,若 Service 是通过 bindService 来启动的,还会调用 onDestroy 方法来停止服务。

Service 状态回调:

onCreate

onStart

onBind

onRebind

onUnbind

onDestroy

Broadcast Receiver

用户接收广播通知的组件( 基类 BroadcastReceiver ) 一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据。一个应用程序可以有任意数量的广播接收者去反应任何它认为重要的公告。所有的接受者继承自BroadcastReceiver基类。 Android 中的广播要么来自于系统,要么来自普通应用程序。

很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。

来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。

为了响应不同的事件通知,应用程序可以注册不同的 Broadcast Receiver 。所有的 Broadcast Receiver 都继承自基类 BroadcastReceiver 。

BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后,

BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger 提醒用户。 BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接收并响应的一类组件。

发送 Broadcast 信息 1. 把要发送的信息和用于过滤得信息 ( 如 Action 、 Category) 装入一个 Intent 对象

2. 调用 Context. sendBroadcast() 、 sendOrderBroadcast() 、

sendStickyBroadcast() 方法,广播该 Intent 对象

3. 使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法;

4. 而 sendOrderBroadcast() 发出去的 Intent ,会根据 BroadcastReceiver 注册时 IntentFilter 设置的优先级的顺序来执行,相同优先级的 BroadcastReceiver 则是随机执行

5. sendStickyBroadcast() 方法主要的不同是, Intent 在发送后一直存在,并且在以后调用 registerReceiver() 注册相匹配的 Intent 时会把这个 Intent 直接返回。 6. 若在使用 sendBroadcast() 方法时指定了接收的权限,这只有在

AndroidManifest.xml 中用 <uses-permission> 标签声明了拥有此权限的 BroadcastReceiver 才会有可能接收到发送来 Broadcast 。

7. 若在注册 BroadcastReciever 时,指定了可接收的 Broadcast 的权限,则只有在包内的 AndroidManifest.xml 中用 <uses-permission> 标签声明了,拥有此权限的 Context 对象所发送的 Broadcast 才有可能被这个 BroadcastReceiver 所接收。

接收 Broadcast 消息

1. 继承 BroadcastReceiver 类,并实现 onReceive 方法 2. 注册 Broadcast Receiver (有 2 种方法:一种方法是,静态地在 AndroidManifest.xml 中用 <receiver> 标签声明,并在标签内用 <intent-filter> 标签设置过滤器; 另一种方法,动态地在代码中先定义并设置好一个 IntentFilter 对象,然后再需要注册的地方调用 Context.registerReceiver() 方法) (取消注册时,调用

Context.unregisterReceiver() 方法)

Content Provider

为解决应用程序间数据通信、共享的问题( 基类 ContentProvider )

内容提供者(content provider)使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。内容提供者继承自ContentProvider 基类并实现了一个标准的方法集,使得其他应用程序可以检索和存储数据。然而,应用程序并不直接调用这些方法。相反,替代的是它们使用一个ContentResolver对象并调用它的方法。ContentResolver能与任何内容提供者通信,它与提供者合作来管理参与进来的进程间的通信。

在 Android 中,每个应用程序都是用自己的用户 ID 并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。

Content Provider 可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是 Android 文件系统、 SQLite 数据库或者其他合理的方式。

当数据需要在应用程序间共享时,我们就可以利用 ContentProvider 为数据定义一个 URI 。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个 ContentResolver, 然后传入响应的 URI 就可以了。 Content Provider 继承自基类 ContentProvider ,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序并不是直接调用这组方法,而是通过调用 ContentResolver 对象的方法来完成。 ContentResolver 对象可以与任意 ContentProvider 通信。

要为当前应用程序的私有数据定义 URI ,就需要专门定义一个继承自

ContentProvider 的类,然后根据不同的操作调用的方法去实现这些方法的功能。 ContentResolver 类为应用程序提供了接入 Content 机制的方法。要构造一个

ContentResolver 对象可以为构造方法 ContentResolver(Context context) 传入一个 Context 对象,也可以直接通过 Context 对象调用 getContentResolver() 方法获得 —— 有的

ContentResolver 对象后,就可以通过调用其 query() 、 insert() 、 update() 等方法来对数据进行操作了。

一旦需要以上 4 种 Android 应用程序基本组件完成请求, Android 会首先确认该组件所在进程是否运行,如果没有运行, Android 将先启动进程,同时确认被请求组件的实例是否存在,否则将创建一个新的组件实例。

Intent —— 连接组件的纽带 以上 4 种基本组件中,除了 Content Provider 是通过 Content Resolver 激活外,其他 3 种组件 Activity 、 Service 和 Broadcast Receiver 都是由 Intent 异步消息激活的。 Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此, Intent 是包含具体请求信息的对象。

针对不同的组件, Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递 Intent 的不同方式。 Intent 是一种运行时绑定( runtime binding )机制,它能够在程序运行的过程中连接两个不同的组件。通过 Intent ,你的程序可以向 Android 表到某种请求或者意愿, Android 会根据意愿的内容选择适当的组件来处理请求。

l 激活一个新的 Activity ,或者让一个现有的 Activity 执行一个新的操作,可以通过调用如下两种方法 ( 这两汇总方法需要传入的 Intent 参数称为 Activity Action Intent) :

1. Context.startActivity()

2. Activity.startActivityForResult()

l 启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:

1. Context.startService()

2. Context.bindService() l 发送广播 Intent( 所有已注册的拥有与之相匹配 IntenFilter 的 BroadcastReceiv 就会被激活 ) ,可以调用如下三种方法:

1. Context.sendBroadcast()

2. Context.sendOrderBroadcast()

3. Context.sendStickBroadcast() Intent 一旦发出, Android 都会准确找到相匹配的一个或多个 Activity 、 Service 或

BroadcastReceiver 作响应。所以,不同类型的 Intent 消息不会出现重叠, BroadcastIntent 消息只会发送给 BroadcastReceiver ,而绝不可能发送给 Activity 或 Server 。有 startActivity() 传递的消息也只可能发送给 Activity ,由 startService() 传递的 Intent 只可能发送给 Service 。

开发过程中注意事项:

开发过程不懂的就查找API,会有很大的帮助

? 每创建一个Activity都要在AndroidMainfest.xml中声明,否者报错。

? ? 开发网络程序要在AndroidMainfest.xml中设置联网权限,在应用启动时需初始化网络接入方式。 开发网络程序,因为要经常联网,出现网络异常是正常现象,所以要捕获各种网络异

常,写代码的也要注意异常的捕获,直接跑出异常,直接会造成应用程序的异常,所以要考虑全面。

? 对知识点的理解,比如:广播,service生命周期,Activity生命周期,数据存储(短信,

联系人的存储),SQLITE的理解,在这里不一一详解了,因为这里的每一部分都需要大篇幅介绍,网络上有很多不错的资源,看API也是个不错的选择。

?

?

?

?

附: 对异步线程的处理,android有一套异步线程的方式:Handler类,AsyncTask类,各自的用法查看详细的资料。异步可以用来回调,刷新UI。 在编写后台耗时的程序时,考虑用service来操作。 在编写定时任务时,尽量不要使用循环线程的初始方式,这样太过耗资源,可以调用系统的闹钟定时任务,通过指定时间,来回调需要处理事件。 需要保存少量的应用数据时,可以使用SharedPreferences来保存。

AndroidManifest.xml详解 AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services, 等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

二、AndroidManifest.xml结构

<?xmlversion="1.0"encoding="utf-8"?> <manifest>

<application>

<activity>

<intent-filter>

<action/>

<category/>

</intent-filter>

</activity>

<activity-alias>

<intent-filter></intent-filter>

<meta-data/>

</activity-alias>

<service>

<intent-filter></intent-filter>

<meta-data/>

</service>

<receiver>

<intent-filter></intent-filter>

<meta-data/>

</receiver>

<provider>

<grant-uri-permission/>

<meta-data/>

</provider>

<uses-library/>

</application>

<uses-permission/>

<permission/>

<permission-tree/>

<permission-group/>

<instrumentation/>

<uses-sdk/>

<uses-configuration/>

<uses-feature/>

<supports-screens/> </manifest>

三、各个节点的详细介绍

上面就是整个am(androidManifest).xml的结构,下面以外向内开始阐述~~

1、第一层(<Manifest>):(属性)

android开发总结

package="com.woody.test" android:sharedUserId="string" android:sharedUserLabel="string resource" android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] > </manifest>

A、xmlns:android

定义android命名空间,一般为Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

B、package

指定本应用内java主程序包的包名,它也是一个应用进程的默认名称

C、sharedUserId 表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。详见:http://wallage./blog/static/173xxxxxxxxxxxx0539408/

D、sharedUserLabel

一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义

E、versionCode

是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。

F、versionName

这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。

G、installLocation

安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal 选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)

选择auto,系统将会根据存储空间自己去适应

选择internalOnly是指必须安装到内部才能运行

(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)

2、第二层(<Application>):属性 一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)

<application android:allowClearUserData=["true" | "false"]

android:allowTaskReparenting=["true" | "false"]

android:backupAgent="string"

android:debuggable=["true" | "false"]

android:description="string resource"

android:enabled=["true" | "false"]

android:hasCode=["true" | "false"]

android:icon="drawable resource"

android:killAfterRestore=["true" | "false"]

android:label="string resource"

android:manageSpaceActivity="string"

android:name="string"

android:permission="string"

android:persistent=["true" | "false"]

android:process="string"

android:restoreAnyVersion=["true" | "false"]

android:taskAffinity="string"

android:theme="resource or theme" > </application>

A、android:allowClearUserData('true' or 'false')

用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然

B、android:allowTaskReparenting('true' or 'false')

是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务

C、android:backupAgent 这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)

D、android:debuggable

这个从字面上就可以看出是什么作用的,当设置为true时,表明该APP在手机上可以被调试。默认为false,在false的情况下调试该APP,就会报以下错误:

Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.

Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.

E、android:description/android:label 此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可

以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生

F、android:enabled Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。

G、android:hasCode('true' or 'false')

表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码

一个应用程序自身不会含有任何的代码,除非内置组件类,比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象 (在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)

H、android:icon

这个很简单,就是声明整个APP的图标,图片一般都放在drawable文件夹下

I、android:killAfterRestore

J、android:manageSpaceActivity

K、android:name

为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。 若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name="androidMain",但此类是在package下面的子包的话,就必须声明为全路径或android:name="package名称.子包名成.androidMain"

L、android:permission

设置许可名,这个属性若在<application>上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的

M、android:presistent

该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。

N、android:process

应用程序运行的进程名,它的默认值为<manifest>元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候 O、android:restoreAnyVersion

同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false

P、android:taskAffinity

拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是<manifest>元素中设定的package名

Q、android:theme

是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。

3、第三层(<Activity>):属性 <activity android:allowTaskReparenting=["true" | "false"]

android:alwaysRetainTaskState=["true" | "false"]

android:clearTaskOnLaunch=["true" | "false"]

android:configChanges=["mcc", "mnc", "locale",

"touchscreen", "keyboard", "keyboardHidden",

"navigation", "orientation", "screenLayout",

"fontScale", "uiMode"]

android:enabled=["true" | "false"]

android:excludeFromRecents=["true" | "false"]

android:exported=["true" | "false"]

android:finishOnTaskLaunch=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:launchMode=["multiple" | "singleTop" |

"singleTask" | "singleInstance"]

android:multiprocess=["true" | "false"]

android:name="string"

android:noHistory=["true" | "false"]

android:permission="string"

android:process="string"

android:screenOrientation=["unspecified" | "user" | "behind" |

"landscape" | "portrait" |

"sensor" | "nosensor"]

android:stateNotNeeded=["true" | "false"]

android:taskAffinity="string"

android:theme="resource or theme"

android:windowSoftInputMode=["stateUnspecified",

"stateUnchanged", "stateHidden",

"stateAlwaysHidden", "stateVisible",

"stateAlwaysVisible", "adjustUnspecified",

"adjustResize", "adjustPan"] >

</activity>

(注:有些在application中重复的就不多阐述了)

1、android:alwaysRetainTaskState

是否保留状态不变, 比如切换回home, 再从新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true

2、android:clearTaskOnLaunch

比如 P 是 activity, Q 是被P 触发的 activity, 然后返回Home, 重新启动 P,是否显示 Q

3、android:configChanges

当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如

"locale|navigation|orientation". 这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到呢? 正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.

如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.

4、android:excludeFromRecents

是否可被显示在最近打开的activity列表里,默认是false

5、android:finishOnTaskLaunch

当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false

如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented

6、android:launchMode(Activity加载模式)

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式

Activity有四种加载模式:

standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为standard

standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例

singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

singleInstance:

首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,

实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个

android开发总结

Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效

7、android:multiprocess

是否允许多进程,默认是false

8、android:noHistory

当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹

9、android:screenOrientation

activity显示的模式

默认为unspecified:由系统自动判断显示方向

landscape横屏模式,宽度比高度大

portrait竖屏模式, 高度比宽度大

user模式,用户当前首选的方向

behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)

sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换

nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了

10、android:stateNotNeeded

activity被销毁或者成功重启时是否保存状态

11、android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。

这个属性能影响两件事情:

【A】当有焦点产生时,软键盘是隐藏还是显示

【B】是否减少活动主窗口大小以便腾出空间放软键盘

各值的含义:

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示 【C】stateHidden:用户选择activity时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间 【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分 4、第四层(<intent-filter>)

结构图:

<intent-filter android:icon="drawable resource"

android:label="string resource"

android:priority="integer" >

<action />

<category /> <data />

</intent-filter>

intent-filter属性 android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)

Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作

action属性

action

android开发总结

很简单,只有android:name这个属性。常见的android:name值为

android.intent.action.MAIN,表明此activity是作为应用程序的入口。有关android:name具体有哪些值,可参照这个网址:

category

android开发总结

属性

category也只有android:name属性。常见的android:name值为

android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里) data属性

<data android:host="string"

android:mimeType="string"

android:path="string"

android:pathPattern="string"

android:pathPrefix="string"

android:port="string"

android:scheme="string"/>

【1】每个<data>元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI

android开发总结

的每个部分:

scheme://host:port/path

scheme的值一般为"http",host为包名,port为端口号,path为具体地址。如:

其中host和port合起来构成URI的凭据(authority),如果host没有指定,则port也会被忽略 要让authority有意义,scheme也必须要指定。要让path有意义,scheme+authority也必须要指定

【2】mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件

【3】而pathPattern和PathPrefix主要是为了格式化path所使用的 5、第四层<meta-data>

<meta-data android:name="string"

android:resource="resource specification"

android:value="string"/>

这是该元素的基本结构.可以包含在<activity> <activity-alias> <service> <receiver>四个元素中。

android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried)

android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。)

android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getString],[getBoolean])

6、第三层<activity-alias>属性

<activity-alias android:enabled=["true" | "false"] android:exported=["true" | "false"]

android:icon="drawable resource" android:label="string resource"

android:name="string"

android:permission="string" android:targetActivity="string">

<intent-filter/>

<meta-data/>

</activity-alias>

<activity-alias>是为activity创建快捷方式的,如下实例:

<activity android:name=".shortcut">

<intent-filter>

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

</intent-filter> </activity> <activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut">

<intent-filter>

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

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

</intent-filter> </activity-alias>

其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名) android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标

7、第三层<service> 【1】service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的 【2】service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法 【3】service与activity间的通信

Service后端的数据最终还是要呈现在前端Activity之上的,

android开发总结

因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主【4】

<service android:enabled=["true" | "false"] android:exported[="true" | "false"]

android:icon="drawable resource" android:label="string resource"

android:name="string"

android:permission="string"

android:process="string">

</service>

service标签内的属性之前已有描述,在此不重复了~

8、第三层<receiver>

receiver的属性与service一样,这里就不显示了

BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的

android开发总结

Broadcast进行过滤接受并响应的一类组件,具体参照9、第三层<provider>属性 <provider android:authorities="list"

android:enabled=["true" | "false"]

android:exported=["true" | "false"]

android:grantUriPermissions=["true" | "false"]

android:icon="drawable resource"

android:initOrder="integer"

android:label="string resource"

android:multiprocess=["true" | "false"]

android:name="string"

android:permission="string"

android:process="string"

android:readPermission="string"

android:syncable=["true" | "false"]

android:writePermission="string">

<grant-uri-permission/> <meta-data/> </provider>

contentProvider(数据存储)

【1】android:authorities: 标识这个ContentProvider,调用者可以根据这个标识来找到它

【2】android:grantUriPermission: 对某个URI授予的权限 【3】android:initOrder

10、第三层<uses-library> 用户库,可自定义。所有android的包都可以引用

11、第一层<supports-screens>

<supports-screens android:smallScreens=["true" | "false"]

android:normalScreens=["true" | "false"]

android:largeScreens=["true" | "false"]

android:anyDensity=["true" | "false"] />

这是在android1.6以后的新特性,支持多屏幕机制

各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度

12、第二层<uses-configuration />与<uses-feature>性能都差不多

<uses-configuration android:reqFiveWayNav=["true" | "false"]

android:reqHardKeyboard=["true" | "false"]

android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"] android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"] android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] /> <uses-feature android:glEsVersion="integer"

android:name="string"

android:required=["true" | "false"] />

这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。

13、第二层<uses-sdk /> <uses-sdk android:minSdkVersion="integer"

android:targetSdkVersion="integer"

android:maxSdkVersion="integer"/>

描述应用所需的api level,就是版本,目前是android 2.2 = 8,android2.1 = 7,android1.6 = 4,android1.5=3

在此属性中可以指定支持的最小版本,目标版本以及最大版本

14、第二层<instrumentation /> <instrumentation android:functionalTest=["true" | "false"]

android:handleProfiling=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:targetPackage="string"/> 定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化

android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)

15、<permission>、<uses-permission>、<permission-tree />、<permission-group />区别~ 最常用的当属<uses-permission>,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明,此<uses-permission>与<application>同级,具体权限列表请看此处

通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用<permission> 这个标签。很显然这个标签可以让我们声明自己的权限。比如:

<permission android:name="com.teleca.project.MY_SECURITY" . . . />

那么在activity中就可以声明该自定义权限了,如:

<application . . .>

<activity android:name="XXX" . . . >

android:permission="com.teleca.project.MY_SECURITY"> </activity>

</application> 当然自己声明的permission也不能随意的使用,还是需要使用<uses-permission>来声明你需要该权限 <permission-group> 就是声明一个标签,该标签代表了一组permissions,而<permission-tree>是为一组permissions声明了一个namespace。这两个标签可以看之前的系列文章。

更多相关推荐:
《Android应用开发》个人总结报告

Android应用开发个人总结报告刚开始接触Android感觉到它很有意思在界面开发上和web也可以形成了相通的架构更加方便视觉上也是非常的酷在前期我通过的大量的AndroidSDK开发范例大全中的例子以及An...

《Android项目开发实训》项目总结报告

实训报告姓名祝新学号1144131专业软件技术课程名称android实训项目名称闹铃指导教师王皓实训日期20xx年10月28日至20xx年1月2日20xx年1月2日Android项目开发实训总结报告目录第一章概...

android软件开发工程师转正个人总结

个人总结我于20xx年x月x日进入公司,根据公司的需要,目前担任Android软件工程师一职,负责综合代维,考务通手机客户端的开发工作。将近3个月的时候在这个新的工作环境我收获颇深。开始让我独立完成整个项目,…

Android开发总结

出来工作半年多了没啥好交代的就说说自己半年来的Android开发经历1IDE这半年来从Eclipse到AndroidStudio经历了两个IDE在这里做一下简单的评价如果真要说AndroidStudio是基本上...

android开发总结

Android图片平铺效果方法一XML方式平铺首先两个单词的中文意思分别是dither抖动和tileMode平铺1先来介绍tileMode平铺tileMode属性就是用于定义背景的显示模式disabled默认值...

Android开发知识点总结

如何获取标题栏和状态栏高度1获取状态栏高度decorView是window中的最顶层view可以从window中获取到decorView然后decorView有个getWindowVisibleDisplayF...

Qualcomm平台android开发总结

1高通平台android开发总结711搭建高通平台环境开发环境712搭建高通平台环境开发环境7121高通android智能平台概述71211什么是L4REXBREWAMSS以及相互之间的关系7122选择合适的源...

Android手机游戏开发知识点总结

Android手机游戏知识点总结Android手机游戏开发学习笔记第一部分其实游戏就是让状态机不断的让Canvas在View上画你想要的东西这个状态机包括内部的执行还包括外部的输入Android开发的MVC模式...

【嵌入式】android教程JNI开发疑点总结

android教程JNI开发疑点总结很多Android新手对于JNI开发过程中的疑问不是很清楚根据android123163com邮箱中反馈的内容我们整理如下1JNI中什么情况才处理jstringjintjob...

第一次搭Android开发环境的心得

一IDEAndroidSDK及ADT有两种第一种1需要单独的Eclipse作为IDE2安装ADTAndroidDeveloperTools插件ADT在线安装地址3下载AndroidSDK并安装在安装目录下使用S...

android 错误信息解决方案总结

Android开发错误信息与解决方案汇总错误信息20xx0119163910ApiDemosWARNINGApplicationdoesnotspecifyanAPIlevelrequirement20xx01...

Android学习笔记总结

Android学习笔记总结第一步Android1在Windows下搭建Android开发环境以及HelloWorld程序搭建Android的开发环境以及写一个简单的示例程序在Windows下搭建Android开...

android开发总结(30篇)