【Android】一鍵清理後臺實現【附原始碼】
阿新 • • 發佈:2019-01-02
整個程式很簡單
只有一個CleanActivity,實現清理後臺及並展示動畫效果
一個桌面小部件,點選啟動CleanActivity,實現同樣效果
一. CleanActivity的實現
1. 主程式佈局
對應佈局為檔案為 R.layout.activity_clean上述佈局只有一個ImageView,android:scaleType="centerInside" 這一行讓圖片自適應控制元件大小 AndroidManifest.xml 中將CleanActivity的主題設為背景透明,達到程式只顯示動畫的效果 android:theme="@android:style/Theme.Translucent.NoTitleBar"<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="${packageName}.${activityClass}" > <ImageView android:id="@+id/imageView_rotate" android:layout_width="50dp" android:layout_height="50dp" android:scaleType="centerInside" android:src="@drawable/icon_anim" /> </RelativeLayout>
2. 動畫效果實現:
在res下新建anim目錄,新建一個clean_anim.xml來定義動畫效果:旋轉和放大<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="0.0" android:toXScale="1.4" android:fromYScale="0.0" android:toYScale="1.4" android:pivotX="50%" android:pivotY="50%" android:duration="500" /> <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromDegrees="0" android:toDegrees="+360" android:pivotX="50%" android:pivotY="50%" android:duration="2000" /> </set>
在CleanActivity.java的onCreate方法中載入動畫
rotateImage=(ImageView)findViewById(R.id.imageView_rotate); animation=AnimationUtils.loadAnimation(CleanActivity.this, R.anim.clean_anim);//載入動畫 rotateImage.setAnimation(animation);
3. 清理後臺功能實現
用ActivityManager物件獲取系統正在執行的程序 遍歷每個程序,在查詢每個程序下的相關程式包名(有些程序可能多個程式共享) 用killBackgroundProcesses()方法殺死該程序 這一方法需要在AndroidManifest.xml中/*
* 殺死後臺程序
*/
public void killAll(Context context){
//獲取一個ActivityManager 物件
ActivityManager activityManager = (ActivityManager)
getSystemService(Context.ACTIVITY_SERVICE);
//獲取系統中所有正在執行的程序
List<RunningAppProcessInfo> appProcessInfos = activityManager
.getRunningAppProcesses();
int count=0;//被殺程序計數
String nameList="";//記錄被殺死程序的包名
long beforeMem = getAvailMemory(CleanActivity.this);//清理前的可用記憶體
Log.i(TAG, "清理前可用記憶體為 : " + beforeMem);
for (RunningAppProcessInfo appProcessInfo:appProcessInfos) {
nameList="";
if( appProcessInfo.processName.contains("com.android.system")
||appProcessInfo.pid==android.os.Process.myPid())//跳過系統 及當前程序
continue;
String[] pkNameList=appProcessInfo.pkgList;//程序下的所有包名
for(int i=0;i<pkNameList.length;i++){
String pkName=pkNameList[i];
activityManager.killBackgroundProcesses(pkName);//殺死該程序
count++;//殺死程序的計數+1
nameList+=" "+pkName;
}
Log.i(TAG, nameList+"---------------------");
}
long afterMem = getAvailMemory(CleanActivity.this);//清理後的記憶體佔用
Toast.makeText(CleanActivity.this, "殺死 " + (count+1) + " 個程序, 釋放"
+ formatFileSize(afterMem - beforeMem) + "記憶體", Toast.LENGTH_LONG).show();
Log.i(TAG, "清理後可用記憶體為 : " + afterMem);
Log.i(TAG, "清理程序數量為 : " + count+1);
}
/*
* *獲取可用記憶體大小
*/
private long getAvailMemory(Context context) {
// 獲取android當前可用記憶體大小
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
return mi.availMem;
}
/*
* *字串轉換 long-string KB/MB
*/
private String formatFileSize(long number){
return Formatter.formatFileSize(CleanActivity.this, number);
}
二. 桌面小部件的實現
1. Widget的佈局widget_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical" >
<ImageButton
android:id="@+id/imageButton_widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:background="#00000000"
android:src="@drawable/icon_widget" />
</LinearLayout>
再新建一個widget_properties.xml定義外掛屬性
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="20dp"
android:minHeight="20dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget_layout"
>
</appwidget-provider>
minWidth和minHeight可以換算成桌面部件所佔格子數,這裡是1*1
updatePeriodMillis是部件的自動重新整理時間,不過本例不需要
2. 在application元素下注冊桌面外掛
<receiver
android:name="CleanWidget"
android:label="@string/widget_name"
android:icon="@drawable/icon_widget">
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_properties" />
</receiver>
3. 新建一個CleanWidget類繼承AppWidgetProvider來實現小部件功能
public class CleanWidget extends AppWidgetProvider{
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds ){
super.onUpdate(context, appWidgetManager, appWidgetIds);
Intent intent=new Intent(context,CleanActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.widget_layout);
remoteViews.setOnClickPendingIntent(R.id.imageButton_widget, pendingIntent);//imagebutton控制元件繫結監聽事件
//更新顯示
if(appWidgetIds.length>0)
for(int appWidgetId:appWidgetIds)
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
}