android开机动画到桌面黑屏解决办法

开机过程,从android动画到桌面显示的时候会有黑屏现象,网上也有很多解决办法,这里介绍的方法用的是通过判断一个标志位,当标志位还没有为1时,android动画BootAnimation::checkExit()不能退出,直接返回;当真正进入桌面后,把标志位设为1,BootAnimation::checkExit()才能退出,真正完成开机动画的播放

播放动画结束标志

frameworks\base\cmds\bootanimation\BootAnimation.cpp

static const char EXIT_ANIM_NAME[] = "persist.bootanim.exit";//自定义属性
void BootAnimation::checkExit() {
    // Allow surface flinger to gracefully request shutdown
    char value[PROPERTY_VALUE_MAX];
    char jvalue[PROPERTY_VALUE_MAX];
    property_get(EXIT_PROP_NAME, value, "0");
    property_get(EXIT_ANIM_NAME, jvalue, "0");
    int exitnow = atoi(value);
    int jexitnow = atoi(jvalue);
    if (exitnow) {
    		if(jexitnow == 0) {
    			retrun;
    		}
        requestExit();
        mCallbacks->shutdown();
    }
}

 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java

    private boolean checkBootAnimationCompleteLocked() {
        //if (SystemService.isRunning(BOOT_ANIMATION_SERVICE)) {
        	if(!"1".equals(SystemProperties.get("service.bootanim.exit", "0"))){//判断标志位是否已经为1
            mH.removeMessages(H.CHECK_IF_BOOT_ANIMATION_FINISHED);
            mH.sendEmptyMessageDelayed(H.CHECK_IF_BOOT_ANIMATION_FINISHED,
                    BOOT_ANIMATION_POLL_INTERVAL);
            if (DEBUG_BOOT) Slog.i(TAG_WM, "checkBootAnimationComplete: Waiting for anim complete");
            return false;
        }
        if (DEBUG_BOOT) Slog.i(TAG_WM, "checkBootAnimationComplete: Animation complete!");
        return true;
    }

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

private void reportLaunchTimeLocked(final long curTime) {
        final ActivityStack stack = getStack();
        if (stack == null) {
            return;
        }
        final long thisTime = curTime - displayStartTime;
        final long totalTime = stack.mLaunchStartTime != 0
                ? (curTime - stack.mLaunchStartTime) : thisTime;
                
				if(shortComponentName!=null&&shortComponentName.contains("yourlauncher")){//判断是否已经启动你launcher
					SystemProperties.set("persist.bootanim.exit", "1");//设置启动完成标志
				}
。。。。。。

 

另外一种解决办法,参考https://blog.csdn.net/DKBDKBDKB/article/details/101284914

android7.0之后,引入了directboot模式,系统启动后,开机动画走完,是先走到了Settings下一个FallbackHome.java 的activity,这个里边再去引出真正的Launcher,而这个activity是没有任何布局文件的,所以该过程就黑了,怎么体现衔接性呢,由于我们的设备开机动画是静态的一张图片,因此想到了在进入这个activity之后,将背景设置为开机动画图片,从而实现了动画到launcher的无缝连接!!!

具体改动如下:

diff --git a/src/com/android/settings/FallbackHome.java b/src/com/android/settings/FallbackHome.java
index 5f7b639..0686ffa 100644
--- a/src/com/android/settings/FallbackHome.java
+++ b/src/com/android/settings/FallbackHome.java
@@ -64,6 +64,9 @@ public class FallbackHome extends Activity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        //getWindow().getDecorView().setBackgroundColor(Color.WHITE);
+        Log.e(TAG, "=========  FallbackHome  start display picture  ==========");
+        getWindow().setBackgroundDrawableResource(R.drawable.start);
         // Set ourselves totally black before the device is provisioned so that
         // we don't flash the wallpaper before SUW
         mProvisioned = Settings.Global.getInt(getContentResolver(),
@@ -125,6 +128,8 @@ public class FallbackHome extends Activity {
                 Log.d(TAG, "User unlocked and real home found; let's go!");
                 getSystemService(PowerManager.class).userActivity(
                         SystemClock.uptimeMillis(), false);
+                //this.getWindow().getDecorView().setBackgroundColor(Color.WHITE);
+                Log.e(TAG, "=========  FallbackHome  stop display picture  ==========");
                 finish();
             }
         }

另外把start.png(开机图片)放至drawable目录。

 

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值