您的位置:首页 > 其它

[安卓]手机管家(二十) 缓存清理

2015-06-27 10:09 302 查看
来一个生成缓存的应用

在cachedir下写点东西就好

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="77dp"
android:text="Button"
android:onClick="makecache"/>


public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getCache();
}
public void makecache(View v){
File file = new File(getCacheDir()+"/cache.txt");
try {
FileWriter fw = new FileWriter(file);
fw.write("hello world");
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取当前缓存信息
public void getCache(){

}
}


用到反射知识

这里还需要aidl,注意包名



获得缓存信息

//获取当前缓存信息
public void getCache(){
PackageManager pm = getPackageManager();
try {
//获得字节码
Class<?> loadclass = MainActivity.class.getClassLoader().loadClass("android.content.pm.PackageManager");
Method method = loadclass.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);
method.invoke(pm, "com.example.makecache",new MyPackageManagerObserver());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class MyPackageManagerObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
// TODO Auto-generated method stub
long cache = pStats.cacheSize; //byte
long data = pStats.dataSize;
long code = pStats.codeSize;

String cacheString = Formatter.formatFileSize(getApplicationContext(), cache);
String dataString = Formatter.formatFileSize(getApplicationContext(), data);
String codeString = Formatter.formatFileSize(getApplicationContext(), code);

System.out.println("MainActivity.MyPackageManagerObserver.onGetStatsCompleted()"
+"cache: "+cacheString
+"data: "+dataString
+"code: "+codeString);
}
}


我们是要PackageManager下的getPackageSizeInfo方法,但是这个方法比较敏感,有一个hidden标签,是被隐藏的,不能通过常用的调用方法去获取,所以需要反射,通过他的字节码去找到他,用到了getmethod方法,然后通过invoke去调用,第二个参数表示包名,第三个参数表示一个observer,这个observer里有一个callback,前面你获取到包名什么的,我来计算,所以在手机上打开setting里的APP查看缓存信息时,过一会才有,是在计算信息



权限 获得缓存信息是比较敏感的,只有通过反射才能搞到,权限是必须的

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>


以上是demo,现在来做做看

关于布局,其中有一个进度条ProgressBar,一半默认是圆圈,这里做成长条形,需要定义其风格

另外 layer-list

将多个图片或上面两种效果按照顺序层叠起来,这需要单独定义一个XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:layout_width="fill_parent"
android:layout_height="60dp"
android:text="缓存清理"
android:background="#00FF00"
android:gravity="center"
android:textSize="25sp"/>
<ProgressBar
android:id="@+id/pb_clearcache_scan"
android:progressDrawable="@drawable/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/tv_cacheclear_scanning"
android:singleLine="true"/>
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="清理缓存"
android:onClick="clearall"
android:visibility="gone"
android:layout_gravity="center_horizontal"
android:id="@+id/bt_cacheclear_clearall"/>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/lv_clearcache_cachelist"/>
</LinearLayout>
在drawable中定义的layer-list



<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<bitmap android:src="@drawable/security_progress_bg"/>
</item>

<item android:id="@android:id/secondaryProgress">
<bitmap android:src="@drawable/security_progress"/>
</item>

<item android:id="@android:id/progress">
<bitmap android:src="@drawable/security_progress"/>
</item>
</layer-list>


CleanCacheActivity架子

public class CleanCacheActivity extends Activity {
private ProgressBar pb_clearcache_scan;
private ListView lv_clearcache_cachelist;
private TextView tv_cacheclear_scanning;
private Button bt_cacheclear_clearall;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cacheclear);

pb_clearcache_scan = (ProgressBar) findViewById(R.id.pb_clearcache_scan);
tv_cacheclear_scanning = (TextView) findViewById(R.id.tv_cacheclear_scanning);
lv_clearcache_cachelist = (ListView) findViewById(R.id.lv_clearcache_cachelist);
bt_cacheclear_clearall = (Button) findViewById(R.id.bt_cacheclear_clearall);

getAllCache();
}
//获取当前APP缓存
private void getAllCache() {
// TODO Auto-generated method stub

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: