2016-05-04

    我喜欢,看别人写的程序手记,那种真实的理解和感受,看这样的文章,是一种享受,一种飘浮在意识空间中的独立世界的纯意识层面思考的快乐,全息而富有色彩,真实而无极限。

下面是看到一段移动端开发者的博文手记:


    ......“AndroidManifest.xml 是每个 android 程序中必须的文件。它位于 application 的根目录,描述了 package 中的全局数据,包括了 package 中暴露的组件( activities, services, 等等),它们各自的实现类,各种能被处理的数据和启动位置。”......

 

    当我看到这段文字的时候,感到很精彩,显然看到了作者条理逻辑分明的逻辑中枢神经,这种精彩,就像是看到了《***帝国》中描述的一个精密的控制中心,一个处理大厅或各条走廊和控制中心,,延伸开来各种处理组件和处理程序,结构清晰,逻辑丰富而充实。

以此为例,我试图来理解看到的这段代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.knight.android.test"
    android:versionCode="1"
    android:versionName="1.0" >
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="AndroidTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <!-- 授权访问网络 -->
    <uses-permission android:name="android.permission.INTERNET"/>

</manifest>

 

第一段显然是标明xml的版本号和编码字符集。

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

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

Axmlns:android

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


Bpackage

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


CsharedUserId

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

DsharedUserLabel

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


EversionCode

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


FversionName

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


GinstallLocation

安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnlyautopreferExternal

选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)

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

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

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

这位天才的博文总结如下:

    此文件一个重要的地方就是它所包含的 intent-filters 。这些 filters 描述了 activity 启动的位置和时间。每当一个 activity (或者操作系统)要执行一个操作,例如:打开网页或联系簿时,它创建出一个 intent 的对象。它能承载一些信息描述了你想做什么,你想处理什么数据,数据的类型,和一些其他信息。Android 比较了 intent 对象中和每个 application 所暴露的 intent-filter 中的信息,来找到最合适的 activity 来处理调用者所指定的数据和操作。

除了能声明你程序中的 Activities, Content Providers, Services, 和 Intent Receivers,你还能指定 permissions 和 instrumentation (安全控制和测试)在 AndroidManifest.xml 文件中。天哪?!!这些都是什么啊?别着急,呵呵,这些都是运行手机app程序需要定义好的一些文件,以后会逐渐的知道,先不用管,看看有这么多的内容为我们服务,有多么好?

    一般打开AS,一般我们首先会发现AndroidManifest.xml,这是什么文件呢?一个基本而重要的全局文件。

这是一个简单的AndroidManifest.xml

< ?xml version="1.0" encoding="utf-8"?>

< manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my_domain.app.helloactivity">

< application android:label="@string/app_name">

< activity class=".HelloActivity">

< intent-filter>

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

< category android:value="android.intent.category.LAUNCHER"/>

< /intent-filter>

< /activity>

< /application>

< /manifest>

值得一提一些常用之处:

 

  · 几乎所有的 AndroidManifest.xml (以及许多其他Androidxml的文件)在第一个元素中包含了命名空间的声明xmlns:android="http://schemas.android.com/apk/res/android"。这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

 

  · 大部分manifests包含了单个< application>的元素,它定义了所有的application级别组件和属性,并能在package中使用。

 

  · 任何被用户看作顶层应用程序,并能被程序启动器所用的package,需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类,如上述代码中所见。

 

  这里是AndroidManifest.xml文件结构的一个详细的列表,描述了所有能被使用的标记。

 

    manifest

  根节点,描述了package中所有的内容。在它之下能放置:

 

  uses-permission

  请求你的 package 正常运作所需赋予的安全许可。见 SecurityModel 来获得许可的更多的信息。一个 manifest 能包含零个或更多此元素。

 

    permission

  声明了安全许可来限制哪些程序能你 package 中的组件和功能。见 SecurityModel 来获得许可的更多的信息。一个 manifest 能包含零个或更多此元素。

 

    instrumentation

  声明了用来测试此 package 或其他 package 指令组件的代码。见 Instrumentation 来获得许可的更多的信息。一个 manifest 能包含零个或更多此元素。

 

    application

  包含 package 中 application 级别组件声明的根节点。此元素也可包含 application 中全局和默认的属性,如标签,icon,主题,必要的权限,等等。一个 manifest 能包含零个或一个此元素(不允许多余一个)。在它之下能放置零个或更多下列组件声明:

 

    activity

  Activity 是用来与用户交互的主要工具。当用户打开一个应用程序的初始页面时一个 activity ,大部分被使用到的其他页面也由不同的activity所实现并声明在另外的 activity 标记中。

 

  注意:每一个 activity 必须要一个 标记对应,无论它给外部使用或是只用于自己的 package 中。如果一个 activity 没有对应的标记,你将不能运行它。

 

  另外,为了支持运行时查找你的 activity, 你能包含一个或多个 元素来描述你 activity 所支持的操作:

 

    intent-filter

  声明了指定的一组组件支持的 Intent 值,从而形成了 IntentFilter。除了能在此元素下指定不同类型的值,属性也能放在这里来描述一个操作所需的唯一的标签,icon 和其它信息。

 

    action

 

  组件支持的 Intentaction

 

    category

  组件支持的 IntentCategory.

 

    type

  组件支持的 Intentdata MIME type.

 

    schema

  组件支持的 Intentdata URI scheme.

 

    authority

  组件支持的 Intentdata URI authority.

 

    path

  组件支持的 Intentdata URI path.

 

    receiver

  IntentReceiver 能使的 application 获得数据的改变或者发生的操作,即使它当前不在运行。利用 activity 标记,你能选择地包含一个或多个 receiver 所支持的 元素;

 

    service

  Service 是能在后台运行任意时间的组件。利用 activity 标记,你能选择地包含一个或多个 receiver 所支持的 元素;

 

    provider

ContentProvider 是用来管理持久化数据并发布给其他应用程序使用的组件。AndroidManifest.xml 是每个 android 程序中必须的文件。它位于 application 的根目录,描述了 package 中的全局数据,包括了 package 中暴露的组件( activities, services, 等等),它们各自的实现类,各种能被处理的数据和启动位置。