`
wx1568145609
  • 浏览: 17526 次
文章分类
社区版块
存档分类
最新评论

ActivityLifecycleCallbacks管理Activity栈(监听home键)

 
阅读更多

Android在API14之后添加了用于监听应用Activity生命周期的回调接口ActivityLifecycleCallbacks,使用时需要在Application中进行注册。

可以看到ActivityLifecycleCallbacks中的方法跟Activity生命周期方法基本是一致的。

注册与取消注册

public class MyApplication extends Application {
    public static final String TAG = MyApplication.class.getSimpleName();

    /** Activity监听回调 */
    private ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacks() {
        ....
    };

    @Override
    public void onCreate() {
        super.onCreate();

        //可注册多次,注册多个生命周期回调
        registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
        //Activity管理
        registerActivityLifecycleCallbacks(ActivityManager.getInstance());
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        //Android API中没有对此方法的过多解释,不过通常此方法会在app退出是被调用(并不是100%)

        unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }
}

需要注意的是Android允许注册多个ActivityLifecycleCallbacks,并且同时生效。

优雅的管理Activity

实现ActivityLifecycleCallbacks接口,并创建Activity的任务栈,通过监听回调实现Activity的进栈和出栈。需要在Application中进行注册。

/**
 * Activity管理类<br/>
 * 需要在Application中调用registerActivityLifecycleCallbacks注册
 */
public class ActivityManager implements Application.ActivityLifecycleCallbacks {
    //Activity栈
    private Stack<Activity> activities = new Stack<>();
    private static ActivityManager activityManager;

    private ActivityManager(){
    }

    /**
     * 单例
     * @return activityManager instance
     */
    public static ActivityManager getInstance(){
        if(activityManager == null){
            synchronized (ActivityManager.class){
                if(activityManager == null){
                    activityManager = new ActivityManager();
                }
            }
        }

        return activityManager;
    }

    /**
     * 获取Activity任务栈
     * @return activity stack
     */
    public Stack<Activity> getActivityStack(){
        return activities;
    }

    /**
     * Activity 入栈
     * @param activity Activity
     */
    public void addActivity(Activity activity){
        activities.add(activity);
    }

    /**
     * Activity出栈
     * @param activity Activity
     */
    public void removeActivity(Activity activity){
        if(activity != null){
            activities.remove(activity);
        }
    }

    /**
     * 结束某Activity
     * @param activity Activity
     */
    public void finishActivity(Activity activity){
        if(activity != null){
            removeActivity(activity);
            activity.finish();
        }
    }

    /**
     * 获取当前Activity
     * @return current activity
     */
    public Activity getCurrentActivity(){
        return activities.lastElement();
    }

    /**
     * 结束当前Activity
     */
    public void finishActivity(){
        finishActivity(activities.lastElement());
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        addActivity(activity);
    }

    @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) {
        removeActivity(activity);
    }
}

通过上面的Activity管理栈可以扩展实现如下需求:

  • 监听应用中集成的第三方SDK中的Activity的启动。
  • 可以控制应用中某个Activity被初始化的数量,如商城应用中的商品详情页,避免无限制的创建Activity。
  • 判断应用是否处于前台可见状态,通过onActivityResumed和onActivityPaused回调方法实现。

监听Home键

我们在开发过程中有时候会碰到一些特殊需求需要监听home键,释放一些资源或者销毁activity等。但Home键事件不同于其他普通按键可以通过OnKeyDown、dispatchKeyEvent等按键监听方法捕获处理,Android系统并没有提供直接监听Home键的方法。但是,当按下Home键是系统会发送Intent.ACTION_CLOSE_SYSTEM_DIALOGS广播(多任务键也会发送此广播)。我们可以通过监听此广播,来间接的监听Home键事件。

public class HomeKeyListenerBroadcast extends BroadcastReceiver {
    private Context context;
    private OnHomeKeyPressListener onHomeKeyPressListener;

    private boolean isRegiested = false;

    public HomeKeyListenerBroadcast(Context context){
        this.context = context;
    }

    public HomeKeyListenerBroadcast(Context context, OnHomeKeyPressListener onHomeKeyPressListener){
        this.context = context;
        this.onHomeKeyPressListener = onHomeKeyPressListener;
    }

    public void setOnHomeKeyPressListener(OnHomeKeyPressListener onHomeKeyPressListener){
        this.onHomeKeyPressListener = onHomeKeyPressListener;
    }

    /**
     * 广播注册
     */
    public void registerSelf(){
        if(context != null){
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            context.registerReceiver(this, filter);
            isRegiested = true;
        }
    }

    /**
     * 广播UnRegister
     */
    public void unRegisterSelf(){
        if(isRegiested){
            context.unregisterReceiver(this);
            isRegiested = false;
        }
    }


    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            String reason = intent.getStringExtra("reason");
            if ("homekey".equals(reason)) {
                // 按下HOME健
                if (onHomeKeyPressListener != null) {
                    onHomeKeyPressListener.onHomeKeyPress();
                }
            } else if ("recentapps".equals(reason)) {
                // 长按HOME键
                if (onHomeKeyPressListener != null) {
                    onHomeKeyPressListener.onRecentAppsKeyLongPress();
                }
            }
        }
    }

    /**
     * 事件回调接口
     */
    public interface OnHomeKeyPressListener{
        void onHomeKeyPress();
        void onRecentAppsKeyLongPress();
    }
}

代码很简单,不做过多解释了。需要注意的是此广播肯定是动态注册的,在需要的Activity中进行注册并监听按键事件,记得要在onDestroy中取消注册。

转载于:https://my.oschina.net/zhongsm/blog/1935010

分享到:
评论

相关推荐

    Android中对手机的返回键,Home键以及多功能切换键的监听

    本文将深入探讨如何在Android应用中监听并处理返回键、Home键以及多功能切换键(通常称为Recent Apps键)的事件。 首先,我们要了解Android系统中的Activity生命周期。当用户按下返回键或Home键时,Activity会经历...

    android监听home按键实例

    然而,由于Android系统的安全性和权限管理,直接监听Home键并不像监听其他按键那样简单。本实例将介绍如何通过`Intent.ACTION_CLOSE_SYSTEM_DIALOGS`广播来间接实现Home键监听。 首先,我们需要理解`Intent.ACTION_...

    Android 监听Home键、锁屏、解屏(落雨敏详细讲解)

    Android 监听Home键、锁屏、解屏处理方法,都有注释。使用简介:  (1)、将内部类(广播类)作为MyBroadcastReceiver类的成员变量,方便activity使用  (2)、对外接口类(如:ScreenStateListener)作为...

    Activity栈的简单应用.rar

    5. **返回栈的概念**:当用户点击后退键或调用finish()方法时,栈顶的Activity会被弹出,显示栈中下一个Activity。这就是Android的导航机制,也是用户体验的重要部分。 6. **Activity之间的通信**:通过Intent,...

    Android快速开发通过manage类来管理activity栈

    通过一个单例模式的AppManager管理类来管理activity栈.方便快速开发.相关博文:http://blog.csdn.net/qq_28690547/article/details/50610147

    Android onKeyDown监听返回键无效的解决办法

    为了提高代码的可维护性和复用性,可以考虑创建一个基类Activity,里面封装好对返回键事件的处理逻辑,并让需要监听返回键的Activity继承这个基类。 最后,值得注意的是,在Android 4.0(API level 14)及以上版本...

    PopupWindow监听返回键

    如果PopupWindow是在Fragment中使用的,你可能需要在Fragment的onAttach()方法中添加对Activity的监听,或者使用OnKeyListener监听软键盘的返回键。 ```java @Override public void onAttach(@NonNull Context ...

    Android拦截HOME按键

    当用户按下HOME键时,系统会调用Activity的onPause()和onStop()方法,将当前应用置于后台。若用户重新打开应用,系统会调用onRestart()、onStart()和onResume()方法恢复到之前的状态。因此,我们可以通过重写这些...

    Home按键的监听

    首先,Android SDK并未直接提供监听Home键的接口,但可以通过重写Activity的`onKeyDown()`方法来间接实现。`onKeyDown()`方法会在用户按下硬件按键时被调用,包括Home键。以下是一个简单的示例: ```java @Override...

    模拟Activity进出栈

    6. **回退栈的生命周期**:当用户离开一个任务(例如,按下Home键或启动其他应用),任务被置于后台。再次打开时,任务的回退栈会恢复到用户离开时的状态,即上次的Activity仍然在栈顶。 了解并熟练掌握Activity的...

    Android 解决监听home键的几种方法

    另一种方式是直接在Activity中重写`onKeyDown()`方法来监听Home键: ```java @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { Toast.makeText...

    在Fragment监听返回键

    有时,我们可能需要在Fragment中监听设备的返回键事件,以便在用户按下返回键时执行特定的操作,比如关闭当前Fragment而不退出整个Activity。本篇文章将详细讲解如何在Fragment中实现返回键监听。 首先,我们需要...

    Android监听Home键实例详解

    首先,我们了解一种常见的误解:通过重写`Activity`的`onKeyDown()`方法来监听Home键。这种方法是无效的,因为系统不会将Home键的事件传递给`onKeyDown()`。示例代码如下: ```java @Override public boolean ...

    物理按键监听

    系统默认情况下不允许第三方应用监听电源键,除非你的应用具有`SYSTEM_ALERT_WINDOW`(显示系统弹窗)权限或者`DEVICE_ADMIN`(设备管理员)权限。因此,在实际开发中,你需要确保你的应用有足够的权限来监听这些...

    安卓获取Home键盘

    为了监听Home键的按键事件,我们需要重写Activity中的`onKeyDown`方法。这个方法会在按键被按下时被调用,其中包含两个参数:按键的键码和按键事件。 ```java @Override public boolean onKeyDown(int keyCode, ...

    Android监听Home键和Back键的区别介绍

    总之,对于Android中Home键和Back键的监听,开发者需要根据应用的需求和用户的实际使用习惯,合理地设计监听逻辑,并且注意内存管理和用户体验之间的平衡。希望本文对您有所帮助,使您在开发Android应用时能够更好地...

    android 媒体键监听 以及 媒体键模拟

    在Android开发中,媒体键监听和模拟媒体键盘的实现是两个重要的功能,它们涉及到系统级事件处理和自定义用户交互。下面将详细讲解这两个概念及其实现。 首先,媒体键监听是指应用程序能够捕获并响应系统中的媒体键...

Global site tag (gtag.js) - Google Analytics