1. 程式人生 > >Android系統級開發程序清理功能的一些記錄和發現

Android系統級開發程序清理功能的一些記錄和發現

Android系統級開發清理功能的一些記錄和發現

  • 客戶需求做一鍵清理所有後臺程序的功能,在查閱網上相關部落格以及自己研究以後找到以下幾種方法:

killBackgroundProcesses()

這種方式比較常規,packageName是需要停止的應用的包名,但這種方式實測之後程序有很大概率重啟。(不能完全殺死程序)

ActivityManager.killBackgroundProcesses(packageName);//packageName為所需要停止的包名

此方法需要許可權:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"
/>

forceStopPackage()

 這種方式在系統級應用中才有作用,可以完全殺死任何程序,但是無法移除其在近期任務列表(RecentsActivity)中的顯示,因此使用者開啟近期任務列表,還是能看到該應用的入口,點選後可以重新進入應用,影響使用者體驗。
    Method method = null;
        method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);
        if (method != null
) { method.setAccessible(true); for (String mcleanApp : cleanApp) { method.invoke(activityManager, mcleanApp); //packageName是需要強制停止的應用程式包名 } }
這種方式需要新增許可權:   
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"/>
因為是系統許可權,因此新增後會飄紅,不用理會,可以編譯過。
同時在application的節點處新增android:sharedUserId="android.uid.system",讓你的應用執行在系統程序。
  <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:sharedUserId="android.uid.system"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

Android.mk檔案的配置如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := phoneclean-release
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
#LOCAL_MULTILIB := 32
include $(BUILD_PREBUILT)

這種方式需要你的app作為系統內建應用才有效果,親測如果缺少以上任意配置,無法起到殺死程序的效果。

onTaskViewDismissed

做應用層開發的小夥伴可能對這個方法比較陌生,這是近期任務列表RecentsView的一個方法,用於移除顯示的程序view,移除後,該程序也終止,因此能起到殺死程序的作用。這個方法的用法如下:
if((t.key.baseIntent.getComponent().getPackageName()).equals(packagename)){
                       mRecentsView.onTaskViewDismissed(t);
   }

這裡的t是Task,即任務棧裡的每一個任務,要獲取RecentsView裡的所有Task只需兩層for迴圈即可搞定,方法如下:

for (int i = 0; i < stacks.size(); i++) {
                   TaskStack stack = stacks.get(i);
                   ArrayList<Task> tasks = stack.getTasks();
                   int taskCounts = tasks.size();
                   for (int j = 0; j < taskCounts; j++) 
                       Task t = tasks.get(j);
                       if((t.key.baseIntent.getComponent().getPackageName()).equals(packagename)){
                       mRecentsView.onTaskViewDismissed(t);
                       }                                           
         }

需要做一鍵清理功能的同學可以直接在RecentsView定義方法來實現,用意思挨個獲取的方法效率不高,以上為博主需要清理特定應用才如上實現。

Other

除了上述幾種方式外,還有其他幾種方法,例如android.os.Process.killProcess等,請查閱網上相關資料即可。另外,博主在開發過程中未發現應用級app能完全清理掉程序的方法,如有大神知道,還望不吝賜教,以上內容如有錯誤,還望指出。(據同事說還有一種在手機root後呼叫root許可權去清理,待博主去驗證一下。)