很多时候需要监听到手机home键按下,然后再当app打开的时候,这个时候需要触发一些事件,但是怎么去判断手机是home键按下后的结果呢?首先从Activity的生命周期来看,按下home键会走OnStop()这个生命周期方法,当然当唤醒的时候会走onResume()方法,但是在应用程序中有多个activity,如果在baseActiviyt里面来判断,那就肯定是不行的。那么就要运用到下面的方法了。
方法一:写一个广播接受者,在安卓里面触发一些系统的事件肯定会有广播的。
class HomeKeyEventBroadCastReceiver extends BroadcastReceiver {
static final String SYSTEM_REASON = "reason";
static final String SYSTEM_HOME_KEY = "homekey";//home key
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);
if (reason != null) {
if (reason.equals(SYSTEM_HOME_KEY)) {
// home key处理点
这里就是按下了home键做个flag标记
}
}
}
}
}
记得要去regist这个广播哦,然后在base的OnResume()方法里面去判断那个标记,如果是按下了home键就去处理想要的事件。
方法二:
public class SystemUtils {
public static boolean isActive=false;
public static boolean isForeGround(Context context){
boolean isTopStack=false;
ActivityManager am= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks=am.getRunningTasks(1);
if (!tasks.isEmpty()){
ComponentName topActivity =tasks.get(0).topActivity;
if (topActivity.getPackageName().equals(context.getPackageName())){
isTopStack=true;
}
}
PowerManager pm= (PowerManager) context.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn=pm.isScreenOn();
return isTopStack&&isScreenOn;
}
}
在BaseActivity的onstop()方法
@Override
protected void onStop() {
super.onStop();
if (!SystemUtils.isForeGround(this)){
SystemUtils.isActive=false;
}
}
@Override
protected void onResume() {
super.onResume();
if (!SystemUtils.isActive&&!issplashOne){
SystemUtils.isActive=true;
//同样处理想要的事件
}
}