IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android初级基础知识复习(七) —— SD卡文件操作 -> 正文阅读

[移动开发]Android初级基础知识复习(七) —— SD卡文件操作

SD卡文件操作

Android的文件存储方式—— SD卡的用法,包括如何获取SD卡目录信息、公有存储空间与私 有存储空间的区别、在SD卡上读写文本文件、在SD卡读写图片文件等功能。

SD卡的基本操作

手机的存储空间一般分为两块,一块用于内部存储,另一块用于外部存储(SD卡)。
早期的SD卡是可插拔式的存储芯片,不过自己买的SD卡质量参差不齐,经常会影响App的正常运行,所以后来越来越多的手机把SD卡固化到手机内部,虽然拔不出来,但是Android仍然称之为外部存储。
获取手机上的SD卡信息通过Environment类实现,该类是App获取各种目录信息的工具,主要方法有以下7种。

  1. getRootDirectory:获得系统根目录的路径。
  2. getDataDirectory:获得系统数据目录的路径。
  3. getDownloadCacheDirectory:获得下载缓存目录的路径。
  4. getExternalStorageDirectory:获得外部存储(SD卡)的路径。
  5. getExternalStorageState:获得SD卡的状态。
    在这里插入图片描述
  6. getStorageState:获得指定目录的状态。
  7. getExternalStoragePublicDirectory:获得SD卡指定类型目录的路径。
    在这里插入图片描述

公有存储空间与私有存储空间

本来在AndroidManifest.xml里面配置了存储空间的权限,代码就能正常读写SD卡的文件。可是Android 从7.0开始加强了SD卡的权限管理,即使App声明了完整的SD卡操作权限,系统仍然默认禁止该App访问外部存储。打开7.0系统的设置界面,进入到具体应用的管理页面,会发现应用的存储功能被关闭了(指外部存储)。
不过系统默认关闭存储其实只是关闭外部存储的公共空间外部存储的私有空间依然可以正常读写。
这是缘于Android把外部存储分成了两块区域,一块是所有应用均可访问的公共空间,另一块是只有应用自己才可访问的专享空间。

之前讲过,内部存储保存着每个应用的安装目录,但是安装目录的空间是很紧张 的,所以Android在SD卡的“Android/data”目录下给每个应用又单独建了一个文件目录,用于给应用保存自己需要处理的临时文件。这个给每个应用单独建立的文件目录,只有当前应用才能够读写文件,其他应用是不允许进行读写的,故而“Android/data”目录算是外部存储上的私有空间

既然外部存储分成了公共空间和私有空间两部分,这两部分空间的路径获取也就有所不同。获取公共 空间的存储路径,调用的是Environment.getExternalStoragePublicDirectory方法;获取应用私有空间的存储路径,调用的是getExternalFilesDir方法。

文本文件读写

文本文件的读写一般借助于FileOutputStream和FileInputStream。其中,FileOutputStream用于写文件, FileInputStream用于读文件。

图片文件读写

Android的图片处理类是Bitmap,App读写Bitmap可以使用FileOutputStream和FileInputStream。不过在实际开发中,读写图片文件一般用性能更好的BufferedOutputStreamBufferedInputStream
保存图片文件时用到Bitmapcompress方法,可指定图片类型压缩质量打开图片文件时使用 BitmapFactorydecodeStream方法。

刚才从SD卡读取图片文件用到了BitmapFactorydecodeStream方法,其实BitmapFactory还提供了其他方法,用起来更简单、方便,说明如下:

  1. decodeFile:该方法直接传文件路径的字符串,即可将指定路径的图片读取到Bitmap对象
  2. decodeResource:该方法可从资源文件中读取图片信息。第一个参数一般传getResources(),第二个参 数传drawable图片的资源id,如R.drawable.phone。

应用Application基础

Application的生命周期

Application是Android的一大组件,在App运行过程中有且仅有一个Application对象贯穿整个生命周期。
打开AndroidManifest.xml时会发现activity节点的上级正是application节点,只是默认的application节点没有指 定name属性,不像activity节点默认指定name属性值为.MainActivity,让人知晓这个activity的入口代码是 MainActivity.java。现在试试给application节点加上name属性,看看其庐山真面目。
(1)打开AndroidManifest.xml,给application节点加上name属性,表示application的入口代码是 MainApplication.java。
(2)创建MainApplication类,该类继承自Application,可以重写的方法主要有以下4个。

  1. onCreate:在App启动时调用。
  2. onTerminate:在App退出时调用(按字面意思)。
  3. onLowMemory:在低内存时调用。
  4. onConfigurationChanged:在配置改变时调用,例如从竖屏变为横屏。

(3)运行App,同时开启日志的打印。但是只在一开始看到MainApplication的onCreate操作(先于 Activity的onCreate),却始终无法看到它的onTerminate操作,无论是自行退出还是强行杀死App的进程,日志都不会打印onTerminate。
无论你怎么折腾,这个onTerminate都不会出来。Android明明提供了这个函数,同时提供了关于该函数 的解释,说明文字如下:This method is for use in emulated process environments.It will never be called on a production Android device, where processes are removed by simply killing them; no user code (including this callback) is executed when doing so。这段话的意思是该方法是供模拟环境用的,在真机上永远不会被调用, 无论是直接杀进程还是代码退出。
现在很明确了,onTerminate方法就是个摆设,中看不中用。如果读者想在App退出前做资源回收操作,那么千万不要放在onTerminate方法中。

利用Application操作全局变量

Java没有全局变量的概念。与之比较接近的是类里面的静态成员变量,该变量可被外部直接引用,并且在不同地方引用的值是一样的(前提是在引用期间不能修改该变量的值),所以可以借助静态成员变量实现类似全局变量的功能。
通过利用Application的持久存 在性可以在Application对象中保存全局变量。
适合在Application中保存的全局变量主要有下面3类数据:
(1)会频繁读取的信息,如用户名、手机号等。
(2)从网络上获取的临时数据,为节约流量、减少用户等待时间,想暂时放在内存中供下次使用,如 logo、商品图片等。
(3)容易因频繁分配内存而导致内存泄漏的对象,如Handler对象等。

要想通过Application实现全局内存的读写,得完成以下3项工作:
(1)写一个继承自Application的类MainApplication。该类要采用单例模式,内部声明自身类的一个静态成员对象,在创建App时把自身赋值给这个静态对象,然后提供该静态对象的获取方法getInstance
(2)在Activity中调用MainApplication的getInstance方法,获得MainApplication的一个静态对象,通过 该对象访问MainApplication的公共变量和公共方法。
(3)不要忘了在AndroidManifest.xml中注册新定义的Application类名,即在application节点中增加 android:name属性,值为.MainApplication。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:54:40  更:2021-07-23 10:55:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 18:17:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码