Android清单文件详解(五)----<application>的属性详解(二)

简介: Android清单文件详解(五)----<application>的属性详解(二)

8.android:hasCode


该属性表明应用程序是否含有代码,若其值为true,表示应用程序含有代码,false则表示其中没有代码。该属性的默认值是true。当其值是false时,加载组件时系统不会尝试加载任何应用程序的代码。应用程序一般没有它自己的任何代码,除非它仅是由组件类构建而成的,比如Activity使用AliasActivity类,但这很少发生。


hasCode作为一个标志,被集成到包信息的flags标志中,以此来作为操作应用程序的参数,示例代码如下所示:

if(sa.getBoolean(com.android.internal.R.sytleable.AndroidManifest
Application_hasCode,true)){
ai.flags|=ApplicationInfo.FLAG_HAS_CODE;
}


从以上代码片段可以看出,这个标志被合到ai.flags的第3位上。


9.android:hardwareAccelerated


android:hardwareAccelerated标志指示硬件加速渲染功能是否对应用程序中的所有Activity和View启用,如果启用,则为true,否则为false,其默认值是false。


从Android 3.0开始,硬件加速的OpenGL渲染器对所有应用程序都有效,这样做的目的是改善大多数2D图形操作的性能。当硬件加速渲染器被启用时,大多数操作(包括Canvas,Paint,Xfermode,ColorFilter,Shader和Camera)都会被加速,这样产生的结果是更顺滑的动画效果,更顺滑的滚动效果以及整体响应的改进。即使对于那些不能明确使用OpenGL库的应用程序,其结果也一样。


需要注意的是,不是所有的OpenGL操作都是被加速的。如果启用硬件加速渲染器,就要先测试应用程序以便确保它可以无误地使用渲染器。


对于Android框架来说,这个标志是这样被打包成信息的:

boolean hardwareAccelerated=sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated,
owner.applicationInfo.targetSdkVersion>=Build.VERSION_CODES.ICE_CREAM_SANDWICH);
.......
if(!receiver){
if(sa.getBoolean(com.android.internal.R.styleable.AndroidManifest
Activity_hardwareAccelerated,hardwareAccelerated)){
a.info.flags|=ActivityInfo.FLAG_HARDWARE_ACCELERATED;
}
.......
}else{
......
}


当没有设置这个标志的时候,它的默认值取决于是否配置了android:targetSdkVersion。如果没有配置,则Android默认将android:targetSdkVersion作为当前设备系统的SDK版本。当android:targetSdkVersion属性的值大于或者等于当前系统版本时,则启用硬件加速,反之则禁用硬件加速。


下面我们结合源代码路径/frameworks/base/core/java/androdi/app/Acti-vity.java,再来看看在Activity附加到窗口之前是如何使用这个标志的,代码如下所示:

final vodi attach(Context context,ActivityThread aThread,Instrumentation instr,IBinder token,int ident,
Application application,Intent intent,ActivityInfo info,CharSequence title,Activity parent,String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config){
.....
mWindow.setWindowManager(null,mToken,mComponent,flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED)!=0)
}


建议: 如果不打算设置hardwareAccelerated标志,则尽量配置<uses-sdk>节点,代码如下所示:

<uses-sdk android:targetSdkVersion="15">


10.android:label / android:icon


android:label和android:icon这两个属性分别是有关标签和图标的。先来看看android:label,它是Android标签属性,是应用程序全局的一个用户可读的标签,也是该应用程序所有组件的默认标签。在项目生成的时候,就已经定义了该属性,它可以是一个字符串资源的引用,也可以是一个字符串。能这么做的原因是该标签是这样定义的:


<attr name="label" format="reference|string">


此处,建议尽可以使用字符串资源的引用形式,因为这样可以更好地支持国际化特性。在应用程序标签被定义之后,它就会在诸如应用程序菜单,设置的应用程序信息等位置被使用,如下图的位置:


67.png

 

在上图,我们盾到红色方框部分就是设置该属性的效果图。


接下来,我们再来看看另一个属性android:icon,它是应用程序全局的一个图标,也是该应用程序所有组件的默认图标。这个属性在Android框架中是这样定义的:


<attr name="icon" format="reference">


可以看到,这里只能配置图片资源的引用,例如@drawable/icon。当我们配置了这个属性之后,它就会在应用程序菜单,设置的应用程序列表以及设置的应用程序详情界面中显示出来,通俗的说,就是应用程序图标。


11.android:logo


android:logo属性用于配置应用程序的商标。自Android3.0以后,应用程序窗口多了一个标题栏,而应用程序的logo将会出现在那里。对于Android框架而言,它是这样定义这个属性的:


<attr name="logo" format="reference">


这说明它能接受的只是一个图片资源的引用。配置这个属性后运行程序,会发现在启动的每一个界面上都会看到这个图标,如果同时设置了logo,icon,logo会覆盖掉icon的图标。


12.android:manageSpaceActivity


该属性是一个Activity子类的全名,用户使用它可以管理设备上该应用程序占有的内存。Activity也应该用<activity>元素声明。


13.android:permission


该属性是客户端与应用程序交互所必须拥有的许可名,它是给应用程序的所有组件设置许可的便捷方式,可以被组件各自的许可属性值所覆盖。


14.android:persistent


该属性用来表明应用程序是否应该在任何时候都保持运行状态,若为true,则表示应该,false则表示不应该,其默认值为false。通常,应用程序不应该设置本属性,而持续模式仅仅对于某些系统应用程序才有意义。


在实际应用中就存在这样的例子,例如电话模块,它在系统启动的时候就处于运行状态,这样电话状态发生变化时就会在系统产生相应的变化。如下面代码所示:

<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/phoneAppLabel"
android:icon="@drawable/ic_launcher_phone"
.....
</applicaiton>


15.android:process


该属性是应用程序所有组件运行的进程名。每个组件都能够设置自己的进程属性,以此来覆盖原来的默认值。


该属性的默认值是当前的应用程序包名。当应用程序的第一个组件需要运行时,Android:就生成一个进程,所有的组件都将在该进程里运行。默认情况下,进程名与<manifest>元素里设置的包名相匹配。


该属性设置为一个与其他应用程序共享的进程名,就可以将两个应用程序的组件说运行在相同的进程里。能这样做的前提是仅在两个应用程序共享一个用户ID并且被赋予相同证书时。


如果该属性里设置的名字以冒号开头(:),那么在需要的时候它将生成该应用程序的一个私有新进程。如果进程名以小写字母开头,则生成以该进程名命名的一个全局进程。全局进程可以用来与其他应用程序分享,以便降低资源消耗。


如果配置下面的代码到新建的项目ApplicationTest里面,代码如下:


android:process=":jinggege"


会得到如下图所示的结果:


68.png


如上图所示,就是一个包名加上上面配置的属性。


16.android:taskAffinity


它是应用程序所有Activity都适用的任务亲和力,除了那些将不同任务亲和力设置在自身taskAffinity属性里的Activity。我们可以这样理解这个属性:该Activity更喜欢待在哪个任务中。


对于不同版本的Android SDK来说,框架对该属性的处理是不一样的。下面的代码说明了还同处理中出现的一些问题:

if(owner.applicationInfo.targetSdkVersion>=Build.VERSION_CODES.FROYO){
str=sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity,0);
}else{
str=sa.getNonConfigurationString(com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
}
ai.taskAffinity=buildTaskAffinityName(ai.packageName,ai.packageName,str,outError);


对于Android 2.2(Froyo)以后的版本,如果没有设置这个属性,则会采用默认值0,而之前的版本则不会提供默认值。


17.android:theme


android:theme属性为应用程序定义了一个整体风格。当开发一个商业应用程序时,风格是要考虑的重要因素之一。因此,为了保证应用程序的所有界面保持一定的风格标准,要尽量使用这个属性为应用程序定义风格。


android:theme属性是一个可以覆盖的属性。当我们需要对某个界面做一些特殊的处理时,只需要在对应的节点配置此属性,就可以覆盖掉应用程序配置的整体风格了。


对于框架而言,该属性不是必须配置的。如果没有配置,Android则会认为它的值为0,即无资源,如下代码所示:


ai.theme=sa.getResourceId(com.android.internal.R.styleable.AndroidManifestApplication_theme,0);


如果在<application>的某个子节点上配置了这个属性,那么框架将会覆盖整体风格而使用子节点上配置的风格:


a.info.theme=sa.getResource(com.android.internal.R.styleable.AndroidManifestActivity_theme,0);


现在我们举例说明如何使用这个属性。例如,给<application>节点增加android:theme属性,它的值指向Animation.Dialog的风格。相关代码如下:


android:theme="@android:style/Animation.Dialog"


需要注意的是,这里的@android:style表示此资源位于“android”的空间中,也就是SDK预定义的那些资源。


刚刚说到增加的theme属性指向Animation.Dialog风格,其中风格是这样定义的:


<style name="Animation.Dialog">
<item name=""windowEnterAnimation>@anim/dialog_enter</item>
<item name="windowExitAnimation">@anim/dialog_exit</item>
</style>


这里规定了进入和推出的动画效果。


除了使用SDK提供的风格资源以外,我们还可以使用自定义的风格资源,那么如何配置自定义风格呢?,大家可以按照下面的操作步骤自己动手实现。


①定义自己的风格资源。在工程res/value/目录下新建你的application_style.xml文件。


②打开刚刚创建的文件,加入如下代码:


<?xml version="1.0" encoding="utf-8"?>
 <resources>
     <style name="myTheme">
     </style>
 </resources>
相关文章
|
1月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
283 1
|
5月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
1月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
119 0
|
3月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
132 1
|
3月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
118 0
|
3月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
60 0
|
5月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
5月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
6月前
|
Android开发
【苹果安卓通用】xlsx 和 vCard 文件转换器,txt转vCard文件格式,CSV转 vCard格式,如何批量号码导入手机通讯录,一篇文章说全
本文介绍了如何快速将批量号码导入手机通讯录,适用于企业客户管理、营销团队、活动组织、团队协作和新员工入职等场景。步骤包括:1) 下载软件,提供腾讯云盘和百度网盘链接;2) 打开软件,复制粘贴号码并进行加载预览和制作文件;3) 将制作好的文件通过QQ或微信发送至手机,然后按苹果、安卓或鸿蒙系统的指示导入。整个过程简便快捷,可在1分钟内完成。
159 6
下一篇
无影云桌面