您的位置:首页 > 移动开发 > Android开发

AndroidManifest简述

2015-09-21 14:56 549 查看


1.AndroidManifest.xml 配置介绍

本质:AndroidManifest.xml是整个应用的主配置清单文件

包含:该应用的包名、版本号、组件、权限等信息

作用:记录该应用的相关配置信息

2.初识AndroidManifest.xml

(1)全局篇(包名、版本信息)

(2)组件篇(四大组件)

(3)权限篇(申请权限和定义权限)

(1)全局篇
a.应用的包名以及版本信息的管理
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="com.android.settings"----->应用程序的包名

        coreApp="true"----->coreApp是android在bootmode下系统启动的最小子集。在这个模式下,有一组最少的,必须的app需要启动的进程中。

        android:versionCode="20150101"----->设备程序识别版本(用于升级)

        android:versionName="3.0.5"------>显示给用户的版本号

        android:sharedUserId="android.uid.system">---->Android为每个应用程序分配一个用户ID,通过这个标识应用程序。如果两个应用拥有相同的UserID,它们就能够互相访问对方的数据,如果需要,还可以运行在同样的进程中。
b.控制android版本信息(可以支持的最低版本,当前的系统版本)
 <uses-sdk
        android:minSdkVersion="8"   ------>可以支持的最低版本

        android:targetSdkVersion="16" /> ----->当前的系统版本

(2)组件篇

 <application android:label="@string/settings_label"

            android:icon="@mipmap/ic_launcher_settings"

            android:name=".SettingsApp"

            android:taskAffinity=""

            android:theme="@style/Theme.Aui"

            android:hardwareAccelerated="true"

            android:requiredForAllUsers="true"

            android:supportsRtl="true"

            android:allowBackup="false">
application 属性可以设置:

图标:android:icon
标题:android:label
主题样式:android:theme
taskAffinity属性:android:taskAffinity------>每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。 

硬件加速:android:hardwareAccelerated

允许备份:allowBackup
a .Activity(活动)
<activity

            android:name="com.example.vibrator.MainActivity"

            android:label="@string/app_name" 
            android:launchMode="standard">

            <intent-filter>

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

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

            </intent-filter>

        </activity>
启动一个没有在清单文件中定义的Activity会抛出异常

 E/AndroidRuntime(393):
FATAL EXCEPTION: main

 E/AndroidRuntime(393): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.activity/com.example.activity.OtherActivity}; have you declared this activity in your AndroidManifest.xml?

 android:launchMode(Activity四种加载模式)

Activity有四种加载模式:standard、singleTop、singleTask、singleInstance

standard、singleTop是一组,发送新实例

singleTask、singleInstance是一组,创建一个实例

默认为standard

standard:通过intent将发送给新的实例,所以每次跳转都会生成新的activity;

singleTop:发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例;(singleTop启动模式,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例)

singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它;(singleTask模式,如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前)

singleInstance:启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。

standard、singleTop、singleTask是在同一个任务栈中,singleInstance会新创建一个任务栈;

说明 :Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。

Android中组件的通信方式:
1.通过包名和类名指定唯一的组件
2.通过intent-filter 过滤器,指定过滤的action
b.Service(服务)
 <service android:name="ww.waterworld.sales.Myservice" 

        android:persistent="true"--->后台不被Kill
        android:exported="true">

</service>

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

c.ContentProvider(内容提供者)

 <provider

            android:name="android.support.v4.content.FileProvider"

            android:authorities="com.android.settings.files"

            android:grantUriPermissions="true"

            android:exported="false">

            <meta-data

                android:name="android.support.FILE_PROVIDER_PATHS"

                android:resource="@xml/file_paths" />

        </provider>

内容提供者是用来管理数据库访问以及程序内和程序间的数据共享

d.BroadcastReceiver(广播接收者)

<receiver android:name="ww.waterworld.sales.BootCompleteBroadcastReceiver" > 

         <intent-filter > 

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

         </intent-filter> 

 </receiver> 

广播接收者全局事件的监听器,相匹配intent-filter过滤器中属性被应用程序广播出来,BroadcastReceiver执行相应的监听动作,全局接收和过滤,可以与framework层进行信息交互

(3)权限篇

a.使系统权限
<uses-permission>申请权限
声明哪些是由你定义的权限,而这些权限是应用程序正常执行所必需的。在安装程序的时候,设定的所有权限将会告诉给用户,对于本地Android服务来说,权限是必须的(例如上网,打电话,发短信)
b.自定义权限

 <activity

            android:name="com.example.activity.MainActivity"

            android:label="@string/start"

            android:configChanges="orientation|keyboardHidden"

            android:permission="zmj.permission.LOADINGVIEW">

            <intent-filter>

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

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

            </intent-filter>

      </activity>

<uses-permission android:permission="zmj.permission.LOADINGVIEW"/>

自定义权限可以自定义命名,用来保护Android的某些重要组件。已知Activity的包名和类名就可以启动一个Acitivity,加上自定义权限可以防止其他应用访问当前的Activity

mIntent.setClassName("com.example.service", "com.example.service.MyService");

mIntent.setComponent(new ComponentName("com.example.service", "com.example.service.MyService"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: