APP全局监听系统Home键
通过自定义Application,在Application中有一个registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks a)方法,调用该方法需要重写ActivityLifecycleCallbacks接口的生命周期方法(该生命周期方法包含所有的Activity的生命周期),所以在OnActivityResume()和OnActivityPause()方法中监听Home键(注册和反注册系统广播)。
HomeWatch.java
封装了Home的系统广播,实现了接口的回调
public class HomeWatch {
private Context mContext;
private IntentFilter mFilter;
private OnHomePressedListener mListener;
private HomeBroadcastReceiver mRecevier;
public interface OnHomePressedListener {
void onHomePressed();
void onHomeLongPressed();
}
public HomeWatch(Context context) {
mContext = context;
mRecevier = new HomeBroadcastReceiver();
mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
/**
* 设置监听
*
* @param listener
*/
public void setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
}
/**
* 开始监听,注册广播
*/
public void register() {
if (mRecevier != null) {
mContext.registerReceiver(mRecevier, mFilter);
}
}
/**
* 停止监听,注销广播
*/
public void unregister() {
if (mRecevier != null) {
mContext.unregisterReceiver(mRecevier);
}
}
class HomeBroadcastReceiver extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@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_DIALOG_REASON_KEY);
if (reason != null) {
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
// 短按home键
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
// 长按home键
mListener.onHomeLongPressed();
}
}
}
}
}
}
}
APP.java
为避免在APP中重写过多的方法,通过一个类实现Application.ActivityLifecycleCallbacks接口
public class APP extends Application {
private HomeWatch mHomeWatcher;
@Override
public void onCreate() {
super.onCreate();
regisiterActivityLifecycle();
}
private void regisiterActivityLifecycle() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallBack() {
@Override
public void onActivityResumed(final Activity activity) {
super.onActivityResumed(activity);
mHomeWatcher = new HomeWatch(activity);
mHomeWatcher.setOnHomePressedListener(new HomeWatch.OnHomePressedListener() {
@Override
public void onHomePressed() {
//在此处实现具体逻辑
}
@Override
public void onHomeLongPressed() {
//在此处实现具体逻辑
}
});
mHomeWatcher.register();
}
@Override
public void onActivityPaused(Activity activity) {
super.onActivityPaused(activity);
mHomeWatcher.setOnHomePressedListener(null);
mHomeWatcher.unregister();
}
});
}
}
ActivityLifecycleCallBack.java
自定义了一个类实现Application.ActivityLifecycleCallbacks的接口
public class ActivityLifecycleCallBack implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
在AndroidManifest.xml中
<application
android:name=".APP"
...>