1. 程式人生 > >【Android】一鍵清理後臺實現【附原始碼】

【Android】一鍵清理後臺實現【附原始碼】

整個程式很簡單

只有一個CleanActivity,實現清理後臺及並展示動畫效果

一個桌面小部件,點選啟動CleanActivity,實現同樣效果

一.  CleanActivity的實現

1.  主程式佈局

對應佈局為檔案為 R.layout.activity_clean
<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>
上述佈局只有一個ImageView,android:scaleType="centerInside" 這一行讓圖片自適應控制元件大小 AndroidManifest.xml 中將CleanActivity的主題設為背景透明,達到程式只顯示動畫的效果 android:theme="@android:style/Theme.Translucent.NoTitleBar"

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中
加入許可權  <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
/*
     * 殺死後臺程序
     */
    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);
          
    }
}

三.  效果圖


四、完整程式碼下載