偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何判斷APP在前臺(tái)還是后臺(tái)?

開(kāi)發(fā) 前端
當(dāng)我們不管是點(diǎn)擊Back鍵還是Home鍵都會(huì)回調(diào)到onStop方法,我們?cè)趏nStart和onStop中分別對(duì)mCount值做了加減,這樣我們可以通過(guò)該數(shù)值來(lái)判斷當(dāng)前App是前臺(tái)還是后臺(tái)。

如何判斷一個(gè)APP在前臺(tái)還是后臺(tái)?可以通過(guò)RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。

RunningTasks方式

注意:getRunningTask方法在5.0以上已經(jīng)被廢棄,只能返回自己和系統(tǒng)的一些不敏感的task,不再返回其他應(yīng)用的task,用此方法來(lái)判斷自身App是否處于后臺(tái)是有效的,但是無(wú)法判斷其他應(yīng)用是否處于前臺(tái)。

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以上已經(jīng)被廢棄,例如,在聊天類(lèi)型的App中,大部分時(shí)間需要常駐后臺(tái)來(lái)不間斷地獲取服務(wù)器的消息,就必須把Service設(shè)置成START_STICKY,kill后會(huì)被重啟(等待5s左右)來(lái)保證Service常駐后臺(tái)。如果Service設(shè)置了這個(gè)屬性,這個(gè)App的進(jìn)程就可以判斷為前臺(tái)。

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的實(shí)際數(shù)值返回回去
     */
    fun getCount():Int = mCount
}

這里我們對(duì)ActivityLifecycleCallbacks的實(shí)現(xiàn)類(lèi)做了一層封裝,利用Kotlin的高階函數(shù),當(dāng)我們需要去實(shí)現(xiàn)那個(gè)聲明周期的回調(diào)的時(shí)候,就通過(guò)高階函數(shù)來(lái)提供回調(diào)處理,否則默認(rèn)不做任何處理。然后我們?cè)贏pplication的onCreate中進(jìn)行注冊(cè):

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
        //注冊(cè)生命周期回調(diào)事件
        registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
    }

    /**
     * 用于判斷當(dāng)前進(jìn)程是否處于前臺(tái)
     */
    fun isForegroundMethod(): Boolean = mActivityLifecycleCallbacks.getCount() > 0

    companion object{
        private var instance :LifeApplication?= null
        fun getInstance () = instance!!
    }

當(dāng)我們不管是點(diǎn)擊Back鍵還是Home鍵都會(huì)回調(diào)到onStop方法,我們?cè)趏nStart和onStop中分別對(duì)mCount值做了加減,這樣我們可以通過(guò)該數(shù)值來(lái)判斷當(dāng)前App是前臺(tái)還是后臺(tái)。

責(zé)任編輯:武曉燕 來(lái)源: 沐雨花飛蝶
相關(guān)推薦

2009-08-26 18:11:52

前臺(tái)與后臺(tái)方法互調(diào)

2018-01-16 16:32:12

架構(gòu)前臺(tái)后臺(tái)

2015-06-24 10:06:09

iOS 9適配后臺(tái)

2019-06-14 15:48:39

Windows 10硬盤(pán)SSD

2014-07-31 12:07:15

Linux

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2020-11-19 10:03:37

前臺(tái)中臺(tái)后臺(tái)

2009-08-21 09:09:05

C#字符串

2025-02-25 10:20:00

2018-09-12 21:25:15

iOSAppcrash

2014-06-26 14:10:44

2017-01-15 20:58:04

Linux進(jìn)程作業(yè)管理

2021-02-04 11:59:10

硬盤(pán)SSD數(shù)據(jù)

2012-12-24 13:25:59

微信App

2015-10-12 16:37:39

前端編碼雙向編譯

2022-09-19 13:21:15

Linux進(jìn)程

2011-06-14 09:37:52

AppiCloud蘋(píng)果

2023-10-30 07:13:56

2010-04-16 18:23:43

Unix操作系統(tǒng)

2017-10-24 13:42:55

流氓App安卓Google
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)