在Android10.0上,Recents功能分布在SystemUI和Launcher3里面集成.
一.初始化
跟Android8.1类似,先看初始化入口:
1.Recents.java
Recents继承SystemUI,进程启动后会在Dependency里面通过@Inject进行初始化,然后在SystemUIService里面调用SystemUIApplication的startServicesIfNeeded()里面进行启动:
frameworks/base/packages/SystemUI/src/com/android/systemui/recents/Recents.java
private final RecentsImplementation mImpl
@Override
public void start() {
//加入callback
mCommandQueue.addCallback(this);
mImpl.onStart(mContext);
}
RecentsImplementation替代了之前的RecentsImpl,是一个interface,由其实现类OverviewProxyRecentsImpl来执行操作,关于该类的实例化用到了dagger2,不懂的同学可以去学习一下;
2.OverviewProxyRecentsImpl.java
frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
private OverviewProxyService mOverviewProxyService;
@Override
public void onStart(Context context) {
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
}
根据调用关系,在onStart()里面创建了OverviewProxyService对象,看一下具体实现:
3.OverviewProxyService.java
中间类,在该类内部去绑定远端的service:
frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@Inject
public OverviewProxyService(Context context, CommandQueue commandQueue,
NavigationBarController navBarController, NavigationModeController navModeController,
NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
PipUI pipUI, Optional<Divider> dividerOptional,
Optional<Lazy<StatusBar>> statusBarOptionalLazy,
BroadcastDispatcher broadcastDispatcher) {
super(broadcastDispatcher);
mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
com.android.internal.R.string.config_recentsComponentName));
mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
// Connect to the service
updateEnabledState();
startConnectionToCurrentUser();
}
public void startConnectionToCurrentUser() {
if (mHandler.getLooper() != Looper.myLooper()) {
mHandler.post(mConnectionRunnable);
} else {
internalConnectToCurrentUser();
}
}
private void internalConnectToCurrentUser() {
Intent launcherServiceIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
try {
mBound = mContext.bindServiceAsUser(launcherServiceIntent,
mOverviewServiceConnection,
Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
UserHandle.of(getCurrentUserId()));
}
}
private IOverviewProxy mOverviewProxy;
private final ServiceConnection mOverviewServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mOverviewProxy = IOverviewProxy.Stub.asInterface(service);
}
}
跟随调用关系来看,在构造方法内部,会去执行startConnectionToCurrentUser来调用bindServiceAsUser()去启动service,在onServiceConnected中,通过IOverviewProxy.Stub.asInterface(service)来获取IOverviewProxy实例,后续会用到;
Service对应的Intent为android.intent.action.QUICKSTEP_SERVICE,R.string.config_recentsComponentName对应如下,用来获取远端服务的应用包名:
<string name="config_recentsComponentName" translatable="false"
>com.android.launcher3/com.android.quickstep.RecentsActivity</string>
从ComponentName可以看到,被bind的service是在Launcher3里面,接下来一起看一下对应的远端Service;
4.TouchInteractionService.java
packages/apps/Launcher3/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
Launcher3内的入口类,通过该类来调用相关逻辑:
private final IBinder mMyBinder = new IOverviewProxy.Stub() {
@BinderThread
@Override
public void onOverviewToggle() {
mOverviewCommandHelper.onOverviewToggle();
}
}
@Override
public IBinder onBind(Intent intent) {
return mMyBinder;
}
可以看到,TouchInteractionService里面创建了IOverviewProxy.Stub实例,然后在onBind()返回;
TouchInteractionService是一个Service,在onCreate()里面进行了一些初始化相关的调用:
@Override
public void onCreate() {
super.onCreate();
mDeviceState.runOnUserUnlocked(this::onUserUnlocked);
sConnected = true;
}
@UiThread
public void onUserUnlocked() {
mOverviewComponentObserver = new OverviewComponentObserver(this, mDeviceState);
mOverviewCommandHelper = new OverviewCommandHelper(this, mDeviceState,
mOverviewComponentObserver);
}
可以看到,在TouchInteractionService启动后,会创建OverviewComponentObserver实例和OverviewCommandHelper实例,一起看一下这两个类的实现:
5.OverviewComponentObserver.java
packages/apps/Launcher3/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
public OverviewComponentObserver(Context context, RecentsAnimationDeviceState deviceState) {
ComponentName fallbackComponent = new ComponentName(mContext, RecentsActivity.class);
mFallbackIntent = new Intent(