Android有用处理代码集锦-----Sdcard相关

本文介绍了如何检测Android设备上的SD卡是否可用、获取SD卡及手机内部存储的可用空间大小等实用方法。同时,还提供了判断存储空间是否满足特定需求的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值