<?xml version="1.0" encoding="utf-8"?>
<!--
version  表示应该用什么版本号的解析器去解析该XML文件
encoding 表示应该用什么样的编码去翻译
-->

<!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!-- 1、xmlns为命名空间属性，android 为命名空间名字，http://schemas.android.com/apk/res/android URI标识命名空间资源在互联网上位置
 2、XML中有元素（便签）和属性2个概念，元素的形式为<元素名 属性名="属性的值“> </元素名>
 3、<manifest> </manifest>为根元素（便签） 即第一个出现的元素，是后面元素的根
 4、<uses-sdk android:minSdkVersion="14"/> 为空便签，与属性配合 空便签形式为<元素名/>
 5、元素可以进行嵌套
 6、每个AndroidManifest，xml文件中必须包含其只能包含一个manifest元素
 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="net.micode.notes"
    android:versionCode="1"
    android:versionName="0.1" >
    <!--
    1、package的属性值是java目录下的软件包的包名也是默认的进程名同时也是命名空间名，且值在后面组件中会替换以.开头的声明，
    如android:name=".ui.NotesListActivity" 会解析成android:name="net.micode.notes.ui.NotesListActivity"
    2、versionCode为命名空间android的属性，表示应用版本号，是用于更新的，应为1、2、3这样的形式
    3、versionName也为命名空间android的属性，是给用户看的当前版本号，可以为1.1；1.2；1.2.1 这样的形式
    -->

    <uses-sdk android:minSdkVersion="14" />
    <!--
    配置SDK版本的，在此标签下，可以给android:minSdkVersion， android:maxSdkVersion，android:targetSdkVersion 这3种属性
    进行设置，属性值为API版本，与android的版本有对应关系，minSdkVersion的值指定了能使用该软件的最小API也间接指定了最小的安卓版本，
    maxSdkVersion的值指定了最大的安卓版本，当前安卓版本高于设置的则不能使用用于，targetSdkVersion的值指定了目标安卓版本，在此版本下
    已通过测试
    -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--
    该便签为使用应用必须授予的权限，android:name为权限名名字，android.permission.WRITE_EXTERNAL_STORAGE为权限名属性值
    不同属性值表示要授予不同的权限，该便签表示必须授权应用将数据写入外部储存的权限
    -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <!--
    应用必须授予的权限是 能在桌面创建快捷方式
    -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--
    申请访问网络的权限
    -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!--
    申请读取联系人信息的权限
    -->
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <!--
    申请管理账户的权限
    -->
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
    <!--
    申请验证账户的权限
    -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!--
    申请获得gmail账户的权限
    -->
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <!--
    申请使用凭证的权限，与账户管理有关
    -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!--
    申请开机启动应用的权限
    -->

    <application
        android:icon="@drawable/icon_app"
        android:label="@string/app_name" >
        <!--
        1、manifest元素必须且只能包含一个application元素，application元素中声明了应用需要用到的组件及其属性
        2、android:icon 属性是应用的图标,属性值是对包含图片的可绘制资源的引用，即@res文件夹下的文件名/图片
        3、android:label 属性是应用的标签，属性值是对字符串资源的引用
        -->
        <activity
            android:name=".ui.NotesListActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:theme="@style/NoteTheme"
            android:uiOptions="splitActionBarWhenNarrow"
            android:windowSoftInputMode="adjustPan" >
            <!--
            1、activity元素 声明了一个可视化界面（是Activity类的一个子类），应用所有的可视化界面都必须在清单里进行声明，未声明的不会进行服务
            2、android:name属性 是activity类的类名，属性值必须是完全限定类名，即带包名，用.隔开的路径名，当前类名以.开头，.等于manifest
            中的package的属性值，所以完整类名是net.micode.notes.ui.NotesListActivity，必须设置名字
            3、android:configChanges属性 是指定了该activity类自动处理的配置变更，若无该属性，当配置变更时，会重启该界面，有该属性不会重启，
            保证一直活跃，属性值为该界面会自动处理的配置变更。
            keyboardHidden 用户打开虚拟键盘；orientation 用户更改手机界面反向，旋转手机；screenSize 界面方向改变后，界面尺寸改变
            多个属性值之间用|分隔
            4、android:label属性 是指定当前界面的便签和该activity元素嵌套的intent-filter元素的默认便签，若未指定则为application元素里指定的便签
            5、android:launchMode属性 是该activity类的启动模式，一般用standard和singeTop模式，standard（默认模式下，系统始终会
            实例化一个新的activity进行intent传递，singleTop模式下，如果目标任务的栈顶有activity实例，不会再实例化，而是通过方法传递intent。
            6、android:theme属性 指定了activity的主题，是对样式资源的引用
            7、android:uiOptions属性 指定了界面的额外选项，属性值splitActionBarWhenNarrow是当竖屏是，分隔出一个操作栏
            8、android:windowSoftInputMode属性  指定了主窗口与包含软键盘窗口之间的交互方式
            -->

            <intent-filter>
                <!--
                intent-filter元素 指定了父activity、receiver、provider组件能够响应的intent对象，不是指定的类型则过滤掉
                通过子元素action，category、data来进行过滤器的大部分内容设置
                组件之间通过intent传递消息
                -->
                <action android:name="android.intent.action.MAIN" />
                <!--
                action元素 指定了可接受的intent对象的操作，android:name属性为操作名，属性值为操作
                intent对象有一些标准的操作形式为ACTION_MAIN、ACTION_INSERT等等，在将标准操作分配给action元素时，属性值为
                android.intent.action.MAIN 这样的类型，若分配自定义操作，则属性值最好为 软件包名.操作名
                android.intent.action.MAIN  该属性值表名当前activity为主程序入口即最先启动的activity
                -->
                <category android:name="android.intent.category.LAUNCHER" />
                <!--
                category元素 指定了可接受intent对象的类别， android:name为类别名属性，intent中也有一些标准category，在使用标准
                category时，也想action属性一样，应加前缀android.intent.category.类别名，若要用自定义类别也最好软件包名.类别名
                android.intent.category.LAUNCHER属性值  指定该activity是第一个启动的，即应用主界面，与android.intent.action.MAIN
                配对使用
                -->
            </intent-filter>
        </activity>

        <activity
            android:name=".ui.NoteEditActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:launchMode="singleTop"
            android:theme="@style/NoteTheme" >
            <!--
            1、指定类名为 net.micode.notes.ui.NoteEditActivity
            2、自动处理的配置变更   软硬盘|屏幕旋转|界面大小改变
            3、启动模式   singleTop  当目标任务的栈顶有该activity实例时，不新实例化而只向其传递intent
            4、界面主题   引用样式资源  NoteTheme
            -->

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <!--
                intent过滤器的action元素的 属性值为android.intent.action.VIEW，指定该activity 是显示用户数据的，根据不同数据
                显示不同界面
                -->
                <category android:name="android.intent.category.DEFAULT" />
                <!--
                指定该activity能接受隐式intent
                -->
                <data android:mimeType="vnd.android.cursor.item/text_note" />
                <!--
                data属性 是指定该intent携带的数据形式，android:mimeType属性 是指定该数据的类型
                /前面的与URI的数据有关，如果URI的数据是图片，则为image，/后面的是具体的类型，如图片的格式可以是jpg
                vnd.android.cursor.item/text_note属性值 指定URI包含的数据是单条的，且具体的类型是text_note
                这个类型是自定义的，URI的数据类型是通过provider的getType（URL uri）获得的
                -->
                <data android:mimeType="vnd.android.cursor.item/call_note" />
                <!--
                URI的数据是单条的，类型是call_note
                -->
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.INSERT_OR_EDIT" />
                <!--
                指定了该activity能响应的操作是 添加编辑联系人
                -->
                <category android:name="android.intent.category.DEFAULT" />
                <!--
                指定该intent的类别，可以是隐式
                -->
                <data android:mimeType="vnd.android.cursor.item/text_note" />
                <!--
                指定了该intent携带的数据的类型，数据是单条的，类型为text_note
                -->
                <data android:mimeType="vnd.android.cursor.item/call_note" />
                <!--
                指定携带的数据类型，数据是单条的，类型为call_note
                -->
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
                <!--
                指定activity能响应的intent的动作是搜索，即能开始搜索操作
                -->
                <category android:name="android.intent.category.DEFAULT" />
                <!--
                指定该intent为默认类别,可以是隐式intent
                -->
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
            <!--
            1、meta-data元素 向父组件提供任一数据项的名值对（数据名称 对应值）
            2、android:name="android.app.searchable" 指定该元素名称
            3、android:resource  对资源的引用，资源的ID为该名值对的值
            4、如为android:value   也是对资源的引用，资源包含的值为该名值对的值
            -->
        </activity>

        <provider
            android:name="net.micode.notes.data.NotesProvider"
            android:authorities="micode_notes"
            android:multiprocess="true" />
        <!--
        1、provider元素 声明了一个content provider组件，即一个ContentProvider的子类，是用来向外界提供可访问内容的
        2、该组件的名字为net.micode.notes.data.NotesProvider
        3、android:authorities属性  是指定提供该内容的授权方，用来标识提供的数据的，至少一个，多个则分号分隔
        4、android:multiprocess属性   指定了若应用在多个进程间运行时，是否每个进程都有一个content provider实例，true则是
        -->

        <receiver
            android:name=".widget.NoteWidgetProvider_2x"
            android:label="@string/app_widget2x2" >
            <!--
            1、receiver元素  声明了一个广播接受器，即BroadcastReceiver的子类，能接受来着系统，其他应用，自己应用的intent对象，
            即使其他组件未运行
            2、该组件名称为 net.micode.notes.widget.NoteWidgetProvider_2x
            3、标签 对字符串资源的引用 @string/app_widget2x2
            -->
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <!--
                指定该receiver能响应的intent的动作为   应用挂件更新
                -->
                <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
                <!--
                指定响应intent的动作为   应用挂件删除
                -->
                <action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
                <!--
                指定响应的intent的动作为    私人模式变更
                -->
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_2x_info" />
            <!--
            向该父组件 receiver  提供一个数据项的名值对，名为 android.appwidget.provider，值为 资源@xml/widget_2x_info的id
            -->
        </receiver>
        <receiver
            android:name=".widget.NoteWidgetProvider_4x"
            android:label="@string/app_widget4x4" >
            <!--
            声明了一个完全限定类名为net.micode.notes.widget.NoteWidgetProvider_4x的广播接收器子类，标签为对@string/app_widget4x4
            的引用
            -->
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
                <action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
                <!--
                指定的响应动作  应用挂件更新，应用挂件删除，私人模式变更
                -->
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_4x_info" />
            <!--
            向该父组件提供一个数据项的名值对
            -->
        </receiver>

        <receiver android:name=".ui.AlarmInitReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
            <!--
            声明一个广播接收器组件，响应的intent的动作为  开机自启
            -->
        </receiver>

        <receiver
            android:name="net.micode.notes.ui.AlarmReceiver"
            android:process=":remote" >
            <!--
            声明一个广播接收器组件，android:process=":remote"属性 指定该组件的进程名为:remote
            -->
        </receiver>

        <activity
            android:name=".ui.AlarmAlertActivity"
            android:label="@string/app_name"
            android:launchMode="singleInstance"
            android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
            <!--
            声明了一个界面，android:launchMode属性 指定了该activity的启动模式为singleInstance，即为该activity创建一个单独的任务栈
            且只能有一个该activity，其他activity不能进入，界面主题  @android:style/Theme.Holo.Wallpaper.NoTitleBar的引用
             -->
        </activity>

        <activity
            android:name="net.micode.notes.ui.NotesPreferenceActivity"
            android:label="@string/preferences_title"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.Holo.Light" >
            <!--
            声明了一个界面，启动模式singleTop，主题@android:style/Theme.Holo.Light的引用
            -->
        </activity>

        <service
            android:name="net.micode.notes.gtask.remote.GTaskSyncService"
            android:exported="false" >
            <!--
            1、声明了一个服务组件，Service的子类，完全限定类名为net.micode.notes.gtask.remote.GTaskSyncService
            2、android:exported属性  指定了该组件是否能被其他应用所访问，交互
            -->
        </service>

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".ui.NoteEditActivity" />
        <!--
        向父组件 application提供了一个数据项的名值对，名为android.app.default_searchable，值为net.micode.notes.ui.NoteEditActivity
        类包含的值
        -->
    </application>
</manifest>
