RecentsActivity的启动分析一

本文详细探讨了用户点击切换按键启动RecentsActivity的过程。从PhoneWindowManager拦截事件开始,涉及预加载最近应用、toggleRecentApps方法,通过IStatusBarService与StatusBarManagerService交互,再到CommandQueue调用BaseStatusBar的toggleRecentApps方法,最终启动RecentsActivity,显示最近应用列表。整个流程涉及到SystemUI、StatusBarManagerService和Recents组件的交互。
摘要由CSDN通过智能技术生成

RecentsActivity是SystemUI用于显示最近使用的应用列表,当用户点击Switch按键时会启动RecentsActivity。先分析启动的过程。

首先是用户点击SWITCH按键,PhoneWindowManager会在事件分发前先拦截该事件:

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
    ……
    else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {
        ……
        if (!keyguardOn) {
            if (down && repeatCount == 0) {
                preloadRecentApps();
            } else if (!down) {
                toggleRecentApps();
            }
        }
        return -1;
    }
    ……
}

根据down标识分两种情况:

(1)preloadRecentApps();//预加载最近使用应用

private void preloadRecentApps() {
    mPreloadedRecentApps = true;
    try {
        IStatusBarService statusbar = getStatusBarService();
        if (statusbar != null) {
            statusbar.preloadRecentApps();
        }
    } catch (RemoteException e) {
        Slog.e(TAG, "RemoteException when preloading recent apps", e);
        // re-acquire status bar service next time it is needed.
        mStatusBarService = null;
    }
}

(2)toggleRecentApps();

private void toggleRecentApps() {
    mPreloadedRecentApps = false;
    try {
        IStatusBarService statusbar = getStatusBarService();
        if (statusbar != null) {
            statusbar.toggleRecentApps();
        }
    } catch (RemoteException e) {
        mStatusBarService = null;
    }
}

这两种情况都获取了IStatusBarService的对象statusbar,并由该对象调用preloadRecentApps()和toggleRecentApps()方法。IStatusBarService.aidl是一个aidl服务,aidl接口中的内部抽象类Stub是由StatusBarManagerService这个类来实现的。Stub类继承了Binder,并继承我们在aidl文件中定义的接口。

public class StatusBarManagerService extends IStatusBarService.Stub {
   

    private volatile IStatusBar mBar;

    @Override
    public void toggleRecentApps() {
        if (mBar != null) {
            try {
                mBar.toggleRecentApps();
            } catch (RemoteException ex) {}
        }
    }

    @Override
    public void preloadRecentApps() {
        if (mBar != null) {
            try {
                mBar.preloadRecentApps();
            } catch (RemoteException ex) {}
        }
    }

    @Override
    public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList,
            int switches[], List<IBinder> binders) {
        enforceStatusBarService();
        mBar = bar;
        ……
    }
}

mBar是IStatusBar的对象,IStatusBar.aidl接口中的内部抽象类Stub是由CommandQueue这个类实现的。

public class CommandQueue extends IStatusBar.Stub {
   
    /**
     * These methods are called back on the main thread.
     */
    public interface Callbacks {
   
       public void toggleRecentApps();
       public void preloadRecentApps(); 
    }
    /*这是IStatusBar.aidl文件定义的抽象方法的实现,通过mHandler将消息传递给主线程*/
    public void toggleRecentApps() {
        synchronized (mList) {
            mHandler.removeMessages(MSG_TOGGLE_RECENT_APPS);
            mHandler.obtainMessage(MSG_TOGGLE_RECENT_APPS, 0, 0, null).sendToTarget();
        }
    }
     /*这是IStatusBar.aidl文件定义的抽象方法的实现*/
    public void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值