Android 实现类似IOS App唤醒的代理方法

时间:2022-08-28 14:37:33

缘由

Android系统并没有类似IOS中App被唤醒后的代理方法,所以需要自己通过一些手段来达到类似唤醒的代理方法
需求驱动下,实现的此功能;

实现思路


目的

不管App是被按Home键后,应用退出到后台;还是长时间停止在App,导致锁屏进入休眠,都属于App休眠,所以如果重新进入应用或解开锁屏,都需要唤醒一下App的代理方法。

思路分析

1、由于用户可能在应用中的任何界面让App进入到后台,所以App被唤醒的时候也肯定在App中的任意一个界面; 所以,我们要在BaseActivity中做手脚实现我们的目的。
2、需要判断当前应用是否是前台进程
3、判断当前是否是锁屏状态

实现

创建一个BaseActivity.java类,然后让该继承于Activity或者FragmentActivity;

package org.coolspan.base;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.PowerManager;

import java.util.List;

/**
*Coolspan
**/

public class BaseActivity extends Activity {

//是否是前台进程
private boolean isActive = false;

@Override
protected void onResume() {
super.onResume();

if (!isActive) {
// Log.e("qxs", "进入前台");
CoolEngine.getInstance().setFOREGROUND(true);
isActive = true;
}
}

@Override
protected void onPause() {
super.onPause();
}

/**
* 判断App是否是前台进程
**/

public boolean isAppOnForeGround() {
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
//获取当前应用的包名
String packageName = getApplicationContext().getPackageName();
//获取当前手机的所有运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}

for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
//判断应用的当前进程是否是前台进程
if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
PowerManager manager = (PowerManager) getApplicationContext()
.getSystemService(Activity.POWER_SERVICE);
if (!CoolEngine.getInstance().isScreenOn(manager)) {
CoolLogsUtils.e("关闭状态");
return false;
} else {
CoolLogsUtils.e("dakai状态");
return true;
}
}
}

return false;
}

@Override
protected void onStop() {
super.onStop();
if (!isAppOnForeGround()) {
// Log.e("qxs", "进入后台");
CoolEngine.getInstance().setFOREGROUND(false);
isActive = false;
}
}
}

CoolEngine定义:

package org.coolspan.utils;

/**
*Coolspan
**/

public class CoolEngine{

private boolean FOREGROUND;

private volatile static CoolEngine INSTANCE;

public static CoolEngine getInstance(){
if (INSTANCE == null) {
synchronized (CoolEngine.class) {
if (INSTANCE == null) {//懒加载方式
INSTANCE = new CoolEngine();
}
}
}
return INSTANCE;
}

/**
* 前后台进程切换的代理方法
**/

public synchronized void setFOREGROUND(boolean FOREGROUND) {
CoolLogsUtils.e(FOREGROUND + "");
if (this.isFOREGROUND() == false && FOREGROUND == true) {
this.FOREGROUND = FOREGROUND;
//TODO : 应用被唤醒,处理你的事情吧
} else {
this.FOREGROUND = FOREGROUND;
}
}

public boolean isScreenOn(PowerManager pm) {
boolean screenState;
try {
Method mReflectScreenState = PowerManager.class.getMethod("isScreenOn", new Class[]{});
screenState = (Boolean) mReflectScreenState.invoke(pm);
} catch (Exception e) {
screenState = false;
}
return screenState;
}
}

答疑

大家可能对这部分代码可能会产生疑问:

if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
PowerManager manager = (PowerManager) getApplicationContext()
.getSystemService(Activity.POWER_SERVICE);
if (!CoolEngine.getInstance().isScreenOn(manager)) {
CoolLogsUtils.e("关闭状态");
return false;
} else {
CoolLogsUtils.e("dakai状态");
return true;
}
}

为什么判断出应用是前台进程了,还要判断PowerManager的状态?

下面我给大家简单说一下:

当应用处于前台进程状态时,自动黑屏进入锁屏状态;如果你这个时间进行判断是否是前台进程,你的结果就是:前台进程。为了达到解锁后可以唤醒App,所以加入了对PowerManager状态的判断;这样,就可以达到不管是按Home键或者自动锁屏,都可以实现App被唤醒后调用代理方法。

使用的实现方法很简单,如果你有更好的方式,欢迎来拍砖。

文章出处:

Coolspan CSDN博客:http://blog.csdn.net/qxs965266509

欢迎关注我的公众号,实时给你推送文章,谢谢支持;
Android 实现类似IOS App唤醒的代理方法