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目錄。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章