public
class
CleanCacheActivity
extends
Activity {
protected
static
final
int
SCAN_STOP =
1
;
public
static
final
int
SEND_SCAN =
2
;
private
ProgressBar pb;
private
TextView tv_scan_cache;
private
FrameLayout fl_scan_states;
private
PackageManager pm;
private
ListView lv_scan_listview;
private
List<cacheholder>cache;
private
MyAdapter adapter;
/**
* 消息机制
*/
private
Handler handler=
new
Handler(){
public
void
handleMessage(android.os.Message msg) {
switch
(msg.what){
case
SCAN_STOP:
Toast.makeText(getApplicationContext(),
"扫描完毕"
,
0
).show();
fl_scan_states.setVisibility(View.GONE);
if
(cache.size()>
0
){
adapter=
new
MyAdapter();
lv_scan_listview.setAdapter(adapter);
}
else
{
ToastUtils.show(CleanCacheActivity.
this
,
"恭喜你,你的手机100分"
);
}
break
;
case
SEND_SCAN:
String appname=(String) msg.obj;
tv_scan_cache.setText(
"正在清理:"
+appname);
break
;
}
};
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_clean_cache);
pb=(ProgressBar) findViewById(R.id.pb);
tv_scan_cache=(TextView) findViewById(R.id.tv_scan_cache);
fl_scan_states=(FrameLayout) findViewById(R.id.fl_scan_states);
lv_scan_listview=(ListView) findViewById(R.id.lv_scan_listview);
pm=getPackageManager();
scanCache();
}
/**
* 扫描手机应用分别获取缓存信息
*/
private
void
scanCache() {
fl_scan_states.setVisibility(View.VISIBLE);
cache=
new
ArrayList<cacheholder>();
new
Thread(){
public
void
run() {
pb.setMax(
100
);
int
progress=
0
;
List<packageinfo>infos=pm.getInstalledPackages(
0
);
for
(PackageInfo info:infos){
try
{
String packagename=info.packageName;
Method method=PackageManager.
class
.getMethod(
"getPackageSizeInfo"
, String.
class
,IPackageStatsObserver.
class
);
method.invoke(pm,packagename,
new
MyObserver());
}
catch
(Exception e) {
e.printStackTrace();
}
progress++;
pb.setProgress(progress);
try
{
sleep(
50
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
Message msg=Message.obtain();
msg.what=SCAN_STOP;
handler.sendMessage(msg);
};
}.start();
}
private
class
MyObserver
extends
IPackageStatsObserver.Stub{
@Override
public
void
onGetStatsCompleted(PackageStats pStats,
boolean
succeeded)
throws
RemoteException {
try
{
Message msg=Message.obtain();
msg.what=SEND_SCAN;
String appname=pm.getPackageInfo(pStats.packageName,
0
).
applicationInfo.loadLabel(pm).toString();
msg.obj=appname;
handler.sendMessage(msg);
if
(pStats.cacheSize>
0
){
CacheHolder holder=
new
CacheHolder();
holder. cachesize=pStats.cacheSize;
holder. packName=pStats.packageName;
holder. icon=pm.getPackageInfo(holder. packName,
0
).applicationInfo.loadIcon(pm);
holder. appName=appname;
cache.add(holder);
}
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
private
class
CacheHolder{
long
cachesize;
String packName;
Drawable icon;
String appName;
}
/**
* listview的适配器
* @author Administrator
*
*/
private
class
MyAdapter
extends
BaseAdapter{
@Override
public
int
getCount() {
return
cache.size();
}
@Override
public
Object getItem(
int
position) {
return
null
;
}
@Override
public
long
getItemId(
int
position) {
return
0
;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if
(convertView!=
null
){
view=convertView;
holder=(ViewHolder) view.getTag();
}
else
{
holder=
new
ViewHolder();
view=View.inflate(getApplicationContext(), R.layout.item_cache_listview,
null
);
holder.icon=(ImageView) view.findViewById(R.id.img_icon);
holder.apname=(TextView) view.findViewById(R.id.tv_appname);
holder.cachesize=(TextView) view.findViewById(R.id.tv_cachesize);
holder.clearcache=(ImageView) view.findViewById(R.id.img_clear_button);
view.setTag(holder);
}
final
CacheHolder cacheholder=cache.get(position);
holder.icon.setImageDrawable(cacheholder.icon);
holder.apname.setText(cacheholder.appName);
holder.cachesize.setText(
"缓存大小"
+Formatter.formatFileSize(getApplicationContext(), cacheholder.cachesize));
holder.clearcache.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View arg0) {
Intent intent =
new
Intent();
intent.setAction(
"android.settings.APPLICATION_DETAILS_SETTINGS"
);
intent.addCategory(
"android.intent.category.DEFAULT"
);
intent.setData(Uri.parse(
"package:"
+cacheholder.packName));
startActivity(intent);
}
});
if
(cacheholder.cachesize==
0
){
cache.remove(cacheholder);
adapter.notifyDataSetChanged();
}
return
view;
}
}
private
class
ViewHolder{
ImageView icon;
TextView apname;
TextView cachesize;
ImageView clearcache;
}
class
ClearCacheObserver
extends
IPackageDataObserver.Stub {
public
void
onRemoveCompleted(
final
String packageName,
final
boolean
succeeded) {
ToastUtils.show(CleanCacheActivity.
this
,
"清除状态"
+succeeded);
}
}
/**
* 清理全部的缓存空间
* @param view
*/
public
void
AllClearCache(View view){
Method[] methods=PackageManager.
class
.getMethods();
for
(Method method:methods){
if
(
"freeStorageAndNotify"
.equals(method.getName())){
try
{
method.invoke(pm, Long.MAX_VALUE*
1024
,
new
ClearCacheObserver());
}
catch
(Exception e) {
e.printStackTrace();
}
scanCache();
return
;
}
}
}
}
</packageinfo></cacheholder></cacheholder>