Android官方开发教程中文版六Word文档格式.docx
- 文档编号:18639585
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:12
- 大小:24.38KB
Android官方开发教程中文版六Word文档格式.docx
《Android官方开发教程中文版六Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android官方开发教程中文版六Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
SharedPreferencessharedPref=context.getSharedPreferences(
getString(R.string.preference_file_key),Context.MODE_PRIVATE);
命名你的共享参数文件时,应该使用唯一的、可识别的名称。
比如“com.example.myapp.PREFERENCE_FILE_KEY”。
或者,如果你的Activity就一个共享参数文件,你可以使用getPreference()方法:
SharedPreferencessharedPref=getActivity().getPreferences(Context.MODE_PRIVATE);
警告:
如果你MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE创建共享参数文件,那么任何知道文件标识符的其它App都可以访问你的数据。
写入共享参数
写入共享参数文件,用SharedPreferences对象的edit()方法创建一个SharedPreference.Editor对象。
把你要写入的键和值传递给putInt()或putString()之类的方法,然后调用commit()方法提交改变。
如:
SharedPreferences.Editoreditor=sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score),newHighScore);
mit();
读取共享参数
调用getInt()或getString()之类的方法从共享参数文件中检索值,提供一个你想要得到值的键,以及一个可选的、当键不存在时返回的默认值。
intdefaultValue=getResources().getInteger(R.string.saved_high_score_default);
longhighScore=sharedPref.getInt(getString(R.string.saved_high_score),defaultValue);
保存文件
Android使用的文件系统类似其它平台上的基于磁盘的文件系统。
本节内容描述了FileAPI如何工作于Android文件系统以及读写文件。
File对象适合按从头到尾的、不跳过任何内容的顺序,读写大量数据。
例如,图像文件或任何通过网络交换的数据(维信科技提供)。
本节内容展示了如何在你的App中执行文件相关的基本任务。
本节课假设你熟悉基本的Linux文件系统以及Java.io中标准的文件输入输出API。
选择内部或外部存储
所有Android系统都有两个文件存储区:
“内部”或“外部”。
这些叫法来自早期Android,大部分Android设备提供了内建的、非易失性的存储器(内部储存),加上一个可移动的存储介质如微型SD卡(外部储存)。
某些设备将永久储存空间划分为“内部”和“外部”分区,因此,就算没有可移动存储介质,也同样有两种存储空间和API行为,无论外部储存是否可移动。
下表是对两种储存空间的总结:
内容存储:
●总是可用的。
●存放在这里的文件默认情况只能被你的App访问。
●当用户卸载你的App时,系统会在内部存储中删除所有你的App的文件。
内部存储区最好用来存放你即不想让用户,也不想让其它App访问的文件。
外部存储:
●不总是可用的,用户可以把外部存储器做为USB设备插入,也可以从设备上移除。
●它是“全世界可读的”(公开的),文件存放在这里会在你控制之外被读取。
●当用户卸载你的App时,只有保存在通过getExternalFilesDir()方法获得的目录中的App文件才会被系统删除。
外部存储区最好用来存放不需要限制访问,或是你想共享给其它App,或是允许用户通过电脑来访问的文件。
提示:
虽然App默认情况下是安装在内部存储区的,但你可以在清单文件中指定android:
installLocation属性让你的App安装在外部存储区上。
用户会喜欢这个选项的,当APK的大小非常大,而用户有一个比内部存储区大得多的外部存储区时。
详情请参考“应用安装位置”。
获得外部存储区权限
要写入外部存储区,你必须在清单文件中请求WRITE_EXTERNAL_STORAGE权限:
<
manifest...>
<
uses-permissionandroid:
name="
android.permission.WRITE_EXTERNAL_STORAGE"
/>
...
/manifest>
目前,所有的App都可以读取外部存储区而不需要指定权限。
无论如何,这将在未来的版本中改变。
如果你的App需要读取外部存储区(但不写入),你需要声明READ_EXTERNAL_STORAGE权限(维信科技提供)。
要确保你的应用如期望中的那样继续工作,在更改生效之前,你应该立即声明这个权限。
把文件保存到内部存储区中不需要任何权限,应用程序任何时候在自己的内部存储区目录中都有权限读写文件。
把文件保存到内部存储区
当把文件保存到内部存储区时,你可以通过下列两个方法之一获得文件对应的目录:
getFilesDir()
为App返回表示内部目录的文件对象
getCacheDir()
为App的临时缓存文件返回表示内部目录的文件对象。
确保文件不再使用时删除它,并且在任何时候都为它执行一个合理的大小限制,比如1MB。
如果系统检查到存储空间过低,它会删除你的缓存文件而不做任何警告。
在这些目录中创建新的文件,你可以使用File()构造函数,传递通过上面的方法之一提供的,指定了内部存储目录的文件对象。
Filefile=newFile(context.getFilesDir(),filename);
或者,你也可以调用openFileOutput()获得一个FileOutputStream来写入到你的内部目录中的文件。
Stringfilename="
myfile"
;
Stringstring="
Helloworld!
"
FileOutputStreamoutputStream;
try{
outputStream=openFileOutput(filename,Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
}catch(Exceptione){
e.printStackTrace();
}
又或者,如果你需要缓存某些文件,你应该使用createTempFile()(维信科技提供)。
下例中的方法从URL中提取了文件名,并用这个文件名在内部缓存目录中创建了一个文件:
publicFilegetTempFile(Contextcontext,Stringurl){
Filefile;
try{
StringfileName=Uri.parse(url).getLastPathSegment();
file=File.createTempFile(fileName,null,context.getCacheDir());
catch(IOExceptione){
//Errorwhilecreatingfile
}
returnfile;
App的内部存储目录是在Android文件系统的特定位置由App的包名指定的。
从技术上说,如果你把文件设置为可读,其它App可以读取你的内部文件。
但无论如何,其它App还需要知道你的包名和文件名,其它App不能浏览你的内部目录也没读写权限,除非你显示地把文件设为可读或可写(维信科技提供)。
所以只你对内部存储的文件使用MODE_PRIVATE,它们永远不可能被其它App访问。
把文件保存到外部存储区
因为外部存储区可能是不可用的(比如用户把存储器安装到电脑上,或把提供外部存储的SD卡移除了),你应该总是在访问前验证卷(意指磁盘的卷)是否允许。
你可调用getExternalStorageState()方法查询外部存储区的状态,如果返回状态值是MEDIA_MOUNTED,那么你可以读写文件。
下例的方法可用于判断外部存储是否可用:
/*检查外部存储是否允许读写*/
publicbooleanisExternalStorageWritable(){
Stringstate=Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
returntrue;
returnfalse;
/*检查外部存储是否可读*/
publicbooleanisExternalStorageReadable(){
if(Environment.MEDIA_MOUNTED.equals(state)||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
尽管外部存储可以被用户和其它App更改,你可以在上面保存两类文件:
公共文件:
文件对用户和其它App是自由的,当用户卸载你的App时,这些文件允许用户保留。
例如,你的App拍摄的相片或其它下载的文件。
私有文件:
文件当然属于你的App,用户卸载App时会删除它们。
由于它们在外部存储区上,这些文件从技术上说可以被用户和其它App访问,但实际上不会为你的App之外的用户提供价值。
当用户卸载你的App时,系统删除所有外部私有目录中的文件。
如被你的App或临时媒体文件下载的额外资源。
如果你想在外部存储区中保存公共文件,使用getExternalStoragePublicDirectory()方法获得表示外部存储区正确目录的文件对象。
这个方法有一个指定要保存的文件类型的参数,这样它们可以和其它公共文件逻辑上组织到一起,比如DIRECTORY_MUSIC或DIRECTORY_PICTURES(维信科技提供)。
publicFilegetAlbumStorageDir(StringalbumName){
//获得用户公共的图片目录
Filefile=newFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES),albumName);
if(!
file.mkdirs()){
Log.e(LOG_TAG,"
Directorynotcreated"
);
如果你想把文件保存为App私有的,你可调用getExternalFilesDir()方法并且给它传递一个表示目录类型的名称。
这种方式创建的目录添加到父目录中,并封装了所有App的外部存储文件,当用户卸载App时,它们被系统删除。
例如,下面的方法可以用来创建个人相册的目录:
publicFilegetAlbumStorageDir(Contextcontext,StringalbumName){
//获得App的私有图片目录
Filefile=newFile(context.getExternalFilesDir(
如果没预定义的子目录名称适合你的文件,你可以调用getExternalFilesDir()方法传递null值来代替,这会获得外部存储区中App私有目录的根目录。
记住getExternalFilesDir()是在一个目录里面创建一个目录,当用户卸载App时,这个目录会被删除(维信科技提供)。
如果App卸载后保存的文件仍然保留可用(比如你的App是一个相机应用,并且用户希望能保留相片),你应该用getExternalStoragePublicDirectory()代替它。
无论App是为共享文件而使用getExternalStoragePublicDirectory()还是为私有文件而使用getExternalFilesDir(),重要的是你使用API常量提供的目录名,如DIRECTORY_PICTURES。
这些目录名能确保文件被系统正确地对待。
例如,文件保存在DIRECTORY_RINGTONES将被系统媒体扫描分类为铃声而不是音乐。
查询可用空间
如果你提前知道要保存多少数据,你可以调用getFreeSpace()或getTotalSpace()获得是否有足够的空间供你保存而不会产生IOException。
这些方法分别提供了存储卷上当前可用空间和总空间。
对避免填充存储卷超过一定阈值,这些信息也是有用的。
无论如何,系统并不能保证你可以写入和getFreeSpace()指明的一样多的字节。
如果返回的数量比你想要保存的数据大小多几个MB,或者文件系统已用的空间小于90%,那么你的继续可能是安全的。
否则,你可能不应该写入存储区。
你不需要在保存文件之前检查可有空间数量,你可以试着立即写入文件,然后捕获IOException(维信科技提供)。
如果你不知道需要多少空间,你可以这么做。
比如,把PNG图片转换成JPEG图片,在保存之前改变了文件编码,你无法预先知道文件大小。
删除文件
你应该总是在不需要文件的时候把它删除,多数情况下,直接通过打开的文件引用调用delete()方法:
myFile.delete();
如果文件储存在内部存储区,你也可以请求Context调用deleteFile()来定位和删除文件:
myContext.deleteFile(fileName);
当用户卸载你的App时,Android系统会删除:
1.所有保存在内部存储区的文件。
2.所有用getExternalFilesDir()保存的外部存储区的文件。
无论如何,你应该定期手动删除所有通过getCacheDir()创建的缓存文件,以及定期删除其它不再需要的文件。
在SQL数据库中保存数据
把重复或结构化的数据保存到数据库中是理想的。
这节课假设你已经熟悉一般的SQL数据库,并帮助你开始了解Android系统中的SQLite数据库。
你需要用到的数据库API在android.database.sqlite包中。
定义架构和合约
数据库的主要原则之一是架构:
数据库是如何组织的正式声明。
架构被体现在你用来创建数据库的SQL语句中。
你可能会发现创建一个同伴类(称为合约类)是很有用的,它以系统化和自我文档化的方式明确规定架构布局。
合约类是一个为URI、表、列定义名称的常量容器。
合约类允许你在同一个包中交差使用同一个常量。
这可以让你在一个地方修改列名而影响你所有的代码。
组织合约类的好办法是把数据库的全局定义放在类的根级别上,然后为每个表创建内部类来列举它的列。
实现BaseColumns接口,你的内部类会继承一个主键字段:
_ID,某些Android类,如游标适配器可能会期望有它。
这不是必需的,但这可以帮助你的数据库更好地工作在Android框架中。
下面的代码片断为单表定义了表名和列名:
publicfinalclassFeedReaderContract{
//防止有人意外地实例化合约类
//给它一个空的构造函数
publicFeedReaderContract(){}
/*定义表的内部类*/
publicstaticabstractclassFeedEntryimplementsBaseColumns{
publicstaticfinalStringTABLE_NAME="
entry"
publicstaticfinalStringCOLUMN_NAME_ENTRY_ID="
entryid"
publicstaticfinalStringCOLUMN_NAME_TITLE="
title"
publicstaticfinalStringCOLUMN_NAME_SUBTITLE="
subtitle"
使用SQLHelper创建数据库
定义数据库之后,你应该实现创建与维护数据库和表的方法,下面是一些典型的创建和删除表的语句:
privatestaticfinalStringTEXT_TYPE="
TEXT"
privatestaticfinalStringCOMMA_SEP="
"
privatestaticfinalStringSQL_CREATE_ENTRIES=
"
CREATETABLE"
+FeedEntry.TABLE_NAME+"
("
+
FeedEntry._ID+"
INTEGERPRIMARYKEY,"
FeedEntry.COLUMN_NAME_ENTRY_ID+TEXT_TYPE+COMMA_SEP+
FeedEntry.COLUMN_NAME_TITLE+TEXT_TYPE+COMMA_SEP+
...//CREATE命令的其它选项
)"
privatestaticfinalStringSQL_DELETE_ENTRIES=
DROPTABLEIFEXISTS"
+FeedEntry.TABLE_NAME;
就象保存在内部存储区的文件一样,Android系统把数据库储存到应用程序关联的私有磁盘空间中。
你的数据是安全的,因为默认情况下,其它应用程序不能访问这个区域(维信科技提供)。
SQLiteOpenHelper类提供了一些有用的API。
当你使用这个类得到对数据库的引用时,系统只在需要时并且不是App启动期间,才会执行可能需要较长时间的创建及更新数据库的操作。
你要做的就是调用getWritableDatabase()和getReadableDatabase()方法。
因为它们可能需要较长时间运行,确保你在后台线程中调用getWritableDatabase()和getReadableDatabase(),如AsyncTask或IntentService。
要使用SQLiteOpenHelper,创建它的子类并重写onCreate()、onUpdate()和onOpen()回调方法。
你可能还想实现onDowngrade(),但是没必要。
下例是使用了上面看到的某些命令实现的SQLiteOpenHelper子类:
publicclassFeedReaderDbHelperextendsSQLiteOpenHelper{
//如果你改变了数据库架构,你必须升级数据库的版本
publicstaticfinalintDATABASE_VERSION=1;
publicstaticfinalStringDATABASE_NAME="
FeedReader.db"
publicFeedReaderDbHelper(Contextcontext){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
publicvoidonCreate(SQLiteDatabasedb){
db.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 官方 开发 教程 中文版