最近使用的列表在android12里面再次调整回到了Launcher3QuickStep中。
核心代码
CommandQueue.java
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
showRecentApps 显示最近使用app
public void showRecentApps(boolean triggeredFromAltTab) {
synchronized (mLock) {
mHandler.removeMessages(MSG_SHOW_RECENT_APPS);
mHandler.obtainMessage(MSG_SHOW_RECENT_APPS, triggeredFromAltTab ? 1 : 0, 0,
null).sendToTarget();
}
}
//递归回调showRecentApps
case MSG_SHOW_RECENT_APPS:
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).showRecentApps(msg.arg1 != 0);
}
break;
Recente.java 实现了Callbacks
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/recents/Recents.java
public class Recents extends SystemUI implements CommandQueue.Callbacks
{
//这里显示应用列表
@Override
public void start() {
mCommandQueue.addCallback(this);
mImpl.onStart(mContext);
}
@Override
public void showRecentApps(boolean triggeredFromAltTab) {
// Ensure the device has been provisioned before allowing the user to interact with
// recents
if (!isUserSetup()) {
return;
}
//真正的实现类是OverviewProxyRecentsImpl.java
mImpl.showRecentApps(triggeredFromAltTab);
}
}
RecentsImplementation接口
public interface RecentsImplementation {
}
实现类 OverviewProxyRecentsImpl.java
路径:frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java
@SysUISingleton
public class OverviewProxyRecentsImpl implements RecentsImplementation {
private final static String TAG = "OverviewProxyRecentsImpl";
@Nullable
private final Lazy<StatusBar> mStatusBarLazy;
private Context mContext;
private Handler mHandler;
private TrustManager mTrustManager;
private OverviewProxyService mOverviewProxyService;
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@Inject
public OverviewProxyRecentsImpl(Optional<Lazy<StatusBar>> statusBarLazy) {
mStatusBarLazy = statusBarLazy.orElse(null);
}
@Override
public void onStart(Context context) {
mContext = context;
mHandler = new Handler();
mTrustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE);
//赋值
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
}
@Override
public void showRecentApps(boolean triggeredFromAltTab) {
//aidl 调用getProxy() 通过start里面的服务 ,开始获取代理 代理调用了onOverviewShown
IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
// mOverviewProxy = IOverviewProxy.Stub.asInterface(service); 所以其实就IOverviewProxy的实现类调用的
if (overviewProxy != null) {
try {
overviewProxy.onOverviewShown(triggeredFromAltTab);
return;
} catch (RemoteException e) {
Log.e(TAG, "Failed to send overview show event to launcher.", e);
}
} else {
// Do nothing
}
}
@Override
public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
if (overviewProxy != null) {
try {
overviewProxy.onOverviewHidden(triggeredFromAltTab, triggeredFromHomeKey);
return;
} catch (RemoteException e) {
Log.e(TAG, "Failed to send overview hide event to launcher.", e);
}
} else {
// Do nothing
}
}
@Override
public void toggleRecentApps() {
// If connected to launcher service, let it handle the toggle logic
IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
if (overviewProxy != null) {
final Runnable toggleRecents = () -> {
try {
if (mOverviewProxyService.getProxy() != null) {
mOverviewProxyService.getProxy().onOverviewToggle();
mOverviewProxyService.notifyToggleRecentApps();
}
} catch (RemoteException e) {
Log.e(TAG, "Cannot send toggle recents through proxy service.", e);
}
};
// Preload only if device for current user is unlocked
if (mStatusBarLazy != null && mStatusBarLazy.get().isKeyguardShowing()) {
mStatusBarLazy.get().executeRunnableDismissingKeyguard(() -> {
// Flush trustmanager before checking device locked per user
mTrustManager.reportKeyguardShowingChanged();
mHandler.post(toggleRecents);
}, null, true /* dismissShade */, false /* afterKeyguardGone */,
true /* deferred */);
} else {
toggleRecents.run();
}
return;
} else {
// Do nothing
}
}
}
OverviewProxyService.java
实现 IOverviewProxy.aidl
四件事
构造函数
//1 获取最近使用的应用列表名称 路径地址:/frameworks/base/core/res/res/values/config.xml RecentsActivity
mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
com.android.internal.R.string.config_recentsComponentName));
//2 创建意图
mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
<string name="config_recentsComponentName" translatable="false"
>com.android.launcher3/com.android.quickstep.RecentsActivity</string>
Intent launcherServiceIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
try {
//service绑定 开始跨进程 肯定是个Service
//绑定成功回调 其实 这里会匹配到 TouchInteractionService 调用其中实现类的onOverviewShown
mBound = mContext.bindServiceAsUser(launcherServiceIntent,
mOverviewServiceConnection,
Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
UserHandle.of(getCurrentUserId()));
} catch (SecurityException e) {
Log.e(TAG_OPS, "Unable to bind because of security error", e);
}
// 4 OverviewProxyRecentsImpl.java 跨进程调用launcher3唤起最近列表
public void showRecentApps(boolean triggeredFromAltTab) {
IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
if (overviewProxy != null) {
try {
//调用onOverviewShown方法
overviewProxy.onOverviewShown(triggeredFromAltTab);
return;
} catch (RemoteException e) {
Log.e(TAG, "Failed to send overview show event to launcher.", e);
}
} else {
// Do nothing
}
}
实际调用
IOverviewProxy.aidl
路径:frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
/**
* Sent when overview is to be shown.
*/
void onOverviewShown(boolean triggeredFromAltTab) = 7;
Launcher3 的xml
<service android:name="com.android.quickstep.TouchInteractionService"
android:permission="android.permission.STATUS_BAR_SERVICE"
android:directBootAware="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.QUICKSTEP_SERVICE"/>
</intent-filter>
</service>
<activity android:name="com.android.quickstep.RecentsActivity"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:theme="@style/LauncherTheme"
android:screenOrientation="unspecified"
android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize|density"
android:resizeableActivity="true"
android:resumeWhilePausing="true"
android:taskAffinity=""/>
TouchInteractionService.java
路径:packages/apps/Launcher3/quickstep/src/com/android/quickstep/TouchInteractionService.java
//内部类实现了SystemUI下的代理
public class TISBinder extends IOverviewProxy.Stub{
@BinderThread
@Override
public void onOverviewShown(boolean triggeredFromAltTab) {
if (triggeredFromAltTab) {
TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_SHOW_NEXT_FOCUS);
} else {
//mOverviewCommandHelper 是核心方法
mOverviewCommandHelper.addCommand(OverviewCommandHelper.TYPE_SHOW);
}
}
}
OverviewCommandHelper.java
路径:packages/apps/Launcher3/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
@BinderThread
public void addCommand(int type) {
CommandInfo cmd = new CommandInfo(type);
MAIN_EXECUTOR.execute(() -> addCommand(cmd));
}
executeCommand(){
//这里的类 是 FallbackActivityInterface
BaseActivityInterface<?, T> activityInterface =
mOverviewComponentObserver.getActivityInterface();
//getVisibleRecentsView 返回 RecentsActivity
RecentsView recents = activityInterface.getVisibleRecentsView();
//...
///这里就把RecentsActivity 开启来了
final T activity = activityInterface.getCreatedActivity();
if (activity != null) {
InteractionJankMonitorWrapper.begin(
activity.getRootView(),
InteractionJankMonitorWrapper.CUJ_QUICK_SWITCH);
}
}
总结基础流程
SystemUI 中的CommandQueue.java 中的showRecentApps 使用来显示最近使用APP列表
Recents 实现中Callbacks,在回调showRecentApps 方法中 调用 OverviewProxyRecentsImpl.java 中的 showRecentApps
OverviewProxyRecentsImpl.java的onstart()里初始化了要调用的服务,调用Proxy.onOverviewShown()
在Prixy的初始化中,通过配置查找到了Launcher3里面相关的配置,即RecentsActivity
,通过服务绑定 启动了 Launcher3,通过filter 匹配,启动 TouchInteractionService
内部实现了代理的方法 ,最后调用到onOverviewShown, 最后调用getCreatedActivity ,将 RecentsActivity 启动。
其实就是SystemUI 调用的 Launcher3 。