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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2024-01-22 08:40:56 236觀看
導(dǎo)讀如何判斷一個(gè)APP在前臺(tái)還是后臺(tái)?可以通過(guò)RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。RunningTasks方式注意:getRunningTask方法在5.0以上已經(jīng)被廢棄,只能返回自己和系統(tǒng)的一些不敏感的task,不再返回

如何判斷一個(gè)APP在前臺(tái)還是后臺(tái)?可以通過(guò)RunningTasks,RunningProcess 以及ActivityLifecycleCallback判定。o4t28資訊網(wǎng)——每日最新資訊28at.com

RunningTasks方式

注意:getRunningTask方法在5.0以上已經(jīng)被廢棄,只能返回自己和系統(tǒng)的一些不敏感的task,不再返回其他應(yīng)用的task,用此方法來(lái)判斷自身App是否處于后臺(tái)是有效的,但是無(wú)法判斷其他應(yīng)用是否處于前臺(tái)。o4t28資訊網(wǎng)——每日最新資訊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以上已經(jīng)被廢棄,例如,在聊天類型的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)。o4t28資訊網(wǎng)——每日最新資訊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的實(shí)際數(shù)值返回回去     */    fun getCount():Int = mCount}

這里我們對(duì)ActivityLifecycleCallbacks的實(shí)現(xiàn)類做了一層封裝,利用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è):o4t28資訊網(wǎng)——每日最新資訊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        //注冊(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)。o4t28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 實(shí)現(xiàn)定時(shí)任務(wù)的六種策略

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 扶沟县| 化州市| 麻城市| 佛冈县| 抚州市| 法库县| 宜都市| 沙田区| 迁安市| 平江县| 福州市| 沁源县| 蚌埠市| 息烽县| 阳新县| 柳林县| 宁南县| 杭锦旗| 敦化市| 乌鲁木齐市| 油尖旺区| 壶关县| 霸州市| 陇南市| 朝阳县| 永修县| 南丹县| 富民县| 道真| 宝清县| 类乌齐县| 贡山| 赫章县| 广宁县| 汤原县| 乌鲁木齐县| 扶风县| 舒城县| 丰宁| 济阳县| 清原|