《Android程序设计》一3.4 静态应用资源和上下文

简介: 本节书摘来自华章出版社《Android程序设计》一 书中的第3章,第3.4节,作者:G. Blake Meike, Masumi Nakamura,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4 静态应用资源和上下文

应用可能需要存储大量的数据来控制其运行时的行为。其中有些数据描述了应用环境:应用名称、注册的intent和需要的许可条件等。这些数据存储在名为manifest的文件中。其他的数据也可能是要显示的图片或简单的文本字符串,以指出要使用什么样的背景颜色或字体。这些数据称为resources。所有这些信息一起构成了应用的context(上下文),在Android中对这些信息进行访问需要借助于类Context。类Activity和类Service都是对类Context的扩展,这意味着所有的activity和service都可以通过该指针访问Context类型的数据。在后续的章节中,还将描述如何使用Context对象在运行时访问应用的资源。

3.4.1 应用的清单文件

Android要求应用在XML文件AndroidManifest.xml中显式地描述其内容。在AndroidManifest.xml文件中,应用对内容提供者、服务、需要的权限及其他元素进行声明。应用上下文会准备好这些数据,使之在Android运行时中可用。清单文件把Android应用组织成了定义良好的结构,这个结构所有应用都必须遵守,Android操作系统由此可以在可管理的环境中加载并执行这些应用。这个结构由一个通用的目录布局和目录中一组通用的文件类型组成。
可以看到,Android应用的四个组件(Activity、Service、ContentProvider和BroadcastReceiver)奠定了Android应用开发的基础(如图3-4所示)。要使用其中任何一个组件,Android应用都必须在其AndroidManifest.xml文件中包含相应的声明。
Application类
Android的第5个组件是Application类。但是很多Android应用没有继承类Application。因为在大多数情况下,继承类Application是不必要的,Android项目向导(project wizard)不会自动创建类Application。

screenshot

3.4.2 一种典型的源代码组织形式

几乎所有Android应用的源代码都是使用下面的这种目录结构

下面将介绍res目录在使得应用的数据可以通过Context对象来访问中所起的重要作用。

3.4.3 初始化AndroidManifest.xml文件中的参数

下面这段代码就是在第1章中介绍的test应用的Android清单文件。test应用的功能只是显示Android应用的基础布局。它的清单文件中包含了之前讨论过的一些基础元素

如同所有结构良好的XML文件一样,该文件的第1行是标准的XML版本声明和使用的字符编码,然后定义了一些参数并声明了整个应用所需要的权限。下面这个列表总结并介绍了用到的标签:
manifest
package="com.oreilly.demo.pa.ch01.testapp"
应用组件所在的默认包。
android:versionCode
这是一个整数,指应用的版本号。每个应用都应该包含一个版本号,而且发布给用户的版本号应该总是递增的。通过这种方式,其他程序(如Android Market、安装包和启动包)能够很容易地根据版本号判断出哪个版本更新一些。.apk文件的文件名中应该包含这个版本号,这样可以很清楚地知道这个文件中包含的是哪个版本。
android:versionName
它是一个字符串,跟我们通常看到的应用的版本号更像一些,如1.0.3。这个字符串就是展示给用户的版本号(根据你的应用,或者根据其他应用)。命名规则可以自己定,但是一般来说,采用的是类似m.n.o这样的机制(可以使用任意个数字表示)来识别应用的连续变化级别。
uses-permission android:name=...
在TestApp manifest文件中,有4个声明描述了应用希望使用的Android特征,需要得到运行该应用的设备的用户的显式许可。当安装应用时,会要求输入许可。然后,Android会记住用户认为可以(或不可以)运行该应用,允许访问安全特征。在Android中定义了很多许可,所有许可都在Android文档中有描述(搜索android.Manifest.permission)。此外,还可以定义自己的许可,并使用它们来限制其他应用对你的应用中的功能的访问,除非用户对其他应用赋予该权限。例如,通常需要开通如下权限:
ACCESS_FINE_LOCATION
需要从GPS传感器获取地理位置信息。
CALL_PHONE
允许来自用户的电话呼叫。
ACCESS_MOCK_LOCATION
当在模拟器中运行时,允许获取伪位置信息。
INTERNET
允许建立互联网连接来检索数据。
application
label
应用的可读标签。
icon="@drawable/icon"
PNG文件的文件名包含你想要用于应用的图标(icon)。在这个例子中,告诉Android SDK查找TestApp应用中res(resource)目录的子目录下的图标文件。在Android Desktop(桌面)应用中,Android将为应用使用该图标。
activity
现在,我们一起来看一下TestActivity的定义,首先一起来定义一些属性,其中最重要的属性如下:
android:name
Activity类名称,activity的全名包括包名(该应用的包名是com.oreilly.demo.pa.ch01 .testapp),但是由于该文件总是在包的名字空间下使用,因此不需要包括包名。可以把名字简化成.TestActivity。实际上,即使是最开头的点(.)也是可有可无的。
android:label
当activity显示在屏幕上时,我们希望在Android屏幕上方显示的内容。在strings.xml文件中定义了和应用匹配的标签。
intent-filter
intent-filter告诉Android什么时候可以运行该Activity。当应用要求Android实现某个Intent时,runtime(运行时)会查看可用的Activity和Service,找到某项可以提供服务的。有两个属性可以设置:
action
一旦runtime确定要运行哪个应用,action会告诉Android如何启动该应用。Android会查找可以解析MAIN action的activity。Launcher启动的任意一个应用都需要有且仅有一个activity或service完成MAIN action解析。
category
Android中的Intent resolver使用该属性进一步限定查找其需要的Intent。因此,前提是我们希望Activity在User菜单中显示,从而用户可以通过选中该Activity来启动应用。指定LAUNCHER可以完成这一点。如果没有category属性,应用也完全可以正常工作——只是你无法从Android桌面启动应用。再次说明,通常情况下,每个应用应该是有且只有一个LAUNCHER,而且它应该和应用的启动Activity在同一个intent filter中。
provider(提供者)
对内容提供者的声明,name是provider类的名字,authorities是内容提供者应该处理的URI权限(URI authority)。URI权限提供了内容提供者URI的域字段,使得Android内容分辨率系统能够定位要处理的某种类型的URI的提供者。在本章后面,将详细说明客户端是如何使用内容提供者的。并且声明了一个名为TestProvider的提供者。
Service(服务)
对应用支持的服务的声明,其中name指定服务对应的类,label为服务提供可读的标签。我们定义了一个名为.TestService的service。
Receiver(接收器)
对应用支持的broadcast receiver的声明,name还是表示接收类,label为接收器提供可读的标签。我们声明了一个名为TestBroadcastReceiver的接收器。

相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1647 4
|
10月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
294 3
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
768 64
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
1124 156
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1024 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
539 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
444 14
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
330 13
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。

热门文章

最新文章