Android编程之Sdcard相关代码集锦
作者:stevenhu_223 发布时间:2022-08-15 09:55:24
本文实例讲述了Android编程之Sdcard相关代码。分享给大家供大家参考,具体如下:
1. 检测Sdcard是否可用:
public static boolean sdCardIsAvailable() {
String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED)) {
return false;
}
return true;
}
2. 获得程序在sd卡上的cahce目录:
private static boolean hasExternalCacheDir() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO;
}
/**
* @param context 上下文
* @return The external cache dir SD卡路径
*/
private static String getExternalCacheDir(Context context) {
// android 2.2 以后才支持的特性
if (hasExternalCacheDir()) {
return context.getExternalCacheDir().getPath() + File.separator + "gesture";
}
// Before Froyo we need to construct the external cache dir ourselves
// 2.2以前我们需要自己构造
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/gesture/";
return Environment.getExternalStorageDirectory().getPath() + cacheDir;
}
3. 获取Sdcard的实际空间大小:
public static long getRealSizeOnSdcard() {
File path = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}
----->检测Sdcard是否有足够的空间:
/**
* @param updateSize 指定的检测空间大小
* @return True 空间足够返回true,不足返回false
*/
public static boolean enoughSpaceOnSdCard(long updateSize) {
String status = Environment.getExternalStorageState();
if (!status.equals(Environment.MEDIA_MOUNTED))
return false;
return (updateSize < getRealSizeOnSdcard());
}
4. 获取手机的存储大小:
public static long getRealSizeOnPhone() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
long realSize = blockSize * availableBlocks;
return realSize;
}
---->检测手机存储是否有足够的空间:
/**
* @param updateSize 指定的检测空间大小
* @return 空间足够返回true,不足返回false
*/
public static boolean enoughSpaceOnPhone(long updateSize) {
return getRealSizeOnPhone() > updateSize;
}
附带点很久之前的记忆小赠品:
1. 在Android.mk中加入LOCAL_CERTIFICATE := platform就可以使用系统隐藏api(@hide)。
2.Activity的启动模式总结:
1). standard:
堆栈(task):与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:每次启动都会创建新的实例
2). singleTop:
堆栈(task):与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:启动时,检查是否有该Activity的实例在当前的栈顶(启动过的记录)。若有,则不再创建新实例,若无,则重新创建新实例,置于栈顶。
3). singleTask:
堆栈(task): 与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:启动时,检查task中是否有该Activity的实例。若有,则将task中在该Activity实例之上的所有其他Activity实例统统出栈(pop),
使其在栈顶。若无,则重新创建该Activity实例,置于栈顶。
4). singleInstance:
堆栈(task):与另外其他三种模式不同,会新建一个task,将Acitvity放置于这个新的task中,并保证不再有其他Activity实例进入.
实例创建:第一次创建时,会新建一个task,将其至于新的task中。若实例已存在,在启动时,无需再创建新实例,复用之前已创建的实例。
3.设置Activity的背景为手机桌面的背景:
在setContentView方法之前添加getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER),
然后在AndroidManifest.xml文件中添加android:theme="@android:style/Theme.Translucent"属性,实现将该Activity设置为透明。
4.查看手机内存空间代码long freeMemory = Runtime.getRuntime().freeMemory();
5.关于Android主线程:
android中的主线程是UI线程,它是针对android中的UI组件操作的线程,而android中UI组件操作要求是非线程安全的,
毕竟UI组件的更新操作要求快速响应,如果更新时考虑线程安全,同步锁等待响应之类的,那么UI组件的更新响应就有可能会延迟,
这样话就不符合Android要求尽可能规避的ANR异常。
6.Android4.4系统发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。
7. 引用相关:
SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法。
WeakReference<T>:弱引用-->随时可能会被垃圾回收器回收。
softReference多用作来实现cache机制,weakReference一般用来防止内存泄漏,要保证内存被VM回收 .
8.TCP和UDP
由于面向连接的TCP协议在发生数据丢包时,会要求重传,这会
影响视频的实时性。UDP由于其是面向事务的,且简单不可靠的传输协议,
在传输视频数据当中具有快捷,消耗资源小的特点,简单的传输过程中产生的
丢包和乱序是可以在视频接收端处理的。所以一般采用UDP协议作为多媒体通信的传输层协议。
9.内存相关:
1). 一个进程的内存可以由2个部分组成:java 使用内存 ,C 使用内存 ,
这两个内存的和必须小于16M(16M是怎么来的?算是实验来的吧,每个机型不一样,模拟器不同版本也不一样,可以通过:
Runtime.getMaxMemory() 来查看。),不然就会出现大家熟悉的OOM,这个就是第一种OOM的情况。
2). 更加奇怪的是这个:一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了。
10.获取底部虚拟按键高度(针对没有物理按键的手机):
/**
* 获取底部虚拟按键高度(针对没有物理按键的手机)
* @return
*/
private int getNavigationBarHeight() {
int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return getResources().getDimensionPixelSize(resourceId);
}
return 0;
}
希望本文所述对大家Android程序设计有所帮助。
猜你喜欢
- 先看看效果图:中间的圆形头像和光环波形讲解请看:https://www.jb51.net/article/96508.htm周围的气泡布局,
- 为了方便客户抓取Log,现通过TCP协议连接指定服务器,传输指定内容,定义指定目录,IP,PORT字段接收参数。直接上代码 public s
- 在学习SpringBoot的过程中遇到一个问题,因为SpringBoot是集成了tomcat的,所以项目是打成jar包,通过SpringMV
- 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值。分享给大家供大家参
- 背景最近引入了 Nacos Config 配置管理能力,说起来用法很简单,还是踩了三个坑。Nacos Config 的 nacos 的帐号密
- Unix时间戳最小单位是秒,开始时间为格林威治标准时间1970-01-01 00:00:00ConvertIntDateTime方法的基本思
- @RequestParam@RequestParam:接收来自RequestHeader中,即请求头。通常用于GET请求,例如:http:/
- 前言Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据
- 使用System.Environment获取电脑的相关属性,入门案例,具体内容如下static void Main(string[] arg
- 序列化与反序列化序列化:把对象转换成字节的过程,称为对象序列化反序列化:把字节恢复成对象的过程,称为反序列化对象的持久化概念:把字节保存的硬
- Feign导入依赖为unknow的情况网上很多人在使用的feign时在pom.xml中的依赖为:<!-- SpringCloud 整合
- 前言OpenTelemetry作为一个分布式追踪的项目,他支持非常多的语言,如Java,Golang,Python等,鉴于笔者的主力语言为J
- 下文笔者讲述SpringBoot配置log4j的方法分享,如下所示SpringBoot日志输出springboot框架中默认使用logbac
- 本文实例为大家分享了Java文件操作的具体代码,供大家参考,具体内容如下简介本程序主要采用了FileInputStream和FileOutp
- 一.求两直线交点class Point { double x; do
- 本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下:原图生成字符画文本(像素转换字符显示后,打开字
- 背景众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重
- 半路开始看的朋友可以回顾一下前几篇java并发编程专题(一)----线程基础知识java并发编程专题(二)----如何创建并运行java线程
- 前言大家对AOP应该都不陌生, 就算没有用过也肯定听说过,切面编程一直是一个热点的话题,AOP即Aspect Oriented Progra
- 五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看