缓存清理&流量统计&SlidingDrawer&捕获全局异常


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.在项目 安全卫士  移植(代码 +配置)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值