1. 程式人生 > >Android 跨程序啟動Activity黑屏(白屏)的三種解決方案

Android 跨程序啟動Activity黑屏(白屏)的三種解決方案

當Android跨程序啟動Activity時,過程介面很黑屏(白屏)短暫時間(幾百毫秒?)。當然從桌面Lunacher啟動一個App時也會出現相同情況,那是因為App冷啟動也屬於跨程序啟動Activity。為什麼沒會出現這種情況呢?真正元凶就是Android建立程序需要準備很多資源,它是一個耗時的操作。

黑屏(白屏)原因

當A程序啟動B程序中的一個Activity時,Android系統會先有zygote程序建立B程序,然後才能啟動這個Activity。但建立程序是耗時的,在建立完成之前,新的Activity介面還沒機會展示,如此使用者在跳轉新的Activity時會短暫沒反應,這極大的降低使用者體驗。
Android團隊避免出現這種尷局面,於是系統根據你的manifest檔案設定的主題顏色的不同來展示一個白屏或者黑屏。而這個黑(白)屏被稱作Preview Window,即預覽視窗。

解決方案

1.禁用Preview Window
既然Android在建立程序啟動新Activity時預設設定了Preview Window,那麼我們也可以在主題中禁用該屬性。
style.xml

<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>

分析:這樣做可以解決部分場景的問題,比如在A程序啟動B程序中的Activity;但是在另外一個場景就有問題了,在桌面Launcher點選應用出現短暫的假死現象。
2.自定義Preview Window


既然Android可以根據主題設定Preview Windo黑屏(白屏),那麼我們也可以自定義一個Preview Window樣式來代替黑(白)屏效果。
style.xml

<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowBackground">@drawable/splash_icon</item>
<item name="android:windowFullscreen">true</item
>

<item name="android:windowNoTitle">true</item>
</style>

分析:該解決方案很適合啟動一個App場景,android:windowBackground屬性設定Preview Window的背景,市面上大部分App都是使用該屬性設定啟動頁背景。出於節省記憶體的考慮該背景圖片適合使用效果簡單的.9圖片。
但是該解決方案不適合在跨程序啟動Activity場景了。

3.設定Preview Window透明屬性
我們可以設定Preview Window 為透明,也可以解決問題
style.xml

<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
</style>

分析:該解決方案適合跨程序啟動Activity場景使用。當然這個解決方案也會引入其他問題,就是:android:windowIsTranslucent 引起activity切換動畫無效解決方案。為了追求極致,不能解決一個問題引入一個新問題,該問題的解決方案也有兩種:

  • 程式碼動態設定Activity專場動畫
 overridePendingTransition(R.anim.anim_right_in,R.anim.anim_left_out); 
  • 給Window 設定動畫style
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowAnimationStyle">@styleAnimation.Activity.Translucent.Style/</item>
</style>
<style name="Animation.Activity.Translucent.Style" parent="@android:style/Animation.Translucent">
<item name="android:windowEnterAnimation">@anim/base_slide_right_in</item>
<item name="android:windowExitAnimation">@anim/base_slide_right_out</item>
</style>

自此,跨程序啟動Activity黑(白)屏的三種方案已給出,看官可以根據不同場景使用以上不同解決方案

掃碼關注微信公眾號“Android知識傳播”,不定時傳播常用Android基礎知識。
Android知識傳播

相關推薦

Android 程序啟動Activity解決方案

當Android跨程序啟動Activity時,過程介面很黑屏(白屏)短暫時間(幾百毫秒?)。當然從桌面Lunacher啟動一個App時也會出現相同情況,那是因為App冷啟動也屬於跨程序啟動Activity。為什麼沒會出現這種情況呢?真正元凶就是Android建立

Android程序通訊AIDL詳解附原始碼

概述 AIDL:Android Interface Definition Language,即Android介面定義語言,記住,它是一門語言,設計它的目的就是為了實現跨程序通訊,我們知道Android的每一個程序都執行在獨立的記憶體中,程序之間程式碼是不能愉快

Android 進程啟動Activity解決方案

orien 但是 解決 icon draw lun 簡單 android基礎 分享 原文鏈接:http://www.cnblogs.com/feidu/p/8057012.html 當Android跨進程啟動Activity時,過程界面很黑屏(白屏)短暫時間(幾百毫秒?)。

Android程序通訊Binder原理分析

文章目錄 1 Binder原始碼分析 1.1 Service的註冊流程 1.2 Service的獲取流程 1.3 Service的使用流程 1 Binder原始碼分析 1.1 Service的註冊流程  

Android程序通訊Binder原理分析

文章目錄 1. Linux程序基礎 1.1 程序隔離 1.2 使用者空間/核心空間 1.3 核心模組/驅動 1.4 圖解 2. 為什麼要使用Binder 2.1 安全方面 2.2 效能方面(一

Android:應用啟動Activity

要實現跨應用啟動Activity,需要用到隱式Intent 比如要在應用A的MainActivity中啟動應用B的BeStartActivity,程式碼如下: 1.更改被啟動Activity的配置 開啟被啟動的應用B的配置檔案AndroidManifest.xm

Android系統程序Activity管理——ActivityManagerServiceAMS

一. 為什麼會有AMS 對於Android app開發人員來說,Activity是其打交道最多的元件了:App的每一個介面都對應於一個Activity。每個Activity都有他的生命週期(那幾個生命週期應該已經爛熟於心了吧),所以我們應該有一種機制來記錄並管理這些Acti

作業系統8程序--同步互斥介紹;同步問題的解決方案:禁用硬體中斷、基於軟體、更高階抽象

文章目錄 1. 背景 2. 同步問題的一個例子 3. 同步問題的初步解決方案 1. 方法一 禁用硬體中斷 2. 方法二 基於軟體的同步辦法 3. 方法三 更高階的抽象方法

站指令碼攻擊XSS解決方案淺析

一、概述        Cross-site scripting(CSS or XSS)跨站指令碼不像其他攻擊只包含兩個部分:攻擊者和web站點,跨站指令碼包含三個部分:攻擊者,客戶和web站點。跨站指令碼攻擊的目的是竊取客戶的cookies,或者其他可以證明使用者身份的敏

ajax域問題解決方案

為什麼會出現跨域 跨域問題來源於JavaScript的同源策略,即只有 協議+主機名+埠號 (如存在)相同,則允許相互訪問。也就是說JavaScript只能訪問和操作自己域下的資源,不能訪問和操作其

【轉】Mybatis傳多個參數解決方案

三種 方案 var nbsp myba rom name bsp 什麽 轉自: http://www.2cto.com/database/201409/338155.html 據我目前接觸到的傳多個參數的方案有三種。 第一種方案: DAO層的函數方法 Public

修改陣列中的變數,無法立馬觸發檢視更新解決方案

第一:使用$set. 直接給student賦值操作,雖然可以新增屬性,但是不會觸發檢視更新 mounted () { this.student.age = 24}原因是:受 ES5 的限制,Vue.js 不能檢測到物件屬性的新增或刪除。因為 Vue.js 在初始化例項時將屬性轉為 getter/sette

Wine 中文亂碼換字型最簡單解決方案

今天裝kali linux發現這個問題,百度到的全是一篇文章,谷歌一下找到這個,發現挺好的。 編輯一個檔案,按下面說法寫好,儲存檔案*.reg(如 zh.reg),在命令列下面輸入 regedit zh.reg 然後重啟Wine,就神器的可以用了,當然換字型也一樣。

猴子選大王約瑟夫環問題解決方案

問題: 有M只猴子圍成一圈,按序每隻從1到M中的編號,打算從中選出一個大王;經過協商,決定出選大王的規則:從第一個開始迴圈報數,數到N的猴子出圈,最後剩下來的就是大王。要求:從鍵盤輸入M、N,程式設計計算哪一個編號的猴子成為大王 示例: 比如有5只猴子,從1到3報數,則選

Mybatis傳多個參數解決方案 mapper.xml的sql語句修改!

修改 and 接收 select sql 函數 resultmap rom var 第一種 Public User selectUser(String name,String area); 對應的Mapper.xml <select id="selectUs

Python2.x編譯器列印中文出現亂碼的解決方案本人以VS2017與VS Code為例,使用其他整合開發工具的也可參考下

本文主要介紹了三種解決方案: 解決方案一:在需要列印的中文字元前加個u,用於標識所要列印的是一個Unicode字串。(我感覺著一種方法是最簡單和省事的,並且使用其他整合開發工具的若遇到類似的問題,也應該可以使用這種方法解決,具體大家可以在下方評論)(測試此方法不適合在Vis

蘋果無線網絡卡的解決方案

1.HoRNDIS驅動軟體 點選下載 2.360免費wifi 我這兒有360 2代的驅動 下載地址銜接密碼: myzh) 3.淘寶買一個無線網絡卡,換

linux中network啟動不了的解決方案

我百度了好久,沒找到我的問題,後來是google找到的(1) 檢視主機地址  ip addr  link/other 後既是主機地址修改/etc/sysconfig/network-scripts/ifcfg-ens33 檢視HWADDR地址如果沒有,新增,如果和ip add

Android 校正系統時間的解決方案

前言 在開發過程中我們常常需要獲取系統時間。 Android系統的自動確認時間,是由系統通過訪問廠家的NTP伺服器的時間,然後修改後得到的。 所以當沒有網路或者在內網環境下的時候,系統無法訪問到NTP伺服器,便會造成系統時間錯誤。 所以這個時候我們就需要

spring cloud微服務快速教程之十二 分散式ID解決方案mybatis-plus篇

0-前言   分散式系統中,分散式ID是個必須解決的問題點;   雪花演算法是個好方式,不過不能直接使用,因為如果直接使用的話,需要配置每個例項workerId和datacenterId,在微服務中,例項一般動態配置,直接指定具體例項的這兩個引數是不現實的;   所以,一般採用雪花演算法的變種,主要是將這兩個