延迟开机时间:
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掉,不要了