您好,登錄后才能下訂單哦!
本篇內容介紹了“Android中ActivityManager實例用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Activity可以獲取運行中的應用信息,可以獲取到servcie,process,app,memory,Task信息等。
獲取信息
ActivityManager.MemoryInfo
MemoryInfo中重要的字段:availMem(系統可用內存),totalMem(總內存),threshold(低內存閾值,即低內存的臨界線),lowMemory(是否為低內存狀態)
Debug.MemoryInfo
Debug.MemoryInfo主要用于獲取進程下的內存信息。
ActivityManager.RunningAppProcessInfo
封裝運行進程的信息,相關字段:processName(進程名),pid(進程pid),uid(進程uid),pkgList(該進程下所有的包)。
ActivityManager.RunningServiceInfo
用于封裝運行的服務信息,但是其中除了服務進程信息外還有一些其它信息,activeSince(第一次被激活的時間、方式),foreground(服務是否在后臺執行)。
ActivityManager.RunningTaskInfo
用于封裝Task信息,包含id(該任務的唯一標識),baseActivity(該任務棧的基礎Activity),topActivity(該任務棧棧頂的Activity),numActivities(該任務棧中Activity數量),description(任務當前狀態描述)等。
ActivityManager常用方法
clearApplicationUserData() :用于清除用戶數據,等同于在手機設置中清除用戶數據。
addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) :為Activity創建新的任務棧,activity(需要創建任務棧的Activity),intent(用于跳轉頁面的Intent),description(描述信息),thumbnail(縮略圖)
getDeviceConfigurationInfo () :獲取設備信息
getLauncherLargeIconSize () : 獲取Launcher(啟動器)圖標大小
getMemoryInfo (ActivityManager.MemoryInfo outInfo) : 獲取系統當前內存信息
getProcessMemoryInfo():返回一個或者多個進程使用內存的情況
getRunningAppProcesses() :獲取該設備上應用程序進程列表
getAppTasks() :獲取當前應用任務列表
isUserAMonkey() :是否用戶是一個猴子,用于判斷鍵盤是否被亂按
killBackgroundProcesses(String packageName) :根據包名殺死對應進程
getRunningTasks (int maxNum) :獲取正在運行的任務列表
getRecentTasks (int maxNum, int flags) :獲取用戶啟動的任務列表
getMyMemoryState (ActivityManager.RunningAppProcessInfo outState) :獲取該進程的全局內存狀態
判斷應用是否在前臺運行,應用是否在運行
//判斷應用是否在前臺運行 public boolean isRunningForeground(Context context){ String packageName=getPackageName(context); String topActivityClassName=getTopActivityName(context); System.out.println("packageName="+packageName+",topActivityClassName="+topActivityClassName); if (packageName!=null&&topActivityClassName!=null&&topActivityClassName.startsWith(packageName)) { System.out.println("應用在前臺執行"); return true; } else { System.out.println("應用在后臺執行"); return false; } } // 判斷應用是否在運行 public boolean isRun(Context context,String mPackageName){ ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> list = am.getRunningTasks(100); boolean isAppRunning = false; //100表示取的最大的任務數,info.topActivity表示當前正在運行的Activity,info.baseActivity表示系統后臺有此進程在運行 for (RunningTaskInfo info : list) { if (info.topActivity.getPackageName().equals(mPackageName) || info.baseActivity.getPackageName().equals(mPackageName)) { isAppRunning = true; Log.i("ActivityService",info.topActivity.getPackageName() + " info.baseActivity.getPackageName()="+info.baseActivity.getPackageName()); break; } } if(isAppRunning){ Log.i("ActivityService", "該程序正在運行"); }else{ Log.i("ActivityService", "該程序沒有運行"); } return isAppRunning; } //獲取棧頂ActivityName public String getTopActivityName(Context context){ String topActivityClassName=null; ActivityManager activityManager = (ActivityManager)(context.getSystemService(android.content.Context.ACTIVITY_SERVICE )) ; List<runningtaskinfo> runningTaskInfos = activityManager.getRunningTasks(1) ; if(runningTaskInfos != null){ ComponentName f=runningTaskInfos.get(0).topActivity; topActivityClassName=f.getClassName(); } return topActivityClassName; } public String getPackageName(Context context){ String packageName = context.getPackageName(); return packageName; }
自定義ActivityManager管理Activity
??我們需要定義一個自己的ActivityManager,并且在BaseActivity中的OnCreate方法里將啟動的Activity通過我們自定義的ActivityManager把任務放入棧中,在onDestroy方法中將Activity退棧。
/** * 用于管理Activity,獲取Activity * 在結束一個activity后應該判斷當前棧是否為空,為空則將本類引用置為null,以便于虛擬機回收內存 * 單例,調用 {@link #getActivityManager()} 獲取實例 * 成員變量 {@link #mActivityStack} 應該與系統的回退棧保持一致,所以在啟動activity的時候必須在其onCreate中 * 將該activity加入棧頂,在activity結束時,必須在onDestroy中將該activity出棧 */ public class ActivityManager { private static ReStack<Activity> mActivityStack; //Activity棧 private static ActivityManager mInstance; private ActivityManager() { mActivityStack = new ReStack<>(); } /** * 獲取ActivityManager的單例. * * @return ActivityManager實例 */ public static ActivityManager getActivityManager() { if (mInstance == null) { mInstance = new ActivityManager(); } return mInstance; } /** * 添加一個activity到棧頂. * * @param activity 添加的activity */ public void pushActivity(Activity activity) { if (mActivityStack == null) { mActivityStack = new ReStack<>(); } mActivityStack.push(activity); } /** * 獲取棧頂的Activity. * * @return 如果棧存在, 返回棧頂的activity */ public Activity peekActivity() { if (mActivityStack != null && !mActivityStack.isEmpty()) { return mActivityStack.peek(); } else { return null; } } /** * 結束當前的activity,在activity的onDestroy中調用. */ public void popActivity() { if (mActivityStack != null && !mActivityStack.isEmpty()) { mActivityStack.pop(); } //如果移除一個activity之后棧為空,將本類的引用取消,以便于讓虛擬機回收 if (mActivityStack != null && mActivityStack.isEmpty()) { mInstance = null; } } /** * 結束最接近棧頂的匹配類名的activity. * 遍歷到的不一定是被結束的,遍歷是從棧底開始查找,為了確定棧中有這個activity,并獲得一個引用 * 刪除是從棧頂查找,結束查找到的第一個 * 在activity外結束activity時調用 * * @param klass 類名 */ public void popActivity(Class<? extends BaseActivity> klass) { for (Activity activity : mActivityStack) { if (activity != null && activity.getClass().equals(klass)) { activity.finish(); break; //只結束一個 } } } //移除所有的Activity public void removeAll(){ for (Activity activity : mActivityStack) { if (activity != null) { activity.finish(); break; } } } }
“Android中ActivityManager實例用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。