




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章存储程序数据Android
Studio移动应用开发基础(第2版)目录11.1使用SharedPreferences存储程序数据同步练习一设置应用程序的首选项同步练习二在应用程序目录下存储程序数据同步练习三访问外部存储器使用SQLite数据库存储程序数据11.1使用SharedPreferences存储程序数据在应用程序的运行过程中,经常需要存储一些程序运行过程中的数据(简称程序数据);
可以使用Android提供的SharedPreferences存储程序数据,也可以使用普通文件存储程序数据,当然,我们还可以将程序数据存储于SQLite数据库中。
SharedPreferences提供了一个基本框架,通过使用SharedPreferences,可以非常方便地存储程序数据;
举例说明如何使用SharedPreferences存储程序数据,该案例应用程序运行效果的首界面如图所示。首先显示一个登录界面,提示用户输入用户名和密码,如果用户点击“登录”按钮,那么应用程序会将用户输入的用户名和密码保存下来,当用户再次运行该应用程序时,该应用程序会自动地将上次用户输入的用户名和密码填入相应的输入框。新建一个名为Ch1101的Android应用程序工程。修改布局文件res/layout/activity_main.xml中的代码:修改res/values/strings.xml文件:修改MainActivity.java文件:
本质上,Android的SharedPreferences就是在应用程序安装目录下的shared_prefs子目录下创建的以
getSharedPreferences()方法的第一个参数为文件名的特定的XML文件:11.2同步练习一
完善11.1节中的案例,并且对其进行如下修改:当用户点击“登录”按钮时,使用SharedPreferences存储用户输入的用户名和密码,以及用户登录的日期和时间。当用户再次运行该应用程序时,不仅会将上次用户输入的用户名和密码自动填入相应的输入框,还会通过一个Toast组件显示上次登录的日期和时间。在修改完成后,运行该应用程序,在Device
File
Explorer面板中观察应用程序安装目录下的文件结构变化。11.3设置应用程序的首选项
Android应用程序通常会包括一些设置,以便用户可以改变应用程序的运行特征,如应用程序的界面风
格、网络的刷新时间间隔或其他与应用程序有关的运行参数。为了使Android应用程序与Android自带的系统设置应用程序具有一致的外观,Android提供了一个名为Preference的API,可以使用Preference
API设置应用程序的首选项。一个典型的应用程序首选项设置界面如图。
Preference
API提供了应用程序首选项设置界面中所需的所有组件,这些首选项组件所设置的值都以
key/value对的方式存储于应用程序安装目录下的shared_prefs子目录下文件名为“程序包名_preferencex.xml”的XML文件中,首选项中存储的值的数据类型包括Boolean、Float、Int、Long、String及String数组。常用的Preference组件如下:CheckBoxPreference:显示一个复选框,用于设置某个特征是否可用。ListPreference:显示一个列表框,并且在列表框中显示一组单选按钮,用于选择某个特征。EditTextPreference:显示一个输入框,用于输入某个值。
举例说明如何设置和使用应用程序首选项:使用应用程序首选项设置文字“Hello
world!”的样式,可设置的首选项包括是否以动画形式显示界面文本、文本颜色、文本字号、文字的语种(中文、英文),运行效果的首界面如图.新建一个名为Ch1102的Android应用程序工程。修改布局文件res/layout/activity_main.xml中:res/xml目录下新建一个名为my_settings.xml的首选项文件:修改res/values/strings.xml:在res/anim目录下新建一个名为my_scale.xml的动画定义文件:MySettingsActivity.java文件:MainActivity.java文件中:需要在AndroidManifest.xml文件中配置MySettingActivity类:11.4同步练习二
11.3节中的案例应用程序复制到自己的开发环境中并运行,观察该应用程序的运行效果,并且进行如下修改:在应用程序首选项设置界面中添加一个新的首选项,用于设置动画的执行时间。11.5在应用程序目录下存储程序数据
一个Android应用程序,在被安装到Android平台上时,系统都会在/data/data目录下,以该应用程序的包名为名,为该应用程序创建一个唯一的子目录,我们可以在该子目录下创建只有该应用程序才可以访
问的子目录或文件;
Activity提供了以下用于操作应用程序私有目录的方法。这些方法是在Context类中定义的,因为Activity类是Context类的子类,所以继承了这些方法:
File
Activity.getFilesDir()。返回应用程序私有目录完整路径的File对象。例如,如果应用程序的包名为
com.ttt.mysample,那么这个File对象的完整路径为/data/data/com.ttt.mysample/files。
File
getDir(String
name,int
mode)。在应用程序的私有目录下,创建或返回一个名字为“app_”+name参数的子目录File对象,设置mode参数的值为0即可。boolean
deleteFile(String
name)。在应用程序的私有目录下,删除一个名字与name参数一致的文件。String[]fileList()。返回应用程序私有目录下的所有子目录和文件名。
FileOutputStream
openFileOutput(String
name,int
mode)。在应用程序的私有目录下,打开或新建一个名字与name参数一致的文件,用于写入数据,设置mode参数的值为0即可11.6同步练习三参照11.5节中介绍的各个文件访问方法的功能,编写一个简单的Android应用程序。11.7访问外部存储器
使用Android提供的Environment工具类检查外部SD卡的状态及获取SD卡中的特定子目录,如是否插入
SD卡、SD卡当前是否可读、SD卡当前是否可写、获取SD卡中特定子目录的File对象等。在读/写外部SD卡前,需要为应用程序在AndroidManifest.xml文件中申请相应的权限:<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/><uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
/>11.7.1检查SD卡的状态
在对外部SD卡进行读/写操作前,需要检查SD卡的状态,使用Environment类中的
getExternalStorageState()方法获取SD卡的状态,其状态包括MEDIA_UNKNOWN、MEDIA_REMOVED、MEDIA_UNMOUNTED、MEDIA_CHECKING、MEDIA_NOFS、MEDIA_MOUNTED、EDIA_MOUNTED_READ_ONLY、MEDIA_SHARED、MEDIA_BAD_REMOVAL、MEDIA_UNMOUNTABLE;11.7.2获取SD卡中特定子目录的File对象
使用Environment类中的getExternalStoragePublicDirectory(String
type)方法可以获取SD卡中特定子目录的
File对象,其中,type参数的值包括DIRECTORY_MUSIC、DIRECTORY_PODCASTS、DIRECTORY_RINGTONES、DIRECTORY_ALARMS、DIRECTORY_NOTIFICATIONS、DIRECTORY_PICTURES、DIRECTORY_MOVIES、DIRECTORY_DOWNLOADS、DIRECTORY_
DCIM;
在获取所需子目录后,就可以使用java.io包中的相关类及其方法,像操作普通文件一样,操作SD卡中的文件或目录了。11.8使用SQLite数据库存储程序数据SQLite是一个开源、免费的数据库管理系统11.8.1
SQLite数据库简介
Android整合了SQLite数据库管理系统,对SQLite的C语言程序包进行了Java封装,提供了基于Java语言的类库。因此,在Android应用程序开发中,可以使用SQLite提供的Java接口创建及访问SQLite数据库。SQLite也支持这些数据类型:int、char、varchar、text、image、real。11.8.2在Android中使用SQLite数据库
Android提供了操作SQLite数据库的Java类库,对SQLite数据库完全支持,其中一个非常重要和常用的类就是SQLiteOpenHelper类,在需要创建和使用SQLite数据库时,应该继承该类,并且重写其中的
onCreate()方法,从而创建所需的数据表。
举例说明如何使用SQLiteOpenHelper类创建SQLite数据库,以及如何在数据库中创建所需的数据表。我
们要创建的数据库名为Teach.db,该数据库中包含3个数据表,分别为student表、course表和score表,分别用于存储学生信息、课程信息和成绩信息。
新建一个名为Ch1103的Android应用程序工程,新建一个名为MyDataBaseHelper的Java类文件。修改
MyDataBaseHelper.java文件中的代码:res/layout/activity_main.xml:在res/layout目录下新建一个列表项布局文件list_item.xml:res/values/strings.xml文件:MySimpleCursorAdapter.java文件:MainActivity.java文件:
在手机内部文件系统列表中展开/data/data目录,可以看到我们已经安装的com.example.ch1103应用程序目录,展开该目录,在databases目录下,可以看到我们创建的Teach.db数据库文件:Q
&
A第12章使用后台任务Android
Studio移动应用开发基础(第2版)目录12.1使用Java线程执行后台任务同步练习一使用AsyncTask工具类执行后台任务使用Service完成后台任务同步练习二12.1使用Java线程执行后台任务
在Android平台上,Activity运行在称为UI线程的主线程中,并且Android操作系统对Activity的响应时间有严格的要求:对每个用户操作的响应时长不能超过规定的时间长度,否则Android操作系统会出现异常,并且会影响用户的使用体验。
在Android平台上,执行时间较长的任务都应该放在后台进行。此外,执行时间较长的任务和执行时间不确定的任务,如网络通信,都必须放在后台执行。在后台执行任务,完全可以使用Java的线程机制进行。
在Android应用程序中,在后台执行任务是非常普遍的,Android
SDK也提供了相应的机制,使在后台执行任务变得更加容易实现,包括使用AsyncTask工具类。
举例说明如何使用Java的Thread类执行后台任务。该应用程序可以使用一个TextView组件实时显示当前系统的日期和时间,运行效果如图所示。点击“停止”按钮,可以停止实时显示当前系统的日期和时间,并且按钮上的文字会变为“启动”,再次点击该按钮,可以再次实时显示当前系统的日期和时间。新建一个名为Ch1201的Android应用程序工程。修改布局文件res/layout/activity_main.xml中:修改res/values/strings.xml文件:修改MainActivity.java文件中的代码:
Android中的每个Activity都运行在自己独立的线程中,这个线程通常称为UI线程,Activity通过UI线程与用户进行交互。
为了保证界面交互的实时性、不影响用户体验,Android规定,Activity完成交互的时间长度不能超过规定的时间长度(10秒),如果超过规定的时间长度,那么Android会发生异常。
Android规定,只能由UI线程对Activity中显示的信息进行更新,其他线程都不能更新Activity中显示的信息,否则会发生异常。
为了让非UI线程也能修改Activity中的信息,Android为每个Activity都提供了一个默认的消息队列,需要修改Activity中显示信息的线程通过这个消息队列向Activity发送消息,进而由Activity的UI线程修改
Activity中显示的信息,Handler类就是为此设计的。12.2同步练习一
读者可以将12.1节中的案例应用程序复制到自己的开发环境中,并且进行如下修改:每到整点,如早上
8:00、晚上10:00,都会自动播放一段简短的音乐。12.3使用AsyncTask工具类执行后台任务Android为了便于执行后台任务,提供了AsyncTask工具类。使用AsyncTask工具类,需要派生AsyncTask工具类的一个子类,并且重写AsyncTask工具类中的以下4个方法:protected
void
onPreExecute()protected
Result
doInBackground(Params...
params)protected
void
onProgressUpdate(Progress...
values)protected
void
onPostExecute(Result
result)
AsyncTask工具类支持3个泛型的类参数,因此,在派生AsyncTask工具类的子类时,需要指出3个数据类型:第一个数据类型是传递给doInBackground()方法的Params数据类型,第二个数据类型是传递给onProgressUpdate()方法的Progress数据类型,第三个数据类型是传递给onPostExecute()方法的Result数据类型。对于不需要使用的参数,可以将其对应的AsyncTask泛型的类参数设置为Void类型。
举例说明如何使用AsyncTask工具类执行后台任务:使用AsyncTask工具类实现12.1节中的案例应用程序,该案例应用程序运行效果的首界面如图12-2所示:新建一个名为Ch1202的Android应用程序工程。修改布局文件res/layout/activity_main.xml:修改res/values/strings.xml文件:修改MainActivity.java文件:12.4使用Service完成后台任务
Service是Android中的组件之一,它没有UI接口。使用
Service可以完成一些需要长时间在后台执行的任务。
Android中的其他组件,如Activity,都可以启动并运行一个
Service。Service一旦被启动,就会持续地在后台运行,直到被停止。
Android提供两种类型的Service,分别为启动式服务和绑定式服务,本节主要介绍启动式服务。
Service也具有固有的生命周期,可以通过重写生命周期回调方法实现对Service的控制。
虽然Service是后台服务,但是Service是运行在应用程序的UI线程中的,因此在Service的各个回调方法中只能进行一些简
短的工作,需要长时间执行的任务应该交给其他线程运行。举例说明Service的使用方法:使用Service在后台播放音乐。
使用Service播放音乐,使用Activity启动该Service,在关闭这个Activity后,Service仍然可以在后台播放音乐。该案例应用程序的运行效果如图12-5所示。点击“播放1号音乐”或“播放2号音乐”按钮,应用程序会启动一个Service,用于播放相应的音乐,同时在系统的通知栏中显示一个播放图标,如图12-6所示。在关闭Activity后,不会停止播放音乐。通过下拉通知栏,再次启动Activity,对音乐播放进行控制。中新建一个名为Ch1203
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 皮革制品的陈列展示策略考核试卷
- 人行天桥雨棚施工方案
- 天桥门洞基础施工方案
- 油料作物种植与农业生产效率提升考核试卷
- 2023年中国铁路广州局集团有限公司招聘177名笔试参考题库附带答案详解
- 2024年微生物检验技术的应用案例试题及答案
- 电机维修面试题及答案
- 木材加工企业的市场细分与目标市场选择考核试卷
- 电信服务在电子政务的推进考核试卷
- 砼结构构件的预制件质量影响因素考核试卷
- 红酒加工合同协议
- 媒体宣发合同协议
- 变电站交、直流系统培训课件
- 高中英语3500词词汇
- 2025-2030中国消毒器械行业发展分析及发展趋势预测与投资价值研究报告
- 2025年环保知识竞赛赛题及答案(共70题)
- 2025届青海省西宁市高三一模语文试题(原卷版+解析版)
- 2025年杭州市高三历史4月二模质检考试卷附答案解析
- 2025年中小学教师资格考试内容分析试题及答案
- 职场沟通职场沟通与人际关系处理知到课后答案智慧树章节测试答案2025年春山东管理学院
- 2025届云南省昆明市高三下学期“三诊一模”教学质量检测历史试题(含答案)
评论
0/150
提交评论