一 定制简单的 StartingWindow
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.StartingWindowTheme">
<!-- 应用启动页(StartingWindow)的theme -->
<style name="AppTheme.StartingWindowTheme" parent="AppTheme">
<!-- 可以设置成纯颜色(设置一个和Activity UI相似的背景) -->
<!--<item name="android:windowBackground">@color/startingwindow_bgcolor</item>-->
<!--也可以设置成一张图片 -->
<item name="android:windowBackground">@drawable/startingwindow_bg</item>
</style>
二 FWK调用过程:
在startActivityLocked, resumeTopActivityInnerLocked,SHOW_APP_STARTING_PREVIEW 为true时,都有去调用showStartingWindow。
//当该activity运行在新的task中或者进程中时,需要在activity显示之前显示一个Starting Window
//在桌面点击时,Launcher先让自己做一个退出动画,APP还在activitystart阶段时由Launcher发出一个StartingWindow,等待app的第一帧绘制好后,再切换到APP的第一帧动画
void showStartingWindow(ActivityRecord prev, boolean createIfNeeded) {
final CompatibilityInfo compatInfo =
service.compatibilityInfoForPackageLocked(info.applicationInfo);
final boolean shown = service.mWindowManager.setAppStartingWindow(
appToken, packageName, theme, compatInfo, nonLocalizedLabel, labelRes, icon,
logo, windowFlags, prev != null ? prev.appToken : null, createIfNeeded);
if (shown) {
mStartingWindowState = STARTING_WINDOW_SHOWN;
}
}
binder调用WMS中的setAppStartingWindow 调用成功说明启动了StartingWindow。
public boolean setAppStartingWindow{
//通过 Activity 的token 找windowtoken。这个token 创建: ActivityRecord(ActivityMan