package com.mogoo.launcher2;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.ActivityManager;
import android.app.Service;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.IBinder;
import android.provider.Browser;
import android.util.Log;
/**
* ϵͳ�ڴ��Ż�����
* �����ڵ��ڴ�ʱ�������÷���
* @author xiejianxiong
* @date 2012-4-9
*
*/
public class SystemOptimizationService extends Service{
private static String TAG = "SystemOptimizationService";
private static ArrayList<String> proccessNames;
private static ArrayList<String> protectApps;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
proccessNames = getProccessNames();
protectApps = getProtectApps();
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
synchronized (this) {
startOptimization();
if(getAvailMemory() <= 24){
startOptimization();
}
}
super.onStart(intent, startId);
}
/**
* ��ݰ������жϸó����Ƿ���Ա�Kill
* @param packageName
* @param paramContext
* @return
*/
private boolean iskill(String packageName){
PackageManager pm = getApplicationContext().getPackageManager();
try
{
packageName = pm.getApplicationInfo(packageName, PackageManager.GET_DISABLED_COMPONENTS).packageName;
int result = pm.checkPermission("android.permission.BIND_DEVICE_ADMIN", packageName);
if (result != 0){
if(!isImportance(packageName)){
return true;
}
}
}
catch (Exception localException)
{
System.out.println("i have trouble when judgekill");
localException.printStackTrace();
}
return false;
}
/**
* ��ʼ�Ż��ڴ�
*/
private void startOptimization(){
Context context = getApplicationContext();
long killBeforeMemory = getAvailMemory();
// Log.i(TAG, "xjx--before availMemory:"+getAvailMemory()+" MB/"+getTotalMemory()+" MB");
ActivityManager activityManager = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runApps = activityManager.getRunningAppProcesses();
int length = runApps.size();
for(int i=0; i<length; i++){
if(runApps.get(i).importance > RunningAppProcessInfo.IMPORTANCE_SERVICE){
String pkgs[] = runApps.get(i).pkgList;
for(String packageName: pkgs){
if(iskill(packageName)){
Log.i(TAG, "xjx--kill packageName:"+packageName);
activityManager.killBackgroundProcesses(packageName);
}
}
}
}
Browser.clearHistory(context.getContentResolver());
Browser.clearSearches(context.getContentResolver());
// new SearchRecentSuggestions(context, "browser", SearchRecentSuggestions.QUERIES_PROJECTION_DATE_INDEX).clearHistory();
long releaseCount = 0;
releaseCount = getAvailMemory() - killBeforeMemory;
Log.i(TAG, "xjx--after availMemory:"+getAvailMemory()+" MB/"+getTotalMemory()+" MB");
Log.i(TAG, "xjx--release memory:"+ releaseCount+" MB");
}
/**
* �����ܱ�����Ӧ��
* @return
*/
private ArrayList<String> getProtectApps(){
ArrayList<String> arryList = new ArrayList<String>();
arryList.add("android.process.acore");
arryList.add("android.process.media");
arryList.add("com.google.process.gapps");
arryList.add("com.android.alarmclock");
arryList.add("com.android.mms");
arryList.add("com.google.android.gm");
arryList.add("com.android.phone");
arryList.add("com.android.providers.telephony");
arryList.add("com.android.contacts");
arryList.add("com.android.providers.contacts");
arryList.add("com.android.launcher");
arryList.add("com.android.providers.applications");
arryList.add("com.android.providers.media");
arryList.add("com.android.providers.downloads");
arryList.add("com.google.android.providers.gmail");
arryList.add("com.android.voicedialer");
arryList.add("com.android.bluetooth");
arryList.add("com.android.settings");
arryList.add("com.android.providers.userdictionary");
arryList.add("com.android.providers.drm");
arryList.add("com.svox.pico");
arryList.add("com.android.providers.downloads");
arryList.add("com.android.googlesearch");
arryList.add("com.mogoo.launcher");
return arryList;
}
/**
* ��ȡ��ؽ�̵����
* @return
*/
private ArrayList<String> getProccessNames(){
Context context = getApplicationContext();
Intent intent = null;
List<ResolveInfo> listmain = null;
PackageManager localPackageManager = context.getPackageManager();
intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
listmain = localPackageManager.queryBroadcastReceivers(intent, 512);
intent = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512)) ;
intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.NEW_OUTGOING_CALL");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.WALLPAPER_CHANGED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.ACTION_POWER_CONNECTED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.PROVIDER_CHANGED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.ACTION_SHUTDOWN");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.GTALK_CONNECTED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.SCREEN_OFF");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.INPUT_METHOD_CHANGED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.PACKAGE_DATA_CLEARED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.REBOOT");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.CALL");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.TIMEZONE_CHANGED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.TIME_SET");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.TIME_TICK");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
intent = new Intent("android.intent.action.DATE_CHANGED");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
//��appwidget���
intent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
listmain.addAll(localPackageManager.queryBroadcastReceivers(intent, 512));
ArrayList<String> proccessNames = new ArrayList<String>();
for(int i=0; i<listmain.size(); i++){
String name = listmain.get(i).activityInfo.processName;
proccessNames.add(name);
}
return proccessNames;
}
/**
* �ж�ij��Ӧ���Ƿ���Ҫ
* @return
*/
private boolean isImportance(String packageName){
if(!proccessNames.contains(packageName) && ! protectApps.contains(packageName)){
return false;
}
else{
return true;
}
}
/**
* ��ȡ���ڴ�Ĵ�С
* @param context
* @return
*/
private long getTotalMemory(){
String str1 = "/proc/meminfo";// ϵͳ�ڴ���Ϣ�ļ�
String str2;
String[] arrayOfString;
long initial_memory = 0;
try
{
FileReader localFileReader = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(
localFileReader, 8192);
str2 = localBufferedReader.readLine();// ��ȡmeminfo��һ�У�ϵͳ���ڴ��С
arrayOfString = str2.split("\\s+");
for (String num : arrayOfString) {
Log.i(str2, num + "\t");
}
initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// ���ϵͳ���ڴ棬��λ��KB������1024ת��ΪByte
localBufferedReader.close();
} catch (IOException e) {
}
//return Formatter.formatFileSize(context, initial_memory);// Byteת��ΪKB����MB���ڴ��С���
return initial_memory/(1024*1024);
}
/**
* ��ȡ��ǰϵͳ�����ڴ�Ĵ�С
* @param context
* @return
*/
private long getAvailMemory(){
Context context = getApplicationContext();
// ��ȡandroid��ǰ�����ڴ��С
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
//return Formatter.formatFileSize(context, mi.availMem);// ����ȡ���ڴ��С���
return mi.availMem/(1024*1024);
}
}