package com.yzy.supercleanmaster.service;
import android.app.ActivityManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.text.format.Formatter;
import android.util.Log;
import android.widget.Toast;
import com.yzy.supercleanmaster.R;
import com.yzy.supercleanmaster.bean.AppProcessInfo;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class CoreService extends Service {
public static final String ACTION_CLEAN_AND_EXIT = "com.yzy.service.cleaner.CLEAN_AND_EXIT";
private static final String TAG = "CleanerService";
private OnPeocessActionListener mOnActionListener;
private boolean mIsScanning = false;
private boolean mIsCleaning = false;
ActivityManager activityManager = null;
List<AppProcessInfo> list = null;
PackageManager packageManager = null;
Context mContext;
public static interface OnPeocessActionListener {
public void onScanStarted(Context context);
public void onScanProgressUpdated(Context context, int current, int max);
public void onScanCompleted(Context context, List<AppProcessInfo> apps);
public void onCleanStarted(Context context);
public void onCleanCompleted(Context context, long cacheSize);
}
public class ProcessServiceBinder extends Binder {
public CoreService getService() {
return CoreService.this;
}
}
private ProcessServiceBinder mBinder = new ProcessServiceBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
mContext = getApplicationContext();
try {
activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
packageManager = getApplicationContext()
.getPackageManager();
} catch (Exception e) {
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String action = intent.getAction();
if (action != null) {
if (action.equals(ACTION_CLEAN_AND_EXIT)) {
setOnActionListener(new OnPeocessActionListener() {
@Override
public void onScanStarted(Context context) {
}
@Override
public void onScanProgressUpdated(Context context, int current, int max) {
}
@Override
public void onScanCompleted(Context context, List<AppProcessInfo> apps) {
// if (getCacheSize() > 0) {
// cleanCache();
// }
}
@Override
public void onCleanStarted(Context context) {
}
@Override
public void onCleanCompleted(Context context, long cacheSize) {
String msg = getString(R.string.cleaned, Formatter.formatShortFileSize(
CoreService.this, cacheSize));
Log.d(TAG, msg);
Toast.makeText(CoreService.this, msg, Toast.LENGTH_LONG).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
stopSelf();
}
}, 5000);
}
});
scanRunProcess();
}
}
return START_NOT_STICKY;
}
private class TaskScan extends AsyncTask<Void, Integer, List<AppProcessInfo>> {
private int mAppCount = 0;
@Override
protected void onPreExecute() {
if (mOnActionListener != null) {
mOnActionListener.onScanStarted(CoreService.this);
}
}
@Override
protected List<AppProcessInfo> doInBackground(Void... params) {
list = new ArrayList<AppProcessInfo>();
ApplicationInfo appInfo = null;
AppProcessInfo abAppProcessInfo = null;
List<ActivityManager.RunningAppProcessInfo> appProcessList = activityManager
.getRunningAppProcesses();
publishProgress(0, appProcessList.size());
for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
publishProgress(++mAppCount, appProcessList.size());
abAppProcessInfo = new AppProcessInfo(
appProcessInfo.processName, appProcessInfo.pid,
appProcessInfo.uid);
try {
appInfo = packageManager.getApplicationInfo(appProcessInfo.processName, 0);
if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
abAppProcessInfo.isSystem = true;
} else {
abAppProcessInfo.isSystem = false;
}
Drawable icon = appInfo.loadIcon(packageManager);
String appName = appInfo.loadLabel(packageManager)
.toString();
abAppProcessInfo.icon = icon;
abAppProcessInfo.appName = appName;
} catch (PackageManager.NameNotFoundException e) {
// e.printStackTrace();
// :服务的命名
if (appProcessInfo.processName.indexOf(":") != -1) {
appInfo = getApplicationInfo(appProcessInfo.processName.split(":")[0]);
if (appInfo != null) {
Drawable icon = appInfo.loadIcon(packageManager);
abAppProcessInfo.icon = icon;
}else{
abAppProcessInfo.icon = mContext.getResources().getDrawable(R.drawable.ic_launcher);
}
}else{
abAppProcessInfo.icon = mContext.getResources().getDrawable(R.drawable.ic_launcher);
}
abAppProcessInfo.isSystem = true;
abAppProcessInfo.appName = appProcessInfo.processName;
}
long memsize = activityManager.getProcessMemoryInfo(new int[]{appProcessInfo.pid})[0].getTotalPrivateDirty() * 1024;
abAppProcessInfo.memory = memsize;
list.add(abAppProcessInfo);
}
return list;
}
@Override
protected void onProgressUpdate(Integer... values) {
if (mOnActionListener != null) {
mOnActionListener.onScanProgressUpdated(CoreService.this, values[0], values[1]);
}
}
@Override
protected void onPostExecute(List<AppProcessInfo> result) {
if (mOnActionListener != null) {
mOnActionListener.onScanCompleted(CoreService.this, result);
}
mIsScanning = false;
}
}
public void scanRunProcess() {
// mIsScanning = true;
new TaskScan().execute();
}
public void killBackgroundProcesses(String processName) {
// mIsScanning = true;
String packageName = null;
try {
if (processName.indexOf(":") == -1) {
packageName = processName;
} else {
packageName = processName.split(":")[0];
}
activityManager.killBackgroundProcesses(packageName);
//
Method forceStopPackage = activityManager.getClass()
.getDeclaredMethod("forceStopPackage", String.class);
forceStopPackage.setAccessible(true);
forceStopPackage.invoke(activityManager, packageName);
} catch (Exception e) {
e.printStackTrace();
}
}
private class TaskClean extends AsyncTask<Void, Void, Long> {
@Override
protected void onPreExecute() {
if (mOnActionListener != null) {
mOnActionListener.onCleanStarted(CoreService.this);
}
}
@Override
protected Long doInBackground(Void... params) {
long beforeMemory = 0;
long endMemory = 0;
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
beforeMemory = memoryInfo.availMem;
List<ActivityManager.RunningAppProcessInfo> appProcessList = activityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo info : appProcessList) {
killBackgroundProcesses(info.processName);
}
activityManager.getMemoryInfo(memoryInfo);
endMemory = memoryInfo.availMem;
return endMemory - beforeMemory;
}
@Override
protected void onPostExecute(Long result) {
if (mOnActionListener != null) {
mOnActionListener.onCleanCompleted(CoreService.this, result);
}
}
}
public long getAvailMemory(Context context) {
// 获取android当前可用内存大小
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
// 当前系统可用内存 ,将获得的内存大小规格化
return memoryInfo.availMem;
}
public void cleanAllProcess() {
// mIsCleaning = true;
new TaskClean().execute();
}
public void setOnActionListener(OnPeocessActionListener listener) {
mOnActionListener = listener;
}
public ApplicationInfo getApplicationInfo( String processName) {
if (processName == null) {
return null;
}
List<ApplicationInfo> appList = packageManager
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
for (ApplicationInfo appInfo : appList) {
if (processName.equals(appInfo.processName)) {
return appInfo;
}
}
return null;
}
public boolean isScanning() {
return mIsScanning;
}
public boolean isCleaning() {
return mIsCleaning;
}
}