AndroidManifest解析

以android4.4版中的DeskClock中的AndroidManifest.xml为例

功能概述

AndroidManifest.xml 是每个android程序中必须的文件。位于项目的根目录下,其描述了本应用对外提供的接口。这些接口包括外界可调用的组件(activities、services、等等)以及这些组件可被调用的位置;本应用的一些属性如应用版本号、运行的sdk版本;除了声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还指定permissions和instrumentation(安全控制和测试)

AndroidManifest.xml结构

以DeskClock中的AndroidManifest.xml为例(可点击下载).
下面由外而内的对这个文件进行分析:

第一层( Tag=Manifest)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.android.deskclock"
        android:versionCode="301" android:versionName="3.0.0">
</manifest>

xmlns:android

定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

package

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

versionCode

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

versionName

这个名称是给用户看的

第二层

第二层的标签有多个,我们一一道来:

original-package

<original-package android:name="com.android.alarmclock" />
<original-package android:name="com.android.deskclock" />
  1. 只用于安装在system分区的应用
  2. 使用标签的话, 等组件在标识”android:name”时就必须声明完整的路径,“.ClassName”无效。
  3. 标签用以设置应用 源码包名,即Java文件所在的源码程序包层次,android工程中真实的源代码层次结构。 所以程序中用到的R可以是 com.android.alarmclock.R 或者com.android.deskclock.R

uses-permission


用以声明程序中所要使用的权限(权限的详细定义整理可参看文档android权限声明)

uses-sdk

<uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" >
</uses-sdk>

声明了本应用所运行的最低sdk版本

application

<application android:label="@string/app_label"
     android:icon="@mipmap/ic_launcher_alarmclock"
     android:requiredForAllUsers="true"
     android:supportsRtl="true">
</application>
supportsRtl

RTL布局支持

label
icon

声明整个APP的图标,图片一般都放在drawable文件夹下

android:process

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

第三层(application节点中)

provider

<provider android:name=".provider.ClockProvider"
                android:authorities="com.android.deskclock"
                android:exported="false" />

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

activity

<activity android:name="DeskClock"
                android:label="@string/app_label"
                android:theme="@style/DeskClock"
                android:icon="@mipmap/ic_launcher_alarmclock"
                android:launchMode="singleTask"
</activity>
android:launchMode(Activity加载模式)

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

  1. standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。
  2. singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
  3. singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。
  4. 首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。

activity-alias

    <activity-alias android:name="DockClock"
            android:targetActivity="DeskClock"
            android:label="@string/app_label"
            android:theme="@style/DeskClock"
            android:icon="@mipmap/ic_launcher_alarmclock"
            android:launchMode="singleTask"
            android:enabled="@bool/config_dockAppEnabled"
            >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.DESK_DOCK" />
        </intent-filter>
    </activity-alias>

其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)

android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标

service

<service android:name="com.android.deskclock.stopwatch.StopwatchService"
            android:exported="false"
            android:description="@string/stopwatch_service_desc">
        <intent-filter>
            <action android:name="start_stopwatch" />
            <action android:name="lap_stopwatch" />
            <action android:name="stop_stopwatch" />
            <action android:name="reset_stopwatch" />
            <action android:name="share_stopwatch" />
        </intent-filter>
    </service>
android:exported

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。

android:description/android:label

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


文章编辑于:2015-2-8

每篇文章应该仅有一个主题,这样简约而美好

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值