abstract class LifecycleApplication : Application(),
Application.ActivityLifecycleCallbacks {
companion object {
// 正常状态
const val STATE_NORMAL = 0
// 从后台回到前台
const val STATE_BACK_TO_FRONT = 1
// 从前台进入后台
const val STATE_FRONT_TO_BACK = 2
//最大时间 10秒
const val MAX_TIME = 1 * 1000
}
// APP状态
private var sAppState: Int = STATE_NORMAL
// 标记程序是否已进入后台(依据onStop回调)
private var flag = false
// 标记程序是否已进入后台(依据onTrimMemory回调)
private var background = false
// 从前台进入后台的时间
private var frontToBackTime: Long = 0
// 从后台返回前台的时间
private var backToFrontTime: Long = 0
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
MultiDex.install(this)
}
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(this)
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) = if (background || flag) {
background = false
flag = false
sAppState = STATE_BACK_TO_FRONT
backToFrontTime = System.currentTimeMillis()
if (isSplash()) {
appResume(activity)
} else {
}
} else {
sAppState = STATE_NORMAL
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
//判断当前activity是否处于前台
if (!AppUtil.isRunningForeground(this)) {
// 从前台进入后台
sAppState = STATE_FRONT_TO_BACK
frontToBackTime = System.currentTimeMillis()
flag = true
} else {
// 否则是正常状态
sAppState = STATE_NORMAL
}
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
// TRIM_MEMORY_UI_HIDDEN是UI不可见的回调, 通常程序进入后台后都会触发此回调,大部分手机多是回调这个参数
// TRIM_MEMORY_BACKGROUND也是程序进入后台的回调, 不同厂商不太一样, 魅族手机就是回调这个参数
if (level == TRIM_MEMORY_UI_HIDDEN || level == ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
background = !AppUtil.isRunningForeground(this)
} else if (level == TRIM_MEMORY_COMPLETE) {
background = !AppUtil.isRunningForeground(this)
}
if (background) {
frontToBackTime = System.currentTimeMillis()
sAppState = STATE_FRONT_TO_BACK
} else {
sAppState = STATE_NORMAL
}
}
/**
* 进入后台间隔10秒以后可以再次显示广告
* @return 是否能显示广告
*/
private fun isSplash(): Boolean {
return sAppState == STATE_BACK_TO_FRONT &&
backToFrontTime - frontToBackTime > MAX_TIME
}
fun isBackToFront(): Boolean {
return sAppState == STATE_BACK_TO_FRONT
}
open fun appResume(activity: Activity?) {
}
fun isRunningForeground(context: Context): Boolean {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
val processes = activityManager?.runningAppProcesses
if (processes.isNullOrEmpty()) {
return false
} else {
for (appProcessInfo in processes) {
if (appProcessInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
if (appProcessInfo.processName == context.applicationInfo.processName) {
return true
}
}
}
}
return false
}
}
监听activity从后台切换到前台
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。