Android 实现类似IOS App唤醒的代理方法
Posted 独立开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 实现类似IOS App唤醒的代理方法相关的知识,希望对你有一定的参考价值。
缘由
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被唤醒后调用代理方法。
使用的实现方法很简单,如果你有更好的方式,欢迎来拍砖。
文章出处:
欢迎关注我的公众号,实时给你推送文章,谢谢支持;
以上是关于Android 实现类似IOS App唤醒的代理方法的主要内容,如果未能解决你的问题,请参考以下文章