延迟开机时间。规避第一次刷机启动后莫名会拉出白屏。

延迟开机时间:

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

在privatevoid performEnableScreen() {方法中

有个

if (!mBootAnimationStopped) {

源码是执行

SystemProperties.set("service.bootanim.exit","1");

mBootAnimationStopped = true;

就是告诉系统开机动画加载完毕了

我们这里做个延迟

mH.postDelayed(
                    new Runnable() {
                        @Override
                            public void run() {
                           SystemProperties.set("service.bootanim.exit", "1");
                           mBootAnimationStopped = true;
                        }
                    },2000);

用到的handler这个mH就是源码有的

规避第一次刷机启动后莫名会拉出白屏:

最优解:

packages/apps/Provision/AndroidManifest.xml

就一个<activityandroid:name="DefaultActivity"

加入属性:

android:directBootAware="true"

由于FallbackHome启动后需要接受到用户取消解锁广播后才finish自己,启动下一个homeActivity,这样就引起了白屏闪现。因此打开Provision 的directBootAware属性,使其可直接启动。

这个加入之后第一次刷开机会出现个读条显示:yourphone is starting

Provision就是个开机向导应用,这个应用就是先于launcher的。拉出的白屏很可能就是这个DefaultActivity

源码

public class DefaultActivity extends Activity {
 
    @Override
    protected voidonCreate(Bundle icicle) {
       super.onCreate(icicle);
 
        // Add apersistent setting to allow other apps to know the device has been provisioned.
       Settings.Global.putInt(getContentResolver(),Settings.Global.DEVICE_PROVISIONED, 1);
       Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE,1);
 
        // remove thisactivity from the package manager.
        PackageManagerpm = getPackageManager();
        ComponentNamename = new ComponentName(this, DefaultActivity.class);
       pm.setComponentEnabledSetting(name,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
               PackageManager.DONT_KILL_APP);
        // terminatethe activity.
        finish();
    }
}

不然就直接把这个应用override掉,不要了

猜你喜欢

转载自blog.csdn.net/youthking1314/article/details/128913764