最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android ActivityManager使用案例詳解

 更新時間:2021年08月27日 15:29:27   作者:Wain丶  
這篇文章主要介紹了Android ActivityManager使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

前言

Activity可以獲取運行中的應(yīng)用信息,可以獲取到servcie,process,app,memory,Task信息等。

獲取信息

  1. ActivityManager.MemoryInfo
    MemoryInfo中重要的字段:availMem(系統(tǒng)可用內(nèi)存),totalMem(總內(nèi)存),threshold(低內(nèi)存閾值,即低內(nèi)存的臨界線),lowMemory(是否為低內(nèi)存狀態(tài))
  2. Debug.MemoryInfo
    Debug.MemoryInfo主要用于獲取進程下的內(nèi)存信息。
  3. ActivityManager.RunningAppProcessInfo
    封裝運行進程的信息,相關(guān)字段:processName(進程名),pid(進程pid),uid(進程uid),pkgList(該進程下所有的包)。
  4. ActivityManager.RunningServiceInfo
    用于封裝運行的服務(wù)信息,但是其中除了服務(wù)進程信息外還有一些其它信息,activeSince(第一次被激活的時間、方式),foreground(服務(wù)是否在后臺執(zhí)行)。
  5. ActivityManager.RunningTaskInfo
    用于封裝Task信息,包含id(該任務(wù)的唯一標(biāo)識),baseActivity(該任務(wù)棧的基礎(chǔ)Activity),topActivity(該任務(wù)棧棧頂?shù)腁ctivity),numActivities(該任務(wù)棧中Activity數(shù)量),description(任務(wù)當(dāng)前狀態(tài)描述)等。

ActivityManager常用方法

  • clearApplicationUserData() :用于清除用戶數(shù)據(jù),等同于在手機設(shè)置中清除用戶數(shù)據(jù)。
  • addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) :為Activity創(chuàng)建新的任務(wù)棧,activity(需要創(chuàng)建任務(wù)棧的Activity),intent(用于跳轉(zhuǎn)頁面的Intent),description(描述信息),thumbnail(縮略圖)
  • getDeviceConfigurationInfo () :獲取設(shè)備信息
  • getLauncherLargeIconSize () : 獲取Launcher(啟動器)圖標(biāo)大小
  • getMemoryInfo (ActivityManager.MemoryInfo outInfo) : 獲取系統(tǒng)當(dāng)前內(nèi)存信息
  • getProcessMemoryInfo():返回一個或者多個進程使用內(nèi)存的情況
  • getRunningAppProcesses() :獲取該設(shè)備上應(yīng)用程序進程列表
  • getAppTasks() :獲取當(dāng)前應(yīng)用任務(wù)列表
  • isUserAMonkey() :是否用戶是一個猴子,用于判斷鍵盤是否被亂按
  • killBackgroundProcesses(String packageName) :根據(jù)包名殺死對應(yīng)進程
  • getRunningTasks (int maxNum) :獲取正在運行的任務(wù)列表
  • getRecentTasks (int maxNum, int flags) :獲取用戶啟動的任務(wù)列表
  • getMyMemoryState (ActivityManager.RunningAppProcessInfo outState) :獲取該進程的全局內(nèi)存狀態(tài)

判斷應(yīng)用是否在前臺運行,應(yīng)用是否在運行

//判斷應(yīng)用是否在前臺運行
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)用在前臺執(zhí)行");
            return true;
        } else {
            System.out.println("應(yīng)用在后臺執(zhí)行");
            return false;
        }
    }

// 判斷應(yīng)用是否在運行
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)前正在運行的Activity,info.baseActivity表示系統(tǒng)后臺有此進程在運行
        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把任務(wù)放入棧中,在onDestroy方法中將Activity退棧。

/**
 * 用于管理Activity,獲取Activity
 * 在結(jié)束一個activity后應(yīng)該判斷當(dāng)前棧是否為空,為空則將本類引用置為null,以便于虛擬機回收內(nèi)存
 * 單例,調(diào)用 {@link #getActivityManager()} 獲取實例
 * 成員變量 {@link #mActivityStack} 應(yīng)該與系統(tǒng)的回退棧保持一致,所以在啟動activity的時候必須在其onCreate中
 * 將該activity加入棧頂,在activity結(jié)束時,必須在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);
    }

    /**
     * 獲取棧頂?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();
        }
        //如果移除一個activity之后棧為空,將本類的引用取消,以便于讓虛擬機回收
        if (mActivityStack != null && mActivityStack.isEmpty()) {
            mInstance = null;
        }
    }

    /**
     * 結(jié)束最接近棧頂?shù)钠ヅ漕惷腶ctivity.
     * 遍歷到的不一定是被結(jié)束的,遍歷是從棧底開始查找,為了確定棧中有這個activity,并獲得一個引用
     * 刪除是從棧頂查找,結(jié)束查找到的第一個
     * 在activity外結(jié)束activity時調(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é)束一個
            }
        }
    }

    //移除所有的Activity
    public void removeAll(){
        for (Activity activity : mActivityStack) {
            if (activity != null) {
                activity.finish();
                break;              
            }
        }
    }
}

到此這篇關(guān)于Android ActivityManager使用案例詳解的文章就介紹到這了,更多相關(guān)Android ActivityManager使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

博野县| 无棣县| 沽源县| 德化县| 遂川县| 安图县| 梧州市| 张家界市| 涿州市| 民县| 祁阳县| 普定县| 永昌县| 舒兰市| 江山市| 宜章县| 绥阳县| 太谷县| 鹤峰县| 察雅县| 丁青县| 新密市| 娄底市| 蕲春县| 襄城县| 长岛县| 青阳县| 金华市| 普陀区| 北宁市| 平遥县| 利津县| 丹东市| 布尔津县| 社旗县| 滨海县| 海伦市| 怀柔区| 麻江县| 华容县| 丹棱县|