Android10.0 最近任务Recents功能分析

在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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙之叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值