Android源码学习------SystemUI(二)

SystemUI----AndroidManifest文件

AndroidManifest是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个 android程序中必须的文件,apk需要的权限,特征以及四大组件,都在这里进行配置。它位于我们开发的应用程序的根目录下。

主要功能

  • 指定了该应用程序的Java包:该包名作为应用程序的一个独特标识。
  • 它描述了应用程序组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成。它指定了实现每个组件的类以及公开发布它们的能力(例如,它们能持有哪个Intent信息)。这些声明使Android系统知道这儿有什么组件以及在什么条件下它们可以被载入。
  • 确定托管应用组件的进程。
  • 它声明了本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互。也声明了其他应用程序在和该应用程序交互时需要持有的许可。
  • 它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明仅当应用程序在开发和测试过程中被提供;它们将在应用程序正式发布之前被移除。
  • 它声明了该应用程序所需的Android API的最小化水平。
  • 它列出了该应用程序必须链接的库。

主要源码



        package="com.android.systemui"
        
        android:sharedUserId="android.uid.systemui"
        
        coreApp="true">
        
    
    

    
    
    
   ......
    
    
    
    ......
    
    

    
        android:persistent="true"
        
        android:allowClearUserData="false"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:label="@string/app_label"
        android:icon="@drawable/icon"
        
        android:process="com.android.systemui"
        android:supportsRtl="true"
        android:theme="@style/Theme.SystemUI"
        android:defaultToDeviceProtectedStorage="true"
        android:directBootAware="true"
        android:appComponentFactory="android.support.v4.app.CoreComponentFactory">
  
        
        ......
        
        

        
        
            
                
            
        
        ......
        
            
                
                
            
        
        
        
            
                
            
        
        ......
        
        
        ......
       
        
        ......
    

详细说明解释


所有的xml都必须包含manifest元素。这是文件的根节点。
xmlns:android——这个属性定义了Android命名空间。必须设置成"http://schemas.android.com/apk/res/android"不要手动修改。
package——名由英文字母(大小写均可)、数字和下划线组成。每个独立的名字必须以字母开头。构建APK的时候,构建系统使用这个属性来做两件事:

  • 生成R.java类时用这个名字作为命名空间(用于访问APP的资源)比如:package被设置成com.android.systemui,那么生成的R类就是:com.android.systemui.R
  • 用来生成在manifest文件中定义的类的完整类名。比如package被设置成com.android.systemui,并且activity元素被声明成activity android:name=".MainActivity",完整的类名就是com.android.systemui.MainActivity。
    包名也代表着唯一的application ID,用来发布应用。但是,要注意的一点是:在APK构建过程的最后一步,package名会被build.gradle文件中的applicationId属性取代。
    sharedUserId——通常,Android给每个APK进程分配一个单独的空间,因此不同的APK会具有不同的userId,并且为它创建一个沙箱(存放在data/data/XXXX/目录下的所有数据),不同的userId运行时属于不同的进程中,而不同进程中的资源是不共享的,以防止影响其他应用程序(或者其他应用程序影响它),保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的,拥有同一个userId的多个APK可以配置成运行在同一个进程中。所以默认就是可以互相访问任意数据;也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件。就像访问本程序的数据一样。同时也能够唤起apk的activity。一个mainfest只能有一个Shareuserid标签。
    coreApp——把该app作为核心app,优先分配内存。


权限声明:

permission——是一种约束,它限制了对设备上的数据或部分代码的访问。施加权限是为了保护关键的数据和代码不被滥用,防止给用户带来不好的用户体验。用元素来声明一个新的权限。
uses-permission——用于给应用程序授予正确的操作的所必须的权限。这些权限是在应用程序安装时被授予的,而不是在运行时授予的。用uses-permission元素来声明其要求的权限。一个功能能够通过多个权限来施加保护。
对某个组件添加访问权限:android:permission=“com.android.systemui.permission.SELF”

声明权限相关属性:

android:name——用于定义权限的名称,权限名通常要用包名做为前缀,以保证其唯一性。
android:description——给权限定义一个用户可读的懂的描述,它要比标签更长更详细。它可以显示给用户,以便向用户解释权限的含义。
android:icon——要引用一个可绘制的图标资源,用于代表这个权限。
android:label——定义了一个能够显示给用户的权限名称。
android:permissionGroup——把这个权限分配到一个权限组中。这个属性的值是一个权限组的名称,它必须是在本应用程序或另一个应用中用permission-group元素声明的权限组。如果这个属性没有被设置,那么这个权限不属于任何权限分组。
android:protectionLevel——意味着潜在的风险,因此在判定是否要把权限授予请求的应用程序时,使用这个属性定义来指示系统应该遵循的过程。取值范围及说明:

  • normal:默认值。这是让请求的应 用程序访问独立的应用程序级功能的一个较低风险的权限,它会给另一个应用程序、系统、或用户带来最小化的风险。系统在安装应用程序时会自动的把这种类型的 权限授予请求的应用程序,而不需要用户明确的批准(虽然在安装应用程序之前,用户始终可以有选择的查看这些权限)。
  • dangerous:这个是一个较高风险的授 权,它会让请求该权限的应用程序访问私有的用户数据,或者控制用户设备,从而给用户带来负面影响。因为这种权限会引入潜在的风险,因此系统不会自动把这种 权限授予请求这个权限的应用程序。例如,应用程序所请求的这些dangerous类型的权限,在确认处理之前,可以显示给用户,或者采用一些其他的方法, 以避免用户自动把权限授予所请求的应用程序。
  • signature:系统只会把这种权限授予具有相同数字签名的应用程序,也就是说,请求该权限的应用程序要与声明该权限的应用程序具有相同的数字签名。如果证书匹配,系统就会自动的把该权限请求权限的应用程序,而不会通知用户,也不会要求用户明确的批准。
  • signatureOrSystem:系统只会把这种权限授予 Android系统镜像中应用程序,或者是那些与系统镜像中具有相同证书签名的应用程序。请避免使用这个选项,因为signature类型的权限应该足以 满足大多数工作的需要。SingatureOrSystem权限主要用于某些特定的场景,如:多个厂商有一些要构建在系统镜像中的应用程序,并且它们共享 一些明确的特殊功能。
    
    

protected-broadcast——声明只能由此程序发送的特殊broadcast,只有系统app可以使用该标签,非系统app中的该标签会被忽略。受保护的广播被保存到PMS(PackageManagerService.java),,用的是PMS的接口isProtectedBroadcast()可检查广播是否为受保护的。


一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性。
android:name——用完整的Java类名,给应用程序定义了一个Application子类的实现。当应用程序进程被启动时,这个类在其他任何应用程序组件被实例化之前实例化。
android:persistent——置应用程序是否应该时刻保持运行状态,如果设置为true,那么就保持,即app将不能被kill或kill后会自动重启,否则不保持。
android:allowClearUserData——用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然。
android:allowBackup——是否允许应用备份相关的数据并且在必要时候恢复还原这些数据,如果该标识设为false,则代表不备份和恢复任何的应用数据,默认的该标识属性为true。当 allowBackup 标识设置为 true 时,用户即可以通过 adb backup和 adb restore来进行对应数据的备份和恢复。
android:hardwareAccelerated——是否为应用程序中所有的 Activity 和 View 启用硬件加速渲染功能true表示开启,“false”表示关闭。 如果 minSdkVersion 或 targetSdkVersion 的值大于等于14,则本属性默认值是true,否则,默认值为false。应用程序可以使用硬件加速的 OpenGL 渲染功能来提高很多常用 2D 图形操作的性能。 当开启硬件加速渲染功能时,大部分 Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的操作都会被加速。 即便应用程序没有显式地调用系统的 OpenGL 库,这仍能使动画更加平滑、屏幕滚动也更加流畅、整体响应速度获得改善。更多详细的操作可以去查看 google 文档https://developer.android.com/guide/topics/graphics/hardware-accel.html。
android:label——用于设置应用程序整体的用户可读的标签。
android:icon——用于设置应用程序的整个图标,以及每个应用组件的默认图标。
android:process——用于定义一个进程名称,应用程序的所有组件都应该运行在这个进程中。每个组件都能够用它自己process属性的设置来覆盖这个application元素中的设置。
默认情况下,当应用程序的第一个组件需要运行时,Android系统就会给这个应用程序创建一个进程。然后,应用中的所有组件都运行在这个进程中。默认的进程名是跟manifest元素中设置的包名进行匹配的。通过设置这个属性,能够跟另外一个应用程序共享一个进程名,能够把这两个应用程序中的组件都安排到同一个进程中运行—但是仅限于这两个应用程序共享一个用户ID,并且带有相同的数字证书。如果这个进程名称用“:”开头,那么在需要的时候,就会给应用程序创建一个新的、私有的进程。如果进程名用小写字符开头,就会用这个名字创建一个全局的进程,这个全局的进程能够被其他应用程序共享,从而减少资源的使用。
android:supportsRtl——声明该APP是否支持RTL(Right To Left)布局。如果设置成false或者targetSdkVersion被设置成16或更低,RTL API就不起作用了,默认的值是false。
android:theme——定义应用使用的主题的,它是一个指向style资源的引用。各个activity也可以用自己的theme属性设置自己的主题。
android:defaultToDeviceProtectedStorage——将应用设为直接启动感知型应用,仅适用于系统应用。用于将默认的应用存储位置重定向到 DE 存储空间(而非 CE 存储空间)。
android:directBootAware——请求在直接启动时运行。将相应应用中的所有组件均标记为加密感知型组件,重启设备时,接收来自系统的 LOCKED_BOOT_COMPLETED 广播消息,适用于所有应用。
android:appComponentFactory——添加相应的依赖组件。


    
       
    

activity——必须包含在application元素中,任何未在清单文件声明activity都无法运行,以至于应用程序崩溃。
android:name——Activity类的名称。该属性值为完全限定类名称,例如com.android.systemui.recents.RecentsActivity。方便起见,如果第一个字符是点(’.’),就需要加上manifest元素中的包名。应用一旦发布,不应更改该名称。没有默认值,必须指定该名称。
android:label——Activity标签,可以被用户读取。该标签会在Activity激活时显示在屏幕上。如果未设置,用application中的label属性。对属性的设置要求和application中一样。
android:exported——是否允许activity被其它程序调用。如果为false,则该Activity只能由同一应用程序的组件或者有同样用户ID的应用程序来启动。
android:launchMode——描述了该Activity应该如何被启动。在Intent对象中,与Activity标志一起工作的模式有4种,分别是:standard , singleTop , singleTask 和 singleInstance。默认模式是standard。

  • standard:标准模式,也是默认模式。每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。这种模式,一个栈中可以有多个实例。而且是谁启动了此Activity,那么这个Activity就运行在启动它的Activity所在的栈中。标准模式下,只要启动一次Activity,系统就会在当前任务栈新建一个实例。
  • singleTop:栈顶复用模式。如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它的onNewIntent()方法会被执行。如果当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例。
  • singleTask :站内复用模式。如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。如果不存在该实例,则会在该任务栈中新建Activity实例。
  • singleInstance:单实例模式。只有一个实例。该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。

android:excludeFromRecents——该属性表示应用程序是否应该将Activity从最近运行的应用程序列表排除。如果排除,则为true,否则为false。默认值为false。
android:stateNotNeeded——activity被销毁或重启是否不保存状态。通常,在暂时关闭Activity之前,我们要调用onSaveInstanceState()方法来保存当前的Activity的状态。该方法在Bundle对象中存储Activity的当前状态,该对象在重启Activity时将会以参数的方式传给onCreate()方法。如果该属性被设置为true,onSaveInstanceState()就不会被调用,并且onCreate()会被传递null,这和Activity首次启动时所做的一样。
android:resumeWhilePausing——表明在前一个Activity还在执行onPause()方法时(即在暂停过程中,还没有完全暂停),允许该Activity显示,但是要注意,这个Activity不能申请任何其他额外的资源。
android:resizeableActivity——启用或禁用多窗口显示。设置为 true,Activity 将能以分屏和自由形状模式启动。 如果此属性设置为 false,Activity 将不支持多窗口模式。默认设为 true。
android:configChanges——列出 Activity 在某些设备配置(比如屏幕方向,字体大小,网络类型等)发生变化的时候,Activity将会被重新启动以适配新的配置。在运行时发生配置更改时,默认情况下会关闭 Activity 然后将其重新启动,但使用该属性声明配置将阻止 Activity 重新启动。 Activity会保持运行状态,并且系统会调用其 onConfigurationChanged()方法。例如:orientation屏幕方向发生了变化;keyboardHidden键盘无障碍功能发生了变化等等。
android:theme——设定主题格式,与application中的theme类似。
intent-filter——意图过滤器。指明这个activity或者其他包含它的组件可以以什么样的意图(intent)启动。一条intent-filter元素至少应该包含一个action。与请求的Intent进行匹配。

  • action元素:表示activity作为一个什么动作启动,使用 android:name 特性来指定对响应的动作名。动作名必须是独一无二的字符串。android.intent.action.MAIN表示作为主activity启动。与Intent中的Action进行匹配。
  • category元素:是action元素的额外类别信息,android.intent.category.LAUNCHER表示这个activity为当前应用程序优先级最高的Activity。

    
        
        
    

activity-alias——用于给targetActivity属性所指定Activity设定一个别名,目标Activity必须跟别名Activity在同一个应用程序中,并且这个Activity必须在别名之前被声明。别名会作为一个独立的实体来代表目标Activity。它能够有自己的Intent过滤器设置,通过应用处理别名的方式来判断哪个Intent对象能够激活目标。例如:别名中的Intent过滤器可以指定“android.intent.action.MAIN”和“android.intent.category.LAUNCHER”标记,这样即使在目标Activity的过滤器上没有指定这些标记,也会让它在应用的启动器窗口中表示。除了targetActivity属性以外,activity-alias的其他属性是activity属性的一个子集。对于子集中的属性,不会把目标Activity中所设置的任何值转交给别名Activity。但是,对于子集中所没有的属性,则给目标Activity所设置的值也会应用到别名Activity。
android:targetActivity——用于设置通过别名所能够激活的那个Activity的名字。这个名字必须跟它前面的activity元素的name属性匹配。
android:enabled——用于设定系统能否通过这个别名来实例化目标Activity,如果设置为true,则可以实例化,否则不能实例化。默认值是true。application和activity-alias属性都必须是true,这样系统才能够通过别名来实例化目标Activity。如果其中之一是false,那么别名就不会起作用。


    
        
    

receiver——用于声明一个广播接收器(一个BroadcastReceiver 子类),作为应用程序的组件之一。广播接收器能够让应用程序接收那些由系统或其他应用程序发出的广播Intent对象,即使是在该应用程序的其他组件没有运行的时候,也能够接收来自系统或其他应用程序的广播消息。可以在应用程序的清单文件中,使用receiver来声明注册一个广播接收器;也可以在代码中动态的创建一个广播接收器,并使用Context.registerReceiver()方法来注册它。
android:name——通常要使用类的全名来设置(如:com.android.systemui.screenshot.ScreenshotServiceErrorReceiver)。也可以使用简写(如:.screenshot.ScreenshotServiceErrorReceiver)。系统会自动的把元素中的package属性所设定的包名添加到这个简写的名称上。这个属性没有默认值,这个名字必须被指定。
android:process——用于设置该广播接收器应该运行在哪个进程中的进程名。通常,应用程序的所有组件都在给应用程序创建的默认进程中运行,它有与应用程序包名相同的名称。但是每个组件自己的process属性能够覆盖这个默认设置,这样就允许把一个应用程序分离到多个进程中。如果这个属性值用“:”开头,则在需要的时候系统会创建一个新的,应用程序私有的进程,并且该广播接收器也会运行在这个进程中。如果这个属性值用小写字母开头,那么接收器就会运行在以这个属性值命名的全局进程中,它提供使其工作的权限。这样就允许不同的应用程序组件来共享这个进程。
android:exported——用于指示该广播接收器是否能够接收来自应用程序外部的消息。如果设置true,则能够接收;如果设置为false,则不能够接收,只能接收那些由相同应用程序组件或带有相同用户ID的应用程序所发出的消息。它的默认值依赖它所包含的Intent过滤器。如果不包含过滤器,说明接收器只能由指定了明确类名的Intent对象来调用,这就意味着该接收器只能在应用程序内部使用(因为通常在应用程序外部是不会知道这个类名的),这种情况下默认值就是false。另一方面,如果接受器至少包含了一个过滤器,那么就意味着这个接收器能够接收来自系统或其他应用程序的Intent对象,因此默认值是true。


service——用于声明一个服务(Service类的子类)作为应用程序的组件之一,被用于实现长时的后台操作,或提供能够被其他应用程序调用的通信API。所有的服务都必须用清单文件中的元素来代表。任何没有在清单中声明的服务都不能被系统看到,也不会被运行。
android:name——指定实现该服务的Service子类的类名。它应该是完整的Java类名(如:com.android.systemui.doze.DozeService)。但是,也可以使用简写(如:.doze.DozeService),系统会把元素中package属性所设定的值添加到简写名称的前面。
android:exported——与receive元素中的作用类似。
android:singleUser——如果设置为true,所有用户运行此组件时,都只会有一个实例。
android:permission——定义了要启动或绑定服务的实体必须要有的权限。如果调用者的startService()、bindService()和stopService()方法没有被授予这个权限,那么这些方法就不会工作,并且Intent对象也不会发送给该服务。如果这个属性没被设置,那么通过appliction元素的permission属性所设定的权限就会适用于该服务。如果application元素也没有设置权限,则该服务不受权限保护。



provider——用于声明一个内容提供器,它对应一个ContentProvider类的子类。它提供了由应用程序管理的数据的结构化访问。应用程序使用的所有的内容提供器都必须在其清单文件中由provider元素来声明。对于那些没有在清单中声明的内容提供器,系统看不到,也不会运行。
android:name——定义内容提供器的实现类的名称,它是ContentProvider类的一个子类。应该使用完整的Java类名来设定(如:com.android.systemui.keyguard.KeyguardSliceProvider)。但是也可以使用简写(如:.keyguard.KeyguardSliceProvider),这时系统会使用元素中指定的包名跟这个简写名称的组合来识别内容提供器。这个属性没有默认值,必须要给这个属性设定一个名称。
android:authorities——标识内容提供器范围内的数据URI的授权列表,有多个授权时,要用分号来分离每个授权。为了避免冲突,授权名应该使用Java样式的命名规则(如:com.android.systemui.keyguard)。通常,用ContentProvider子类名称来设定这个属性。这个属性没有默认值,至少要指定一个授权。
android:grantUriPermissions——用于设定那些对ContentProvider的数据没有权限的访问者,是否能够被授予访问的权限,这个权限是临时性的,它会克服由readPermission、writePermission和permission属性的设置限制。如果这个属性设置为true,权限可以临时授予访问者,否则不会授予没有访问权限的访问者。如果设置为false,则权限只能被授予gran-uri-permission子元素中所列出的数据子集。默认值是false。
android:exported——指定该内容提供器是否能够被其他的应用程序组件使用。如果设置为true,则可以被使用;如果设置为false,该提供器只对同名的应用程序或有相同用户ID的应用程序有效。默认值是true。虽然能够使用这个属性来公开内容提供器,但是依然还要用permission属性来限制对它的访问。
android:multiprocess——用于设定是否能够在每个使用该内容提供器的客户端进程中都创建一个内容提供器的实例,如果设置为true,这个能够在其每个客户端进程中创建一个实例,否则不可以。默认值是false。通常,内容提供器是在定义它的应用程序的进程中被实例化的。但是,如果这个属性被设置为true,系统就能够在每个要与该内容提供器进行交互的客户端进程中创建一个内容提供器的实例,这样就避免了进程间通信的开销。
android:permission——用于设定客户端在读写内容提供器的数据时必须要有的权限的名称。这个属性为同时设置读写权限提供了一种便利的方法。但是readPermission和writePermission属性的优先级要比这个属性高。如果readPermission属性也被设置了,那么它就会控制对内容提供器的查询访问。如果writePermission属性被设置,它就会控制对内容提供器数据的修改访问
android:readPermission——用于设置查询内容提供器的数据时,客户端所必须要有的权限。
android:writePermission——用于设置修改内容提供器的数据时,客户端所必须要有的权限。



meta-data——被包含于组件:activity,activity-alias,service,receiver,application,provider等中。用name- value对的格式给其父组件提供任意可选的数据。一个组件元素能够包含任意多个meta-data子元素,所有这些元素中定义的值会被 收集到一个Bundle对象中,并且提供给组件的PackageItemInfo.metaData属性字段。值是通过其value属性来指定的。但是,也可以使用resource属性来代替,把一个资源ID跟值进行关联。
android:name——唯一名称。使用Java样式的命名规则,可以确保名称的唯一性。
android:value——给这个元素分配一个值。可能分配的数据的数据类型已经通过Bundle对象可获取该值的方法:字符串—getString(),整型—getInt(),布尔—getBoolean(),颜色—getString(),浮点—getFloat()。
android:resource——定义了一个要引用的资源。资源的ID会跟这个项目进行关联。通过Bundle.getInt()方法能够从meta-data的Bundle对象中获取这个ID。

你可能感兴趣的:(Android,SystemUI)