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