手机APP缓存的获取和清理功能的实现

package com.loaderman.appcachedemo;

import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.Bundle;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;

public class MainActivity extends AppCompatActivity {

    private PackageManager mPM;
    private Button btnCache;
    private Button btnClean;

    private long cacheSize;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //模拟缓存
        moniCache();
        btnCache = (Button) findViewById(R.id.btn_cache);
        btnClean = (Button) findViewById(R.id.btn_clean);
        mPM = getPackageManager();
    }

    private void moniCache() {
        //获取当前缓存路径: data/data/包名/cache
        File cacheDir = getCacheDir();
        //往缓存里面写点东西模拟
        File cacheFile = new File(cacheDir, "cache.txt");
        try {
            FileOutputStream out = new FileOutputStream(cacheFile);
            out.write("jfaklsdjfaklsdjfklasdjfkladsfjlkasdjflkasdflkasdjf".getBytes());
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void startScan(View view) {
        SaoMiaoCache();
    }
    private void SaoMiaoCache() {
        try {
            Method method = mPM.getClass().getMethod("getPackageSizeInfo",
                    String.class, IPackageStatsObserver.class);
                method.invoke(mPM, getPackageName(), new MyObserver());
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
    public void cleanCache(View view){
        try {
            Method method = mPM.getClass().getMethod
                    ("freeStorageAndNotify", long.class, IPackageDataObserver.class);
            method.invoke(mPM, Long.MAX_VALUE, new IPackageDataObserver.Stub() {
                //子线程
                @Override
                public void onRemoveCompleted(String packageName, boolean succeeded)
                        throws RemoteException {
                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           SaoMiaoCache();
                       }
                   });
                }

            });

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    class MyObserver extends IPackageStatsObserver.Stub {

        //在子线程运行
        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws
                RemoteException {
            //缓存大小
            cacheSize = pStats.cacheSize;
            System.out.println(cacheSize);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    btnCache.setText("缓存大小:" + Formatter.formatFileSize(getApplicationContext(), cacheSize));
                }
            });
        }
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.loaderman.appcachedemo.MainActivity">

    <Button
        android:id="@+id/btn_cache"
        android:onClick="startScan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="扫描缓存"/>
    <Button
        android:id="@+id/btn_clean"
        android:onClick="cleanCache"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清理缓存"/>
</LinearLayout>

添加权限:

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

在main下面创建aidl文件

新建包名为:android.content.pm

IPackageDataObserver.aidl
/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.content.pm;

/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}

IPackageStatsObserver.aidl

/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.content.pm;

import android.content.pm.PackageStats;
/**
 * API for package data change related callbacks from the Package Manager.
 * Some usage scenarios include deletion of cache directory, generate
 * statistics related to code, data, cache usage(TODO)
 * {@hide}
 */
oneway interface IPackageStatsObserver {

    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}

PackageStats.aidl

/* //device/java/android/android/view/WindowManager.aidl
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.content.pm;
parcelable PackageStats;

效果图:



跳到系统应用信息页面清理缓存的方法:

     //跳到系统应用信息页面
        Intent infoIntent = new Intent();
        infoIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);//Uri.parse
        // ("package:" + mCurrentInfo.packageName);
        infoIntent.setData(uri);
        startActivity(infoIntent);


手机APP缓存的获取和清理功能的实现

时间: 2024-10-06 10:10:06

手机APP缓存的获取和清理功能的实现的相关文章

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级

最新版勤哲Excel服务器V2016.12.0.292无限用户支持手机APP,微信,网页等功能不绑定电脑,任意安装,支持后续升级. 这个版本发布过之后,再发布新的版本需要到下个月的中下旬,老朋友可以使用本版本后面延续升级 目前有大约127家用户在用,没有修改过注册授权文件,系统非常成熟,推荐指数为五星,QQ:619920289 麦枫论坛http://www.mfsun.com 简介 EXCEL服务器作为一款客户化.综合性管理软件,它通过Excel就能构造出您自主的管理系统:同时,她也可将您公司现

手机app有了证件识别功能会怎样?

移动互联网的不断发展,给企业发展带来了更多机遇.越来越多的企业都开发出了自己的app,更加容易的去触达了用户.为了更能保证用户以及企业的信息安全,app基本都会有一个操作,那就是实名认证.不知道大家有没有体验过手工输入的信息的痛苦.输入麻烦不说,还需要反复的校验.自从有了手机app证件识别sdk出来之后,这个问题自然就迎刃而解! 一.证件识别SDK简介 证件识别SDK是基于手机客户端的相关服务的增加.使用和交付模式,通常涉及通过手机客户端来提供动态易扩展且经常是虚拟化的资源.过去在图中往往用云来

【Python】[技术博客] 一些使用Python编写获取手机App日志的操作

一些使用Python编写获取手机App日志的操作 如何获取手机当前打开的App的包名 如何获取当前App进程的PID 如何查看当前App的日志 如何将日志保存到文件 如何关闭进程 如何不显示命令行窗口 1.如何获取手机当前打开的App的包名 可以直接在命令行中输入adb shell dumpsys window | findstr mCurrentFocus 以手机QQ为例,读取到的mCurrentFocus的信息为 mCurrentFocus=Window{cb7270e u0 com.ten

【视频】手机APP功能、性能、自动化、专项测试

不过多解释,请点击链接看课程目录你就懂得了 移动手机APP测试从零开始(初级篇) http://edu.51cto.com/course/course_id-1923.html 移动手机APP测试从零开始(中级篇) http://edu.51cto.com/course/course_id-2078.html 移动手机APP测试从零开始(xx篇) 即将上线 移动手机APP测试从零开始(xx篇) 即将上线

手机app(功能)测试重点

在手机客户端进行查看的测试重点:1.“点击加载更多”的分页处理技术,是否有重复的数据,数据显示是否完整,到达最后一页后是否还有数据进行显示2.数据的排序方式2.界面跳转是否正确3.出现异常情况是否有提示,是否跳转到已经设定好的默认页面,如断网情况下,显示网络未连接,数据加载失败,或者如果此页面没有数据显示,显示友好提示信息.4.图片处理的地方,是否容易出现程序崩溃现象,主要是图片压缩机制5.前台展示的数据,后台进行变动(增.删.改),是否是实时更新还是app一开始运行再进行加载6.前台主动发出请

手机APP开发影响用户体验的几点“不规范之处”

手机APP开发影响用户体验的几点"不规范之处" APP开发和电脑程序开发截然不同,比如说:清理缓存等动作,在PC电脑中是个不起眼的小事,使用管家类产品一键就能清扫干净,但这在手机上并不是一件小事,因为随着智能手机降低了使用门槛,老人小孩都能用,但是他们对技术完全不懂,再者就是手机空间不足是天然瓶颈,不像电脑硬盘动辄1TB.2TB,国内80%的手机空间不足4GB,小编认为如果这么小的空间再被垃圾文件浪费掉,实在是不应该,如果app开发没有考虑这方面的问题,引起用户的手机卡顿,这个相当影响

转:浅谈手机app测试注意点

现在我们测试时,开发会先在本地机上打好测试包,自己安装,轮完一轮,开发修改好后,再打一个包.以下是功能测试时需要注意的点: 1.登录 ●登录用户名和密码错误时,界面有提示信息 ●用户主动退出登录后,下次启动APP时,应该进入登录界面 ●对于支持自动登录的APP,数据交换时  ,是否能自动登录成功且数据库操作无误 ●密码更改后,登录时是否做到了有效数据的校验 ●对于未登录时一些页面的操作,是否做了控制 ●切换账号登录,检验登录的信息是否做到及时更新 ●对于多个端都进行操作时,确保数据库操作无误,且

手机App测试要点分析

一 ?手机APP测试前的准备:手机APP测试,主要针对的是android和ios两大主流操作系统,主要考虑的就是功能性.兼容性.稳定性.易用性(也就是人机交互).性能.测试前的准备:1.使用同类型的产品,不仅仅是使用,应该是测试同类型的产品.2.熟悉我们产品的spec文档,积极和pm交流.3,写测试用例,没有时间至少要有一个checklist.二 ?手机APP测试测试要点:功能测试(流程测试.功能点测试).兼容性测试.交叉测试.安装卸载测试(包括应用的升级).压力测试(接口压力测试):功能测试:

微信开放平台手机APP支付

                PHP对接APP微信支付 微信开放平台手机APP支付总结 1. 微信开放平台手机APP支付总结 支付功能链接: https://pay.weixin.qq.com/wiki/doc/api/index.html APP支付功能文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3 Demo下载地址: https://pay.weixin.qq.com/wiki/doc/api/jsapi