Android ActivityManager使用案例詳解
前言
Activity可以獲取運(yùn)行中的應(yīng)用信息,可以獲取到servcie,process,app,memory,Task信息等。
獲取信息
- ActivityManager.MemoryInfo
MemoryInfo中重要的字段:availMem(系統(tǒng)可用內(nèi)存),totalMem(總內(nèi)存),threshold(低內(nèi)存閾值,即低內(nèi)存的臨界線),lowMemory(是否為低內(nèi)存狀態(tài)) - Debug.MemoryInfo
Debug.MemoryInfo主要用于獲取進(jìn)程下的內(nèi)存信息。 - ActivityManager.RunningAppProcessInfo
封裝運(yùn)行進(jìn)程的信息,相關(guān)字段:processName(進(jìn)程名),pid(進(jìn)程pid),uid(進(jìn)程uid),pkgList(該進(jìn)程下所有的包)。 - ActivityManager.RunningServiceInfo
用于封裝運(yùn)行的服務(wù)信息,但是其中除了服務(wù)進(jìn)程信息外還有一些其它信息,activeSince(第一次被激活的時(shí)間、方式),foreground(服務(wù)是否在后臺(tái)執(zhí)行)。 - ActivityManager.RunningTaskInfo
用于封裝Task信息,包含id(該任務(wù)的唯一標(biāo)識(shí)),baseActivity(該任務(wù)棧的基礎(chǔ)Activity),topActivity(該任務(wù)棧棧頂?shù)腁ctivity),numActivities(該任務(wù)棧中Activity數(shù)量),description(任務(wù)當(dāng)前狀態(tài)描述)等。
ActivityManager常用方法
- clearApplicationUserData() :用于清除用戶數(shù)據(jù),等同于在手機(jī)設(shè)置中清除用戶數(shù)據(jù)。
- addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) :為Activity創(chuàng)建新的任務(wù)棧,activity(需要?jiǎng)?chuàng)建任務(wù)棧的Activity),intent(用于跳轉(zhuǎn)頁(yè)面的Intent),description(描述信息),thumbnail(縮略圖)
- getDeviceConfigurationInfo () :獲取設(shè)備信息
- getLauncherLargeIconSize () : 獲取Launcher(啟動(dòng)器)圖標(biāo)大小
- getMemoryInfo (ActivityManager.MemoryInfo outInfo) : 獲取系統(tǒng)當(dāng)前內(nèi)存信息
- getProcessMemoryInfo():返回一個(gè)或者多個(gè)進(jìn)程使用內(nèi)存的情況
- getRunningAppProcesses() :獲取該設(shè)備上應(yīng)用程序進(jìn)程列表
- getAppTasks() :獲取當(dāng)前應(yīng)用任務(wù)列表
- isUserAMonkey() :是否用戶是一個(gè)猴子,用于判斷鍵盤(pán)是否被亂按
- killBackgroundProcesses(String packageName) :根據(jù)包名殺死對(duì)應(yīng)進(jìn)程
- getRunningTasks (int maxNum) :獲取正在運(yùn)行的任務(wù)列表
- getRecentTasks (int maxNum, int flags) :獲取用戶啟動(dòng)的任務(wù)列表
- getMyMemoryState (ActivityManager.RunningAppProcessInfo outState) :獲取該進(jìn)程的全局內(nèi)存狀態(tài)
判斷應(yīng)用是否在前臺(tái)運(yùn)行,應(yīng)用是否在運(yùn)行
//判斷應(yīng)用是否在前臺(tái)運(yùn)行
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("應(yīng)用在前臺(tái)執(zhí)行");
return true;
} else {
System.out.println("應(yīng)用在后臺(tái)執(zhí)行");
return false;
}
}
// 判斷應(yīng)用是否在運(yùn)行
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表示取的最大的任務(wù)數(shù),info.topActivity表示當(dāng)前正在運(yùn)行的Activity,info.baseActivity表示系統(tǒng)后臺(tái)有此進(jìn)程在運(yùn)行
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", "該程序正在運(yùn)行");
}else{
Log.i("ActivityService", "該程序沒(méi)有運(yùn)行");
}
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
我們需要定義一個(gè)自己的ActivityManager,并且在BaseActivity中的OnCreate方法里將啟動(dòng)的Activity通過(guò)我們自定義的ActivityManager把任務(wù)放入棧中,在onDestroy方法中將Activity退棧。
/**
* 用于管理Activity,獲取Activity
* 在結(jié)束一個(gè)activity后應(yīng)該判斷當(dāng)前棧是否為空,為空則將本類引用置為null,以便于虛擬機(jī)回收內(nèi)存
* 單例,調(diào)用 {@link #getActivityManager()} 獲取實(shí)例
* 成員變量 {@link #mActivityStack} 應(yīng)該與系統(tǒng)的回退棧保持一致,所以在啟動(dòng)activity的時(shí)候必須在其onCreate中
* 將該activity加入棧頂,在activity結(jié)束時(shí),必須在onDestroy中將該activity出棧
*/
public class ActivityManager {
private static ReStack<Activity> mActivityStack; //Activity棧
private static ActivityManager mInstance;
private ActivityManager() {
mActivityStack = new ReStack<>();
}
/**
* 獲取ActivityManager的單例.
*
* @return ActivityManager實(shí)例
*/
public static ActivityManager getActivityManager() {
if (mInstance == null) {
mInstance = new ActivityManager();
}
return mInstance;
}
/**
* 添加一個(gè)activity到棧頂.
*
* @param activity 添加的activity
*/
public void pushActivity(Activity activity) {
if (mActivityStack == null) {
mActivityStack = new ReStack<>();
}
mActivityStack.push(activity);
}
/**
* 獲取棧頂?shù)腁ctivity.
*
* @return 如果棧存在, 返回棧頂?shù)腶ctivity
*/
public Activity peekActivity() {
if (mActivityStack != null && !mActivityStack.isEmpty()) {
return mActivityStack.peek();
} else {
return null;
}
}
/**
* 結(jié)束當(dāng)前的activity,在activity的onDestroy中調(diào)用.
*/
public void popActivity() {
if (mActivityStack != null && !mActivityStack.isEmpty()) {
mActivityStack.pop();
}
//如果移除一個(gè)activity之后棧為空,將本類的引用取消,以便于讓虛擬機(jī)回收
if (mActivityStack != null && mActivityStack.isEmpty()) {
mInstance = null;
}
}
/**
* 結(jié)束最接近棧頂?shù)钠ヅ漕惷腶ctivity.
* 遍歷到的不一定是被結(jié)束的,遍歷是從棧底開(kāi)始查找,為了確定棧中有這個(gè)activity,并獲得一個(gè)引用
* 刪除是從棧頂查找,結(jié)束查找到的第一個(gè)
* 在activity外結(jié)束activity時(shí)調(diào)用
*
* @param klass 類名
*/
public void popActivity(Class<? extends BaseActivity> klass) {
for (Activity activity : mActivityStack) {
if (activity != null && activity.getClass().equals(klass)) {
activity.finish();
break; //只結(jié)束一個(gè)
}
}
}
//移除所有的Activity
public void removeAll(){
for (Activity activity : mActivityStack) {
if (activity != null) {
activity.finish();
break;
}
}
}
}
到此這篇關(guān)于Android ActivityManager使用案例詳解的文章就介紹到這了,更多相關(guān)Android ActivityManager使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載更多,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android實(shí)現(xiàn)登錄注冊(cè)頁(yè)面(下)
這篇文章主要介紹了Android實(shí)現(xiàn)登錄注冊(cè)頁(yè)面的第二篇,實(shí)現(xiàn)驗(yàn)證登錄和記住密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
Android PopWindow 設(shè)置背景亮度的實(shí)例
這篇文章主要介紹了Android PopWindow 設(shè)置背景亮度的實(shí)例的相關(guān)資料,這里提供實(shí)現(xiàn)方法,希望能幫助有所需要的朋友,需要的朋友可以參考下2017-08-08
Android AlertDialog對(duì)話框詳解及實(shí)例
這篇文章主要介紹了Android AlertDialog對(duì)話框詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問(wèn)題
這篇文章主要介紹了Android Studio新建工程默認(rèn)在build.gradle中加入maven阿里源的問(wèn)題,本文通過(guò)實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android使用LinearLayout設(shè)置邊框
這篇文章主要介紹了Android如何使用LinearLayout設(shè)置邊框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android中的RecyclerView新組件初步上手指南
RecyclerView是Android L版本開(kāi)始采用的一個(gè)組件,被人們認(rèn)為用來(lái)代替?zhèn)鹘y(tǒng)的ListView,下面我們就一起來(lái)看一下Android中的RecyclerView新組件初步上手指南2016-06-06
Android activity和view判斷滑動(dòng)
這篇文章主要介紹了Android activity和view判斷滑動(dòng)的相關(guān)資料,需要的朋友可以參考下2017-06-06

