日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何判斷APP在前臺還是后臺?

來源: 責編: 時間:2024-01-22 08:40:56 202觀看
導讀如何判斷一個APP在前臺還是后臺?可以通過RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。RunningTasks方式注意:getRunningTask方法在5.0以上已經被廢棄,只能返回自己和系統的一些不敏感的task,不再返回

如何判斷一個APP在前臺還是后臺?可以通過RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。FKh28資訊網——每日最新資訊28at.com

RunningTasks方式

注意:getRunningTask方法在5.0以上已經被廢棄,只能返回自己和系統的一些不敏感的task,不再返回其他應用的task,用此方法來判斷自身App是否處于后臺是有效的,但是無法判斷其他應用是否處于前臺。FKh28資訊網——每日最新資訊28at.com

private fun getTopApplication() {    //首先獲取到ActivityManager    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager    if (activityManager.getRunningTasks(1) == null){        Log.e(TAG, "getForegroundActivity: ")        return    }    var runningTaskInfo = activityManager.getRunningTasks(1)[0]    if (runningTaskInfo == null) {        Log.e(TAG, "runningTaskInfo is null")        return    }    runningTaskInfo.topActivity?.let {        Log.e(TAG, "top application is ${it.packageName}")    }}

RunningProcess方式

注意:RunningProcess方法在5.0以上已經被廢棄,例如,在聊天類型的App中,大部分時間需要常駐后臺來不間斷地獲取服務器的消息,就必須把Service設置成START_STICKY,kill后會被重啟(等待5s左右)來保證Service常駐后臺。如果Service設置了這個屬性,這個App的進程就可以判斷為前臺。FKh28資訊網——每日最新資訊28at.com

appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
private fun isAppForeground(): Boolean {    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager    var runningAppProcesses = activityManager.runningAppProcesses    if (runningAppProcesses == null) {        Log.e(TAG, "runningAppProcesses is null")        return false    }    runningAppProcesses.forEach {        if (it.processName == packageName && (it.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)) {            return true        }    }    return false}

ActivityLifecycleCallbacks方式

class MyActivityLifecycleCallbacks(    var onActivityCreatedAction: ((Activity, Bundle?) -> Unit)? = null,    var onActivityStartedAction: ((Activity) -> Unit)? = null,    var onActivityResumedAction: ((Activity) -> Unit)? = null,    var onActivityPausedAction: ((Activity) -> Unit)? = null,    var onActivityStoppedAction: ((Activity) -> Unit)? = null,    var onActivitySaveInstanceStateAction: ((Activity, Bundle) -> Unit)? = null,    var onActivityDestroyedAction: ((Activity) -> Unit)? = null) : Application.ActivityLifecycleCallbacks {    private var mCount=0    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {        onActivityCreatedAction?.invoke(activity, savedInstanceState)    }    override fun onActivityStarted(activity: Activity) {        mCount++        onActivityStartedAction?.invoke(activity)    }    override fun onActivityResumed(activity: Activity) {        onActivityResumedAction?.invoke(activity)    }    override fun onActivityPaused(activity: Activity) {        onActivityPausedAction?.invoke(activity)    }    override fun onActivityStopped(activity: Activity) {        mCount--        onActivityStoppedAction?.invoke(activity)    }    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {        onActivitySaveInstanceStateAction?.invoke(activity, outState)    }    override fun onActivityDestroyed(activity: Activity) {        onActivityDestroyedAction?.invoke(activity)    }    /**     * 這里我們把mCount的實際數值返回回去     */    fun getCount():Int = mCount}

這里我們對ActivityLifecycleCallbacks的實現類做了一層封裝,利用Kotlin的高階函數,當我們需要去實現那個聲明周期的回調的時候,就通過高階函數來提供回調處理,否則默認不做任何處理。然后我們在Application的onCreate中進行注冊:FKh28資訊網——每日最新資訊28at.com

class LifeApplication : Application() {    private val TAG = "LifeApplication"    private val mActivityLifecycleCallbacks by lazy {        MyActivityLifecycleCallbacks(            onActivityCreatedAction = { activit, bundle ->            Log.e(TAG, "onCreate: ")        },        onActivityStoppedAction = { activity ->            Log.e(TAG, "onStop ")        },        onActivityDestroyedAction = { activity ->            Log.e(TAG, "onDestroy")        })    }    override fun onCreate() {        super.onCreate()        instance = this        //注冊生命周期回調事件        registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)    }    /**     * 用于判斷當前進程是否處于前臺     */    fun isForegroundMethod(): Boolean = mActivityLifecycleCallbacks.getCount() > 0    companion object{        private var instance :LifeApplication?= null        fun getInstance () = instance!!    }

當我們不管是點擊Back鍵還是Home鍵都會回調到onStop方法,我們在onStart和onStop中分別對mCount值做了加減,這樣我們可以通過該數值來判斷當前App是前臺還是后臺。FKh28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-65868-0.html如何判斷APP在前臺還是后臺?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 實現定時任務的六種策略

下一篇: Python編程新手須知:避免代碼陷阱的秘訣

標簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 《英雄聯盟》夏季賽總決賽今日開打!JDG對陣LNG首發名單來了 Knight:準備三連冠

    8月5日消息,今日17:00,《英雄聯盟》2023LPL夏季賽總決賽將正式開打,由JDG對陣LNG。對兩支隊伍來說,這場比賽不僅要爭奪夏季賽冠軍,更要決定誰才是LPL賽區一
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
Top 主站蜘蛛池模板: 襄垣县| 浏阳市| 延津县| 大冶市| 武汉市| 武陟县| 金坛市| 金湖县| 故城县| 汝城县| 台湾省| 田东县| 蛟河市| 沈丘县| 镇原县| 饶阳县| 张家港市| 兴隆县| 峡江县| 璧山县| 阳山县| 图们市| 徐州市| 浮梁县| 启东市| 海盐县| 桐乡市| 宁陕县| 银川市| 奇台县| 岳池县| 海盐县| 图木舒克市| 开江县| 秦皇岛市| 海南省| 湘西| 江都市| 扶沟县| 白河县| 临猗县|