🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
《移动互联网技术》课程简介
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。
课程的教学培养目标如下:
1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。
2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。
3. 培养工程实践能力和创新能力。
通过本课程的学习应达到以下目的:
1.掌握移动互联网的基本概念和原理;
2.掌握移动应用系统的设计原则;
3.掌握Android应用软件的基本编程方法;
4.能正确使用常用的移动应用开发工具和测试工具。
第四章 移动应用开发
本章小结:
1**、本单元学习目的**
掌握Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序。
2**、本单元学习要求**
(1) 掌握移动应用开发框架的结构;
(2) 熟练使用Android应用的开发工具。
3**、本单元学习方法**
结合教材以及Android Studio开发环境,在电脑上进行操作,熟悉教材中介绍的每一个步骤。
4**、本单元重点难点分析**
重点
(1)Android****应用工程的建立
创建第一个Android应用项目,首先设定项目的命名规范。将开发项目划分为个人项目和公司项目两类。个人项目又分为由个人完成和由团队完成两种。项目名称的第一个前缀用来区分个人还是团队,然后依次是团队和个人名称以及模块名称。接下来遵循项目命名规范,构建第一个移动应用工程项目。
打开Android Studio,选择文件(File)菜单的新建项目(New Project),然后输入应用的名称、公司的域名或个人的名称,以及项目存放的位置,如下图所示。单击“下一步(Next)”按钮,进入下一个设置窗口。
在窗口的“minimum SDK”选项中,选择应用支持的最低SDK版本,如下图所示。随后,一步步按照提示操作,创建自己的工程项目。
(2) Android Studio的环境配置和使用方法
接下来,需要设置移动应用开发所使用Android版本,也就是配置对应的SDK版本。点击文件File菜单下的Settings子菜单,打开配置窗口,搜索“SDK”,设置Android SDK在本地的存储路径,如下图所示;同时也可以选取使用特定的Andriod版本。
最后,需要配置调试和运行Android应用程序的模拟器(如果采用真机调试则不需要)。首先,选择工具(Tools)菜单下的Android子菜单,点击AVD Manager选项;然后,点击创建模拟器按钮(Create Virtual Device),打开创建窗口,选择Phone(也可以创建其他类型的移动设备,比如:可穿戴设备、平板等)创建手机模拟器。创建窗口中列出了各种类型的手机,选择一个类型,点击Next按钮,完成配置,如下图所示。
模拟器创建好以后,点击启动按钮,即可启动模拟器,如下图所示。
如果不采用Android Studio提供的模拟器,也可以使用第三方模拟器。通常有两种类型的模拟器:一类基于Bluestacks,另一类基于VirtualBox。Bluestacks把Android底层的API接口翻译成Windows API,它对计算机的硬件本身没有要求,在硬件兼容性方面有一定的优势。Virtualbox是Oracle旗下的开源项目,它在Windows内核中直接插入驱动模块,创建一个完整的虚拟电脑环境运行安卓系统。第三方模拟器Genymotion就是基于VirtualBox,它的个人版是免费的。
难点
(1)移动应用开发框架
工程创建好以后,在Android Studio的左边窗口显示了整个工程项目的各种信息,如下图所示。在manifests文件夹下面,可以看到应用的全局配置文件“AndroidManifest.xml”文件。这个文件负责整个应用各个组件的配置。Java文件夹下面是项目的各个包目录。选取以项目名称命名的包(pers.cnzdy.tutorial),点击展开,可以看到Android Studio自动生成的MainActivity文件。另外,在开发过程中还经常要用到资源文件夹,也就是res目录,它主要用来存放应用的各种资源。
配置文件AndoridManifest会告诉Android系统,应用程序(APP)的各种配置信息,比如程序的运行环境、所需要的权限以及Andriod的各种组件(活动、服务,广播,内容提供商等等)。打开配置文件,首先看到应用程序的配置信息,包括应用的图标(icon),应用的名称(label),以及主题样式(theme)等等,如下图所示。
应用标签()的下面是程序的界面——Activity(称为活动)。它是移动应用最重要的部分,是程序的四大组件之一。
工程项目中还有一个文件非常重要,它就是存放资源编码的R文件,如下图所示。通过R文件,在程序中可以引用各种资源,比如:字符串、图标、样式等等。每一个资源在R文件中都有唯一的编码(id号)。在程序中要引用资源的时候,都是通过这个id号进行访问。R文件不需要手工构造,它由Android Studio自动生成。
R文件中对应的资源都存放在res目录中,不同的资源又存放在不同的文件夹下面,例如:图片存放在drawable目录下面,布局存放在layout目录下面等等。这些文件夹的名称都是Andriod规定好的。
项目代码生成好以后,需要将源代码打包成可执行的形式,对于Android应用来说就是生成apk,然后安装到移动设备上运行。完成这一系列任务需要一个专门的工具,这通常由构建工具来处理。
构建工具是一个把源代码生成为可执行应用程序的过程自动化程序,其中包括编译、连接、代码打包、生成可执行文件等步骤。在Android Studio中,使用Gradle来构建项目。Gradle是一个开源的自动化构建工具,它不仅限于构建 Android 应用程序,还可用于其他应用程序的构建,比如用于Java或C++等多种项目。在Android Studio的项目窗口(project)中,可以看到一个名为build.gradle的文件。Android项目有两个gradle文件:一个是整个工程项目的gradle文件,另一个是模块的gradle文件,两个gradle文件分别存放在不同的文件夹下面。
首先打开项目构建文件可以看到,文件中主要包括两个部分:(1)应用的远程代码仓库,指定为jcenter;(2)工程项目的依赖库(dependencies)。项目构建文件如下图所示。
buil.gradle文件中,两个地方的repositories闭包都声明了jcenter。jcenter是一个代码托管仓库,很多Android开源项目都会将代码托管到jcenter上。Android应用可以通过访问远程代码仓库jcenter来获取各种插件,比如:在依赖项dependencies闭包中使用classpath声明一个Gradle插件:“com. Android.tools.build:gradle:2.3.3”(最后面的数字部分是插件的版本号),即可在依赖库中加入gradle插件,并在项目中使用,非常方便。
在一个Android项目中还可以包含多个模块,每个模块都有一个gradle文件,它存放在模块的文件夹下面,如下图所示。模块gradle文件包含的基本信息有:各种版本信息、自定义构建类型(BuildType)和依赖项。首先看到模块使用的 SDK 版本,比如:这里的24就代表支持 Andriod 7.0,最低的 SDK 版本:23 表示最低支持 Android 6.0。
在Gradle脚本里有一项是buildTypes。它默认包含debug和release这两种构建类型,并且还可以在其中设定应用是否需要混淆代码,以防止反编译。buildTypes的下面是依赖声明,可以声明本地依赖或者远程依赖。远程依赖的格式是先给出域名,比如:com.Android.support,然后是冒号,随后是组名appcompat-v7(appcompat_v7是Android的向下兼容包),其中24.2.1是版本号。Gradle在构建项目时会首先检查本地是否已经有这个库的缓存,如果没有就会自动联网下载,然后将它添加到项目的构建路径中。
日志工具主要用来显示程序运行中的各种信息,比如运行中某个变量的取值。通过查看这些信息可以了解程序的运行状态,便于发现问题和调试程序。在Java语言中,一种最简单的日志显示方式是采用System.out.println函数来输出各种信息。而在Android开发中,一般不使用这个方法,主要是因为println函数输出的日志信息不可控制,输出的时间无法确定,并且不能对各种不同的信息进行过滤,而且信息也没有按照程序问题的严重程度划分不同的级别。Android提供的替代方案是使用日志类Log(Android.util.Log)。
在Android Studio菜单View中选择Tool Windows选取显示Logcat窗口。在Logcat窗口中可以看到各种日志信息。
日志信息的级别由低到高,一共有五种类型的日志信息,分别是verbose、debug、info、warn和error。Log.v()函数用于打印最为琐碎、意义最小的日志信息。Log.d()函数用于打印调试信息,这些信息对调试程序和分析问题有帮助。Log.i()函数打印一些比较重要的数据,这些数据帮助开发人员分析用户行为。Log.w()函数打印警告信息,提示程序可能存在的潜在风险。这些出现警告的地方开发人员需要认真检查并加以修改。Log.e()函数用于打印程序中的错误信息,例如:程序中出现了异常。错误信息通常表明程序存在比较严重的问题,需要修复才能正常运行。Log函数有两个参数,第一个参数用来过滤掉那些不想查看的信息,第二个参数是显示在Logcat窗口上的信息。过滤器设置完成以后,运行程序,可以看到过滤后的信息,也可以在Logcat窗口中选取要查看日志的级别,这样能够对信息进行分类过滤。
除了通过日志工具查看各种信息以外,在Android中,还提供了另外一种运行时查看信息的方式——Toast。在程序中通过编写Toast代码,可以在Android应用的运行界面上弹出一个提示窗来显示信息。提示信息通常只显示一段时间,然后消失,它不会影响程序的运行。使用Toast时,首先通过调用Toast类的makeText()函数创建一个Toast对象,然后调用show()函数将信息显示在界面上。makeText函数有三个参数,第一个参数是提示信息显示的上下文环境(Context),例如:FirstActivity界面,由于活动本身就是一个Context对象,因此直接传入 FirstActivity.this;第二个参数是要显示的文本信息;最后一个参数有两个选项,一个是Length_short,另一个是Length_long,分别表示显示时间的长短。
(2)移动应用程序的权限管理
当Android应用要完成某种敏感的操作,比如:拨打电话、发送短信、使用摄像头等等,都需要向用户申请权限,这就确保了系统的安全。在早期的Android系统中,如果应用程序要使用某项需要权限的功能,就需要在全局配置文件(AndroidManifest)中进行设置,比如:要获取网络状态信息,需要在配置文件中进行声明:
在全局配置文件中申请权限,称为静态权限申请。采用静态权限的管理方式,在使用过程中会存在一些问题:如果通过全局配置文件请求权限,用户在安装应用的时候,就必须同意各种权限申请;如果用户不同意,应用就无法安装。这就使得很多应用程序在安装时就向用户请求过多的权限,而有的权限可能是应用程序完全不需要的。这样就会强迫用户在安装时必须同意对权限的请求。
针对这一问题,Google在Android 6.0以后加入了动态权限管理——运行时权限。对于一些敏感权限,在用户使用时进行动态申请。用户可以拒绝这些权限的申请,虽然不使用敏感性的操作,但同时又不影响其他功能的使用;而对于已经授予过的权限,用户也可以在系统设置中关闭授权。通过这种方式可以防止一些应用恶意访问用户数据,提高了系统的安全性。
Android 6.0将移动应用的所有权限分为两类:一类是普通权限,一类是危险权限。普通权限通常不会直接威胁到用户的安全和隐私。这类权限只需要通过静态注册的方式提出申请,用户在安装应用的时候进行确认;确认后,系统会对应用授权,以满足程序的运行需求。危险权限是那些可能会涉及用户隐私,或者对移动设备造成安全隐患的权限,比如:获取手机上联系人电话、定位手机的地理位置等等。这部分权限不能用静态方式注册,必须编写代码,在程序运行的时候,弹出权限请求窗口,然后由用户选择是否授权。如果用户不同意,程序就无法使用相应的功能。
危险权限一共有9组,共24个权限,分别是日历、摄像头、联系人、地理位置、麦克风、电话、传感器、短信以及存储,如下表所示。每个危险权限都属于一个权限组,比如存储权限组就包括读和写两个权限。在编写权限申请代码的时候,开发人员根据权限名申请授权。如果程序在运行过程中需要该权限,就弹出窗口,提示用户授权。如果用户同意,那么这个权限所在权限组中的所有其他权限也会被同时授权。
Permission Group(权限分组) | Permissions(权限) |
CALENDAR(日历) | READ_CALENDAR WRITE_CALENDAR |
CAMERA(摄像头) | CAMERA |
CONTACTS(联系人) | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
LOCATION(地理位置) | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
MICROPHONE(麦克风) | RECORD_AUDIO |
PHONE(电话) | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
SENSORS(传感器) | BODY_SENSORS |
SMS(短信) | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
STORAGE(存储) | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
每当需要申请一个权限时,可以先查询这张表格。如果是属于这张表中的权限,那么就需要编写代码,在运行时申请权限;如果申请权限不在这张表中,那么只需要在AndroidManifest.xml文件中添加权限声明就可以了。
下面以拨打电话权限(危险权限)为例,来编写权限申请代码。首先,应用程序在每次需要“拨打电话”时,都要判断应用目前是否有该项权限。在程序中通过调用ContextCompat.checkSelfPermission()函数进行判断,如果返回PackageManager.PERMISSION_GRANTED,表示已经授权;如果没有授权则需要调用 requestPermissions() 函数来请求授权。这时系统会弹出一个权限申请对话框,用户可以选择同意或拒绝权限申请。不论是哪种结果,最终都会回调onRequestPermissionsResult()函数返回授权结果。其中requestCode表示申请的编号,用来判断当前申请的是哪一个权限,授权的结果则会封装在grantResults参数当中。
在onRequestPermissionsResult()函数中,将根据用户的授权结果进行判断:如果用户同意,就调用call()函数来拨打电话;如果用户拒绝,只能放弃操作,并且弹出一条失败提示。示例代码如下:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { calling(); } else { Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show(); } } }
本章习题:
1、本单元考核点
Android Studio开发软件工程的建立。
Android工程项目的各个目录和文件,构建工具Gradle。
Android的权限管理。
2、本单元课后习题
1、简述R.java和AndroidManefiest.xml文件的用途。
答案:R.java文件是ADT自动生成的文件,包含对drawable、layout和values目录内的资源的引用指针,Android程序能够直接通过R类引用目录中的资源。AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包括应用程序名称、图标、包名称、模块组成、授权和SDK最低版本等,而且每个Android程序必须在根目录下包含一个AndroidManifest.xml文件。
2、简述Android系统的四种基本组件Activity、Service、BroadcaseReceiver和ContentProvider的用途。
答案:Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件,用于提示用户程序已经正常启动。
Service一般用于没有用户界面,但需要长时间在后台运行的应用。
BroadcaseReceiver是用来接受并响应广播消息的组件。
ContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他 应用程序的私有数据。
参考资源:
1、Android Studio 中文社区:http://www.android-studio.org
2、Google Developers:https://developers.google.cn
原创声明
=======
作者: [ libin9iOak ]
本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。
作者保证信息真实可靠,但不对准确性和完整性承担责任。
未经许可,禁止商业用途。
如有疑问或建议,请联系作者。
感谢您的支持与尊重。