1. 缓存清理
缓存:以文件/数据库的方式 保存数据。 垃圾文件。
清理不需要的文件 腾出存储空间。
学习 新闻客户端 网易 百度新闻 360新闻 腾讯新闻 今日头条
① 创建activity a.继承 b.重写 c.配置 d.启动 布局
② 旋转特效
旋转 1.RoateAnimation
2.自定progressBar
indeterminateDrawable 动态图
determin
in否定
style | 1.控件 重用属性 2.activity app phone theme 作用范围 |
|
|
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/rotate"
android:pivotX="50%"
android:pivotY="50%" />
<!-- pivot轴 中点 -->
<ProgressBar
android:id="@+id/progress"
android:indeterminateDrawable="@drawable/progressbar_indeterminate_drawable"
③ 获取缓存信息的集合
a. 缓存操作 data/data/包名/cache
com.sankuai.meituan
清理系统 | 所有已经安装的apk 的cache删除
|
读取缓存大小 | caceh大小 超级模拟器:cahce 空文件=12K 安卓 cache=0; |
删除
| 指删除cache文件夹
|
公开api | android.jar 开发者可以调用的api |
非公开api | 开发者不能显示调用 文档也不会有
1.com.android.internal.* 永远不公开 2.@hide 暂不稳定 暂不公开 |
反射调用 | Class+method+Field |
java接口 |
1.interface Button OnClickListner 1.1 实现 1.2 转换类型 2.aidl 描述文件生成的接口 不能使用强转 复制指定的包名底下 由eclipse 自动生成 接口+默认实现(Stub) |
*
* @hide
*/
public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
}
DELETE_CACHE_FILES 只厂商的预装软件才能 system/app
* @hide
*/
public abstract void deleteApplicationCacheFiles(String packageName,
IPackageDataObserver observer);
删除所有应用程序 data/data/包名/cache
* @hide
*/
public abstract void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer);
④ 获取system/app data/app所有应用对应的data/data/包名/cache
⑤ 逐个获取应用缓存
⑥ 显示列表ListView
public class CacheUtils {
/**
* 读取指定 应用的缓存Cache
*/
public static void getCacheFileSize(final Context context, final ApkInfo info,final List<ApkInfo> list) {
try {
PackageManager pm = context.getPackageManager();
// PackageManager
// 获取类文件
Class<?> clz = PackageManager.class;
Method getPackageSizeInfo = clz.getDeclaredMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
// 观察文件目录 大小的计算完毕
IPackageStatsObserver observer = new IPackageStatsObserver.Stub() {
// PackageStats:缓存大小的封装对象 cache size
// 读取目录 下的所有文件大小
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
// Log.i("wzx", succeeded + "---" + pStats.cacheSize);
info.cacheSize = pStats.cacheSize;
if(info.cacheSize==0)
{
//不显示
}else
{
//显示
list.add(info);
}
// Log.i("wzx", succeeded + "---" +
// Formatter.formatFileSize(context, pStats.cacheSize));
}
};
// 调用实例方法
getPackageSizeInfo.invoke(pm, info.packagename, observer);
// Log.i("wzx", getPackageSizeInfo + "");
// *
// * @hide
// */
// public void getPackageSizeInfo(String packageName,
// IPackageStatsObserver observer) {
// getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 清理所有的应用程序 的cache
*/
public static void deleteAllAppCaches(Context context) {
try {
// * @hide
// */
// Observer 获取操作结束后信号
// 清除所有应用程序的 cache 100M
// 10000000M 0M
// public abstract void freeStorageAndNotify(long freeStorageSize,
// IPackageDataObserver observer);
// 获取Class
Class<?> clz = PackageManager.class;
// 获取Method
Method freeStorageAndNotify = null;
Method[] methods = clz.getDeclaredMethods();
for (Method m : methods) {
if ("freeStorageAndNotify".equals(m.getName())) {
freeStorageAndNotify = m;
break;
}
}
// 获取实例
PackageManager pm = context.getPackageManager();
IPackageDataObserver observer = new IPackageDataObserver.Stub() {
// 处理完成后的信号
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
Log.i("wzx", "清理完毕!现在手机非常干净.");
}
};
// 调用
freeStorageAndNotify.invoke(pm, new Object[] { Long.MAX_VALUE, observer });
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 流量统计
需求:帮助用户监控流量的使用情况。
创建Activity 布局
获取流量信息的集合
使用ListView+BaseAdapter
//偶数为蓝
if(position%2==0)
{
view.setBackgroundColor(Color.parseColor("#2CB9E4"));
}else
{
view.setBackgroundColor(Color.parseColor("#363636"));
}
//#363636
原理 :android linux (cpu 内存 流量存在uid_stat proc 在手机重启会重置为0+Sqlite) -->
以文件保存应用的流量,一个应用有一个编号 直接 做文件夹名称
一个文夹会有两个文件 1.保存发送tcp_snd 2.保存接收tcp_rcv
流量查询 对uid_stat 数据遍历
TrafficStats 有一个流量的工具类
shell@hlte:/proc/uid_stat $ ls
shell@hlte:/proc/uid_stat/10319 $ ls
ls
tcp_rcv
tcp_snd
cat tcp_snd
34900
//流量
//uid
long download=TrafficStats.getUidRxBytes(applicationInfo.uid);//应用编号 返回-1 不支持
bean.mobileDownloadSize=(download==-1?0:download);
long upload=TrafficStats.getUidTxBytes(applicationInfo.uid);//应用编号 返回-1 不支持
bean.mobileUpdateloadSize=(upload==-1?0:upload);
//总流量
bean.mobileTotalSize=bean.mobileDownloadSize+bean.mobileUpdateloadSize;
3. 杂项
3.1. SlidingDrawer
概念:一个抽屉的布局 通过拖动控制显示范围
android.jar 不使用全部的类名
<!-- 放个 抽屉控件 -->
<SlidingDrawer
android:layout_width="match_parent"
android:handle="@+id/hand" 把手
android:content="@+id/content" 内容
android:orientation="vertical" 方向
android:layout_height="0dp"
android:layout_weight="1" >
<!-- 把手 -->
<ImageView
android:id="@+id/hand"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/main_bottom_slidingdrawer_bg" />
<RelativeLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/temp" />
</SlidingDrawer>
3.2. 捕获全局异常
① 创建Application
② 注异常处理器
③ 收集日志- 友盟错误 用户机型 厂商 4.3 eception
StringWriter | 往内存里拼接字符串 StringBuffer |
PrintWriter | 往文件里面写入字符的工具
|
④ 提交服务器
3.3. sdk广告统计
广告主 --》sdk 广告集成包
开发者 --》
1.注册 账号 应用编号app_key 密钥 68e2054ee071772d 331aa658a3c42dad
2.下载sdk 集成 a.分析清理 --》封装一个工具 --》集成 eclipse 不兼容
删除 包 res 功能清单
3.因为广告api通用性不强 直接封装成工具 【注意:封装成工具类 写一个页面】
4.在项目 安全卫士 移植(代码 +配置)