[安卓]手机管家(二十) 缓存清理
2015-06-27 10:09
302 查看
来一个生成缓存的应用
在cachedir下写点东西就好
用到反射知识
这里还需要aidl,注意包名
获得缓存信息
我们是要PackageManager下的getPackageSizeInfo方法,但是这个方法比较敏感,有一个hidden标签,是被隐藏的,不能通过常用的调用方法去获取,所以需要反射,通过他的字节码去找到他,用到了getmethod方法,然后通过invoke去调用,第二个参数表示包名,第三个参数表示一个observer,这个observer里有一个callback,前面你获取到包名什么的,我来计算,所以在手机上打开setting里的APP查看缓存信息时,过一会才有,是在计算信息
权限 获得缓存信息是比较敏感的,只有通过反射才能搞到,权限是必须的
以上是demo,现在来做做看
关于布局,其中有一个进度条ProgressBar,一半默认是圆圈,这里做成长条形,需要定义其风格
另外 layer-list
将多个图片或上面两种效果按照顺序层叠起来,这需要单独定义一个XML
CleanCacheActivity架子
在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 } }
相关文章推荐
- iPhone6 6+屏幕尺寸返回320的一种原因
- easy=ui 树形结构案例
- js基础1-深入理解javascript之this
- 认识自己——恐惧的奴隶4:爸爸
- Ogre出现”…The minimum corner of the box must be less than or equal to maximum corner”错误
- js刷新页面方法大全
- 杭电ACM1197——Specialized Four-Digit Numbers
- How does the compilation/linking process work?
- 呼叫保持
- 深入理解javascript之this
- 百度贴吧楼层评论地址
- 20150623 javascript实现的简单刷贴
- static
- python 时间处理
- struts2整合json出现no result type defined for type 'json'的解决方法
- sgu 271
- sgu 271 分类: sgu templates 2015-06-27 10:05 22人阅读 评论(0) 收藏
- C++经典面试题(二)
- 计算机类产品评价技术指标体系研究之存储篇
- linux 查看参数