移动端--基于Android Studio的项目文件结构
Posted guardianbo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端--基于Android Studio的项目文件结构相关的知识,希望对你有一定的参考价值。
转自【https://www.cnblogs.com/hwb04160011/p/7978816.html】
android基础——项目的文件结构(二)
AndroidManifest.xml文件分析
【注】此项目文件结构仅限于Android Studio下的Android项目!!!
在一个Android项目中,AndroidManifest.xml文件(安卓清单文件)是整个APP的配置文件,它位于文件结构中app文件夹中,相当于根目录。四大组件都需要在AndroidManifest.xml文件中声明才可以使用,APP用到的相关权限都需要在AndroidManifest.xml文件中配置才不会影响使用,可以说AndroidManifest.xml是整个APP的领导者。所谓擒贼先擒王,那我们就最先分析一下AndroidManifest.xml文件的结构。
一、大致结构
<?xml version="1.0" encoding="utf-8"?> <manifest> <uses-configuration/> <uses-feature/> <uses-permission/> <permission/> <supports-screens/> <application>
<activity>
<intent-filter>
<action/>
<category/>
</intent-filter>
</activity>
<activity-alias> <intent-filter></intent-filter> <meta-data/> </activity-alias>
<service> <intent-filter></intent-filter> <meta-data/> </service>
<receiver> <intent-filter></intent-filter> <meta-data/> </receiver>
<provider> <grant-uri-permission/> <meta-data/> </provider>
<uses-library/>
</application> </manifest>
二、详细分析
首句<?xml version="1.0" encoding="utf-8"?>,用于定义xml文件版本及编码格式。
1、<manifest></manifest>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="string" android:sharedUserId="string" android:sharedUserLabel="string" android:versionCode="int" android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
(1)xmlns:android
Android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
(2)package
指定项目中java主程序包的包名,在项目建立时定义的一个路径,位于app/src/main/java/,是该APP安装运行后进程及数据包的默认名称,一般为公司域名.项目名。
(3)sharedUserId
表明数据权限,默认情况下,Android给每个APP分配一个唯一的UserID,默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二可以采用sharedUserId,将不同APP的sharedUserId都设为一样,这些APP之间就可以互相共享数据,为String类型数据。
(4)sharedUserLabel
共享数据的用户名,只有在设置了sharedUserId属性的前提下才会有意义,为String类型数据。
(5)versionCode
版本号,是APP升级更新的依据,必须是一个int值代表APP是第几个版本,比如APP刚上线时为1,之后若要更新版本就改为上个版本号+1。
(6)versionName
版本名称是给用户看的,一般将APP版本名称设置为x.x.x的格式,第一位是重大更新修改功能时+1,第二位是修复bug时+1,第三位是数据更新或者样式小改动时+1。
(7)installLocation
安装位置,Android2.2之后启用,有三个值可以选择:internalOnly(只能安装至内部存储)、preferExternal(优先安装至扩展存储即SD卡)、auto(系统自动选择)。
2、<application></application>
在这个标签中可以配置整个应用程序的相关属性。
<application android:allowClearUserData=["true" | "false"] android:allowTaskReparenting=["true" | "false"] android:backupAgent="string" android:debuggable=["true" | "false"] android:description="string" android:enabled=["true" | "false"] android:hasCode=["true" | "false"] android:icon="string" android:killAfterRestore=["true" | "false"] android:label="string" android:manageSpaceActivity="string" android:name="string" android:permission="string" android:persistent=["true" | "false"] android:process="string" android:restoreAnyVersion=["true" | "false"] android:taskAffinity="string" android:theme="string" > </application>
(1)android:allowClearUserData(‘true’ or ‘false’)
用户是否能选择清除数据,默认为true,系统的应用管理器中包含一个清除数据的按钮,当android:allowClearUserData的值为true时,用户可以清除数据。
(2)android:allowTaskReparenting(‘true’ or ‘false’)
配置是否允许activity更换从属task,当android:allowTaskReparenting的值为true时,启动新task的activity会成为该task的一部分。
(3)android:backupAgent
自Android2.2启用,设置APP的备份,属性值是包名.类名,可以将数据备份到云端,并且还需实现BackupAgent或者BackupAgentHelper的子类才可进行备份。
(4)android:debuggable
配置是否允许在手机上调试,当设置为true时,表明该APP在手机上可以被调试,默认为false,一般都在计算机上远程调试而不是在手机上调试。
(5)android:description/android:label
此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生。
(6)android:enabled
Android系统是否能够实例化该应用程序的组件。如果为true,每个组件的enabled属性决定那个组件是否可以被实例化。如果为false,所有组件都不可以被实例化。
(7)android:hasCode(‘true’ or ‘false’)
表示此APP中的组件是否包含代码,默认为true,若为false,则系统在运行APP中的组件时,不会加载代码(一般四大组件都含有代码)。
(8)android:icon
声明整个APP的图标,属性值一般是drawable或者mipmap文件夹下的资源文件路径。
(9)android:killAfterRestore
应用在系统重置之后是否终止运行。某个APP的重置操作不会导致应用被关闭,系统的重置操作完成后会使该属性值为true的应用终止运行,默认值为true。第三方应用一般不需要修改这个属性。
(10)android:manageSpaceActivity
设置实例化activity子类的限定名称,系统可以启动这个子类让用户管理APP在设备上的内存占用。
(11)android:name
为应用程序所实现的Application子类的全名,即包名.项目名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
(12)android:permission
设置许可名,给应用程序的所有组件设置许可的便捷方式,也可以被各组件设置的许可名所覆盖。
(13)android:presistent
该应用程序是否应该在任何时候都保持运行状态,默认为false。应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才有意义。
(14)android:process
应用程序运行的进程名,默认值为包名,每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是它们共享一个用户ID及被赋予了相同证书。
(15)android:restoreAnyVersion
自android2.2启用,表明应用是否准备尝试恢复所有的备份,即使是版本不匹配而可能导致数据不兼容,默认是false。
(16)android:taskAffinity
拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity值是包名。
(17)android:theme
APP主题配置,它定义了一个默认的主题风格给所有的activity,系统中内置很多的主题可以进行选择,也可以自定义一个theme。
3、<activity></activity>
activity是Android应用程序四大组件之一,此标签声明了一个activity,并对该activity进行属性配置。
<activity android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:clearTaskOnLaunch=["true" | "false"] android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "orientation", "screenLayout", "fontScale", "uiMode"] android:enabled=["true" | "false"] android:excludeFromRecents=["true" | "false"] android:exported=["true" | "false"] android:finishOnTaskLaunch=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"] android:multiprocess=["true" | "false"] android:name="string" android:noHistory=["true" | "false"] android:permission="string" android:process="string" android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nosensor"] android:stateNotNeeded=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] >
<intent-filter>
<action/>
<category/>
<data/>
</intent-filter>
</activity>
(1)android:alwaysRetainTaskState
是否保留状态不变,比如切换回home, 再重新打开,activity处于最后的状态。比如一个浏览器打开很多页面,用户并不希望丢失这些页面时,可将此属性设置为true。
(2)android:clearTaskOnLaunch
启动时是否清除task中非MAIN activity,默认值为false,只可以配置在MAIN activity中,当该属性值为true时,程序运行中按下home键回到桌面后,再进入应用程序时显示MAIN activity。
(3)android:configChanges
指定的属性发生时,activity不销毁重建,并执行onConfigurationChanged()方法。未配置该属性的情况下,发生屏幕旋转等影响activity显示的变化时,activity将被销毁重建。
(4)android:excludeFromRecents
是否显示在最近打开的activity列表里,默认是false。
(5)android:finishOnTaskLaunch
启动时是否关闭已打开的activity,默认是false,当该属性值为true时,程序运行中按下home键回到桌面后,再进入应用程序时将销毁所有activity,重新打开MAIN activity。
(6)android:launchMode
Activity有四种加载模式:
standard、singleTop、singleTask、singleInstance,默认为standard。
standard:每次跳转到一个activity时都会构造新的activity实例。
singleTop:每次跳转到一个activity时,先判断目标activity是否位于栈顶,若位于栈顶则不会构造新的activity实例,否则构造新的activity实例。
singleTask:每个activity只创建一个实例,跳转activity时先检查栈内是否有目标activity,若有则显示该activity并将该activity置于栈顶,否则构造新的activity实例。
singleInstance:配置该模式的activity只创建一个实例,在启动时将会进入一个新的栈,一般常被其他应用程序调用的activity会配置该模式,如支付宝付款时显示的活动。
(7)android:multiprocess
设置activity能否被实例化到启动它的进程栈中,默认为false。通常,一个activity实例会被加载到定义它的应用程序的进程中。
(8)android:noHistory
当用户从activity上离开并且它在屏幕上不再可见时,activity是否从栈中清除并销毁,默认值为false。
(9)android:screenOrientation
activity显示的模式,默认为unspecified:由系统自动判断显示方向。
landscape:横屏模式,宽度比高度大。
portrait:竖屏模式, 高度比宽度大。
user:用户当前首选的方向。
behind:和栈中位于该activity下面的那个Activity方向一致。
sensor:由重力感应器来决定,用户旋转设备时屏幕会在横竖屏中切换。
nosensor:忽略重力感应器,屏幕方向不会随着用户旋转设备而更改。
(10)android:stateNotNeeded
activity被意外销毁或者重启时是否不再保持状态,默认情况为false,若设为true,则当activity在后台被系统意外销毁或重新启动时不会调用onSaveInstanceState()方法。
(11)android:windowSoftInputMode
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题。这个属性能影响两件事情:当有焦点产生时,软键盘是隐藏还是显示;是否减少活动主窗口大小以便腾出空间放软键盘。各值的含义:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置。
stateUnchanged:当这个activity出现时,软键盘将保持在上一个activity里的状态。
stateHidden:用户选择activity时,软键盘总是被隐藏。
stateAlwaysHidden:当该activity主窗口获取焦点时,软键盘总是被隐藏。
stateVisible:软键盘总是可见的。
stateAlwaysVisible:用户选择activity时,软键盘总是显示。
adjustUnspecified:默认设置,由系统自行决定是隐藏还是显示。
adjustResize:该activity总是调整屏幕的大小以便留出软键盘的空间。
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。
(12)<intent-filter></intent-filter>
<intent-filter android:icon="drawable resource" android:label="string resource" android:priority="integer" > <action /> <category /> <data /> </intent-filter>
android:priority:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高。
action:只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。
Action常量 | 对应字符串 | 简单说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 显示指定数据 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指定某块数据将被附加到其他地方 |
ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
ACTION_PICK | android.intent.action.PICK | 从列表中选择某项并返回所选的数据 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 让用户选择数据,并返回所选数据 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_CALL | android.intent.action.CALL | 直接向指定用户打电话 |
ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送消息 |
ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 执行数据同步 |
ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 用于选择Activity |
ACTION_SEARCH | android.intent.action.SEARCH | 执行搜索 |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | 执行Web搜索 |
ACTION_BATTERY_LOW | android.intent.action.ACTION_BATTERY_LOW | 电量低 |
ACTION_MEDIA_BUTTON | android.intent.action.ACTION_MEDIA_BUTTON | 按下媒体按钮 |
ACTION_PACKAGE_ADDED | android.intent.action.ACTION_PACKAGE_ADDED | 添加包 |
ACTION_PACKAGE_REMOVED | android.intent.action.ACTION_PACKAGE_REMOVED | 删除包 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
ACTION_BOOT_COMPLETED | android.intent.action.BOOT_COMPLETED | 系统启动完成 |
ACTION_TIME_CHANGED | android.intent.action.ACTION_TIME_CHANGED | 时间改变 |
ACITON_DATE_CHANGED | android.intent.action.ACTION_DATE_CHANGED | 日期改变 |
ACTION_TIMEZONE_CHANGED | android.intent.action.ACTION_TIMEZONE_CHANGED | 时区改变 |
ACTION_MEDIA_EJECT | android.intent.action.MEDIA_EJECT | 插入或拔出外部媒体 |
category:只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER,决定应用程序是否显示在程序列表里。
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该Activity能被浏览器安全调用 |
CATEGORY_TAB | android.intent.category.TAB | 指定该Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | Activity显示顶级程序列表中 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 该Activity是参数面板 |
CATEGORY_TEST | android.intent.category.TEST | 该Activity是一个测试 |
CATEGORY_CAR_DOCK | android.intent.category.CAR_DOCK | 指定手机被插入汽车底座(硬件)时运行该Activity |
CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机被插入桌面底座(硬件)时运行该Activity |
CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 设置该Activity可在车载环境下使用 |
(13)<meta-data/>
<meta-data android:name="string" android:resource="resource specification" android:value="string"/>
用于标识供父组件使用的键值对,一般情况下使用时只需要在对应的组件下声明name和value,若要提供比较复杂的数据,可以使用android:resource提供该资源的ID。
android:name 元数据项的名字,即键,为了保证键是唯一的,采用java风格的命名规范,如com.project.module.data。
android:value 元数据项的值,可使用string、int、float、boolean类型的数据。
android:resource 元数据项的资源ID值,可使用res文件夹下的图片、xml、文件等。
4、<activity-alias></activity-alias>
activity-alias作为一个已存在activity的别名,则应该可以通过该别名标签声明快速打开目标activity。因此activity-alias可用来设置某个activity的快捷入口,可以放在桌面上或者通过该别名被其他组件快速调起。该标签元素支持一些属性及intent-filter、meta-data等配置,因此可以触发一些跟目标activity不同的功能逻辑,虽然打开的是同一个activity。
<activity-alias android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:targetActivity="string" >
<intent-filter></intent-filter>
<meta-data/>
</activity-alias>
(1)android:enable
该属性用来决定目标Activity可否通过别名被系统实例化,默认为true。需要注意的是application也有enable属性,只用当它们同时为true时,activity-alias的enable才生效。
(2)android:exported
该属性为true的话,则目标Activity可被其他应用调起,如为false则只能被应用自身调起。其默认值根据activity-alias是否包含intent-filter元素决定,如果有的话,则默认为true;没有的话则为false。如果有intent-filter,则目标Activity可以匹配隐式Intent,因此可被外部应用唤起;如果没有intent-filter,则目标Activity要被调起的话必须知道其精确类名,因为只有应用本身才知道精确类名,所以此时默认为false。
(3)android:icon
允许自定义icon,可以不同于应用本身在桌面的icon。如果需要在桌面上创建快捷入口,也许产品会要求换个不同的icon。
(4)android:label
该属性类似于android:icon,图标都换了,换个名称也合情合理吧,此属性就是为此而生的。
(5)android:name
该属性可以为任意字符串,但最好符合类名命名规范。activity元素的name属性实质上都会指向一个具体的Activity类,而activity-alias的name属性仅作为一个唯一标识而已。
(6)android:permission
该属性指明了通过别名声明调起目标Activity所必需的权限。
(7)android:targetActivity
该属性指定了目标activity,即通过activity-alias调起的activity是哪个,此属性其实类似于activity标签中的name属性,需要规范的包名.类名。
5、<service></service>
<service android:enabled=["true" | "false"] android:exported[="true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string">
<intent-filter></intent-filter>
<meta-data/>
</service>
各属性与activity-alias含义相同,参考其解释即可
6、<receiver></receiver>
<receiver android:enabled=["true" | "false"] android:exported[="true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string">
<intent-filter></intent-filter>
<meta-data>
</receiver>
各属性与activity-alias含义相同,参考其解释即可
7、<provider></provider>
<provider android:authorities="list" android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string">
<grant-uri-permission/>
<meta-data/>
</provider>
(1)android:authorities
标识内容提供器范围内的数据URI的授权列表,有多个授权时,要用分号来分离每个授权。为了避免冲突,授权名应该使用包名.类名。
(2)android:grantUriPermissions
是否能临时超越readPermission、writePermission和permission属性的限制,给平常无权对Content Provider数据的访问进行授权,true可以授权,false不可以。如果设为true,则可对Content Provider的所有数据进行授权访问。如果设为false,那就只能对<grant-uri-permission>子元素中列出的数据子集(假如存在的话)进行授权。默认值是false。
(3)android:initOrder
对于处在同一进程中的不同content provider来说,该属性值代表了不同content provider之间的初始化顺序。当不同的content provider之间有相互依赖时,设置该属性之后,可以确保相互依赖的content provider被按照一定的顺序创建。该属性的值为整数,并且数值越大优先级越高。
(4)<grant-uri-permission/>
<grant-uri-permission android:path="string" android:pathPattern="string" android:pathPrefix="string" />
这个元素用于给内容提供器的数据子集授权。数据子集是由content:URI的路径部分来标识的。授权是提供器给客户端提供的一种能力,这样客户就可以访问通常没有权限访问的数据,从而克服基于单次访问的限制。如果内容提供器的grantUriPermissions属性被设置为true,那么权限能够被授予内容提供器范围内的任何数据。但是,如果grantUriPermission属性被设置为false,那么权限就只能授予这个元素所指定的数据子集。一个内容提供器能够包含任意多个个<grant-uri-permission>元素。每个都只能指定一个路径(三个可能属性中的一个)。
path属性指定了一个完整的路径,权限只能被授予这个路径所标识的具体的数据子集。pathPrefix属性指定了路径的初始部分,权限能够被授予共享这个初始路径的所有数据子集。pathPattern属性指定了一个完整的路径,但是这个路径中包含了通配符。
8、<uses-library/>
<uses-library android:name="string" android:required=["true" | "false"] />
这个元素用于指定该应用程序必须链接的共享类库。这个元素告诉系统该应用程序包的类装载器中所包含的类库代码。Android的所有包(如andorid.app,android.content,android.view和android.widget等)都在应用程序自动链接的默认类库中。但是,有些包是在于独立的类库中,它们不能被自动的链接到应用程序包中,要查看这些包的文档,以确定要把哪些类库包含到包的代码中。如果在该应用的清单中出现这个元素,并且它的android:required属性被设置为true,那么除非该类库在用户的设备上存在,否则PackageManager框架不会让用户安装这个应用程序。
(1)android:name
这个属性用于指定类库的名称。这个名称是在对应的类库文档中提供的。例如:android.test.runner库就是包含Android测试类的一个程序包。
(2)android:required
这个属性用于指定应用程序是否需要有android:name属性所指定的类库,默认值是true。
true:没有这个库应用程序无法工作。如果用户设备设备上没有这个类库,系统不允许该应用程序安装在这个设备上。
false:如果该类库存在,则应用程序能够使用这个类库,但是如果有必要,也可以设计成没有该类库,应用程序也能够工作。系统会允许应用程序安装,即使该类库不存在。如果使用false,就要在运行时对类库的有效性进行必要的检查。对于类库的检查,可以使用反射机制来判断一个具体的类是否有效。默认值是true。
9、<uses-configuration/>和<uses-feature/>
<uses-configuration android:reqFiveWayNav=["true" | "false"] android:reqHardKeyboard=["true" | "false"] android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"] android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"] android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] /> <uses-feature android:glEsVersion="integer" android:name="string" android:required=["true" | "false"] />
两个标签都指明应用程序的软硬件需求。
【<uses-configuration/>标签的声明会给Android系统提供依据,判断本设备是否可以运行该应用程序并决定是否安装该应用程序。】
(1)android:reqFiveWayNav
应用程序是否需要五维导航键:“true”使用,“false”不使用。五维控制键可以实现上下左右移动及提交当前选中项,可以是 D-pad(方向键)、轨迹球或其他设备。如果应用程序需要用到方向键,但不指定是哪种设备,则可以将本属性设为“true”并忽略 reqNavigation 属性。但如果需要某个指定类型的方向键,那么可以忽略本属性并换用 reqNavigation 。
(2)android:reqHardKeyboard
应用程序是否需要用到硬件键盘:“true”使用,“false”不使用。android:reqKeyboardType当存在键盘时,应用程序需要用到的键盘类型。本属性不区分硬键盘和软键盘。如果需要指定某种类型的硬件键盘,请设置本属性并同时将 reqHardKeyboard 属性设为“true”。本属性值必须是以下字符串之一:
值 | 说明 |
---|---|
"undefined" | 应用程序不需要使用键盘(未声明键盘需求。)这是默认值。 |
"nokeys" | 应用程序不需要使用键盘。 |
"qwerty" | 应用程序需要用到标准的 QWERTY 键盘。 |
"twelvekey" | 应用程序需要用到大多数电话附带的 12 键数字键盘 — 包括数字键 0-9、星号(*)、井号(#)键。 |
(3)android:reqNavigation
当设备存在时,应用程序需要用到的导航设备。如果应用程序需要用到导航键,但无所谓是哪种确切的类型,那就可以将 reqFiveWayNav 属性设为“true”,以取代本属性。本属性值必须是以下字符串之一:
值 | 说明 |
---|---|
"undefined" | 应用程序不需要使用导航键。(未声明导航键需求。)这是默认值。 |
"nonav" | 应用程序不需要使用导航键。 |
"dpad" | 应用程序需要使用 D-pad (方向键)进行导航。 |
"trackball" | 应用程序需要使用轨迹球进行导航。 |
"wheel" | 应用程序需要用到导航拨轮。 |
(4)android:reqTouchScreen
当设备存在时,应用程序需要用到的触摸屏类型。本属性值必须是以下字符串之一:
值 | 说明 |
---|---|
"undefined" | 应用程序不需要使用触摸屏。(未声明触摸屏需求。)这是默认值。 |
"notouch" | 应用程序不需要使用触摸屏。 |
"stylus" | 应用程序需要用到触笔操作的触摸屏。 |
"finger" | 应用程序需要用到手指操作的触摸屏。
注意: 如果应用程序需要用到某种类型的触摸屏输入手段,请换用 < uses-feature > 声明触摸屏的类型需求,以"android.hardware.faketouch" 开头的为基本型触摸事件。 |
【<uses-feature/> 标签的声明仅仅是告知性质的,这意味着 Android 系统本身不会在安装程序前检查设备是否支持这些特性。】
不过,其他服务(如Google Play)或者其他应用程序可以检查<uses-feature>声明来进行相应处理或与本应用程序进行交互。
(1)android:name
定义一项应用程序需要用到的软、硬件特性,用字符串格式的描述符表示。合法的描述符值在下文的硬件特性和软件特性表中列出。这些描述符是大小写敏感的。android:required布尔值,指明应用程序是否需要用到 android:name 属性给出的特性。如果对某项特性声明了“android:required="true"”,则表示当设备不提供指定特性时,应用程序就不能正常运行或未设计为能够正常运行。如果对某项特性声明了“android:required="false"”,则意味着如果设备支持则应用程序将优先使用此特性,但设计程序时是考虑没有该项特性也能正常工作的。如未明确给出声明,则android:required 的默认值是“true”。
(2)android:glEsVersion
应用程序需要的OpenGL ES版本。高16位代表大版本号,低16位代表小版本号。例如:要指定为OpenGL ES 2.0,应该设为“0x00020000”;要指定为OpenGL ES 2.1,应该设为“0x00020001”;要指定为OpenGL ES 3.0,则应该设为“0x00030000”。应用程序应该在androidManifest.xml中至少定义一项android:glEsVersion属性。如果定义了两项以上的android:glEsVersion,将会采用数字最大的那个值,其他值将被忽略。
10、<uses-permission/>和<permission/>
<uses-permission android:name="string" /> <permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序、系统或者用户带来负面影响的操作。如果应用需要执行某些操作,就需要声明使用这个操作对应的权限。上述两个标签都用来声明应用程序需要的权限。
【<uses-permission/>标签所声明的权限是系统已经定义好的权限,只需要提供一个权限名即可】
android系统提供了一系列这样的权限,具体可以查看android 权限,另外,android系统在新的版本中会增加一些permission,可以查看android 版本信息。链接请FQ
【<permission/>标签是自定义一个权限】
(1)android:description
对权限的描述,一般是两句话,第一句话描述这个权限所针对的操作,第二句话告诉用户授予app这个权限会带来的后果 android:label: 对权限的一个简短描述
(2)android:name
权限的唯一标识,一般都是使用 报名加权限名
(3)android:permissionGroup
权限所属权限组的名称
(4)android:protectionLevel
权限的等级。normal 是最低的等级,声明次权限的app,系统会默认授予次权限,不会提示用户 。dangerous 权限对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户。signature 权限表明的操作只针对使用同一个证书签名的app开放。signatureOrSystem 与signature类似,只是增加了rom中自带的app的声明。
11、<supports-screens/>
<supports-screens android:smallScreens=["true" | "false"] android:normalScreens=["true" | "false"] android:largeScreens=["true" | "false"] android:xlargeScreens=["true" | "false"] android:anyDensity=["true" | "false"] android:requiresSmallestWidthDp="integer" android:compatibleWidthLimitDp="integer" android:largestWidthLimitDp="integer"/ >
以上是关于移动端--基于Android Studio的项目文件结构的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio+百度地图API实现简单gis移动端App
Vite + Vue3 项目中,使用 vw/vh 适配移动端,并通过 Android Studio 打包