App 冷啟動(dòng)與熱啟動(dòng)及啟動(dòng)白屏優(yōu)化

介紹一下 app 冷啟動(dòng)和熱啟動(dòng)方式來實(shí)現(xiàn) app 秒開的效果坪创。那么炕婶,先來看看什么叫冷啟動(dòng)和熱啟動(dòng)。

冷啟動(dòng):指 app 被后臺(tái)殺死后莱预,在這個(gè)狀態(tài)打開 app柠掂,這種啟動(dòng)方式叫做冷啟動(dòng)。

熱啟動(dòng):指 app 沒有被后臺(tái)殺死依沮,仍然在后臺(tái)運(yùn)行涯贞,通常我們?cè)俅稳ゴ蜷_這個(gè) app,這種啟動(dòng)方式叫熱啟動(dòng)危喉。

那么宋渔,何為閃屏頁呢?這個(gè)大家一般都知道辜限,我們 app 也非常常見的傻谁。比如微信、QQ 等等應(yīng)用列粪,你將這些應(yīng)用清除掉它們的后臺(tái)運(yùn)行的情況下审磁,再去打開。這時(shí)候會(huì)出現(xiàn)一個(gè)閃屏頁岂座,類似我們的背景頁态蒂。這個(gè)頁面停留的時(shí)間非常短,一般不會(huì)超過 3秒费什,太久了就會(huì)使用戶感覺這個(gè) app 好卡的樣子钾恢。

然后,我們看新建的一個(gè)項(xiàng)目鸳址,不做任何操作運(yùn)行時(shí)會(huì)發(fā)現(xiàn)它在啟動(dòng)之時(shí)會(huì)有一個(gè)白屏的時(shí)間瘩蚪。那么,大部分 app 的解決方式就是我上面提到的閃屏頁來替換白屏頁稿黍。其實(shí)疹瘦,也就是替換默認(rèn)的 activity 的 theme。我們看看白屏的效果(其實(shí)在我點(diǎn)下的瞬間巡球,已經(jīng)是白屏了言沐。模擬器也許屏蔽了,在手機(jī)上非常直觀)

image.png

為什么替換酣栈?這就是提升我們的用戶體驗(yàn)了险胰,可以發(fā)現(xiàn)我們白屏頁顯得非常的難看,而且用戶可能會(huì)誤以為這是app卡的結(jié)果造成的矿筝。如果我們換成了閃屏頁起便,不僅可以為app添加屬于自己的臉面,也可以造成一種app秒開的假象窖维。用戶發(fā)現(xiàn)app已經(jīng)被打開了榆综,為何遲遲不進(jìn)去,那可能是覺得手機(jī)不夠給力啊陈辱,哈哈奖年。

實(shí)現(xiàn)步驟

我們提到秒開app,不管它是一種假象也罷沛贪,既然市面上大部分的app都是這么處理的陋守,不妨我們也學(xué)習(xí)一下。

一利赋、設(shè)置 style 主題

首先水评,我們?yōu)殚W屏頁設(shè)置它的style,通常它是隱藏標(biāo)題欄媚送、隱藏狀態(tài)欄中燥、全屏的,然后用一張突顯app主題的背景圖片來填充整個(gè)屏幕塘偎。那么疗涉,我們這樣設(shè)置它:

<!--閃屏頁-->
 <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
 <item name="android:windowBackground">@drawable/bg_splash_theme_leader</item>
 <item name="android:windowNoTitle">true</item>
 <item name="android:windowFullscreen">true</item>
 </style>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item>
 <bitmap
 android:gravity="fill"
 android:src="@drawable/splash" />
 </item>
</layer-list>

二拿霉、綁定到 Activity 上

然后,將這一主題運(yùn)用到我們需要的activity上,比如我的SplashActivity:

<activity
 android:name=".SplashActivity"
 android:launchMode="singleTask"
 android:screenOrientation="portrait"
 android:theme="@style/SplashTheme">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>

最后,運(yùn)行項(xiàng)目朝扼,你就會(huì)體會(huì)到什么叫做冷啟動(dòng)秒開應(yīng)用了拳魁。我們先前的白屏頁面,最終變成了一張自己的圖片,即顯得美觀,又達(dá)到了秒開的目的,真是一舉兩得杀怠!
分析

注意:我們的SplashActivity不做任何初始化和設(shè)置布局,在onCreate中直接開啟我們的MainActivity就行了厅克。否則赔退,在SplashActivity中停留過多的時(shí)間,就會(huì)出現(xiàn)卡在閃屏頁許久才進(jìn)入已骇,我們的秒開也就變了味离钝。

再說說我們的熱啟動(dòng)實(shí)現(xiàn)方式,通常我們按下back鍵時(shí)褪储,activity的生命周期會(huì)執(zhí)行onStop卵渴,onDestory ——> onCreate。造成我們?cè)噲D被銷毀了又得重新創(chuàng)建鲤竹。但是浪读,我們按下home鍵卻是不一樣的,activity的生命周期會(huì)執(zhí)行onStop ——>onReStart辛藻,所以熱啟動(dòng)就是以back鍵替換成了home鍵碘橘,其實(shí)app是被置到了后臺(tái),所以當(dāng)你再次點(diǎn)擊打開app時(shí)吱肌,它會(huì)馬上的啟動(dòng)痘拆。

但是,這類app通常是用于后臺(tái)處理比較重要的氮墨,比如QQ后臺(tái)接收信息纺蛆,音樂播放器后臺(tái)播放,通常都是屏蔽了back鍵规揪,或者會(huì)有一個(gè)back鍵防誤觸操作桥氏。當(dāng)然,這就得我們自己的app的自身需求了猛铅,通常做法就是將back鍵改為home鍵操作

 /**
 * App 熱啟動(dòng)方式字支,實(shí)現(xiàn)應(yīng)用程序秒開效果
 */
 @Override
 public void onBackPressed() {
 //直接返回桌面 ( Activity只執(zhí)行onStop )
 if (isStartHome()) {
 Intent intent = new Intent("android.intent.action.MAIN");
 intent.addCategory("android.intent.category.HOME");
 startActivity(intent);
 } else {
 super.onBackPressed();//( Activity將執(zhí)行onDestory )
 }
 }

一種優(yōu)化啟動(dòng)的思路

這是我很久之前看到的一種思路,既然說到閃屏頁,那就一并說明堕伪。它是利用EventBus揖庄,在application的創(chuàng)建時(shí)期不加載各種配置和各種庫,而是先顯示閃屏頁欠雌。在閃屏頁中抠艾,利用EventBus開啟各種配置和庫的加載(application中進(jìn)行),等到這些庫加載完畢后桨昙,再次利用EventBus發(fā)送事件進(jìn)入主界面。

思路就是利用閃屏頁的時(shí)間用于加載各種配置和庫腌歉,而不是在application創(chuàng)建時(shí)就加載蛙酪。我們看一下代碼的實(shí)現(xiàn)方式

public abstract class WeatherAppclication extends Application {
 @Override
 public void onCreate() {
 super.onCreate();
 //在此,先不加載庫
 EventBus.getDefault().register(this);
 }
 
 @Subscribe
 public void init(String event) {
 //在這里初始化一坨一坨的庫
 if ("initConfigurations".equals(event)) {
 Weather.init(this)
 .withApiHost("http://")
 .withApiKey("6439e059e16")
 .configure();
 
 EventBus.getDefault().post("initSuccess");
 EventBus.getDefault().unregister(this);
 }
 }
}
/**
 * @Created by xww.
 * @Creation time 2018/8/25.
 */
 
public class SplashActivity extends AppCompatActivity {
 
 private static final String TAG = "SplashActivity";
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 EventBus.getDefault().register(this);
 EventBus.getDefault().post("initConfigurations");
 }
 
 @Subscribe
 public void startMainActivity(String event) {
 if ("initSuccess".equals(event)) {
 //在這里加載所需庫完成翘盖,進(jìn)入主界面
 startActivity(new Intent(SplashActivity.this, WeatherActivity.class));
 finish();
 }
 }
 
 @Override
 protected void onDestroy() {
 super.onDestroy();
 EventBus.getDefault().unregister(this);
 }
 
 /**
 * 屏蔽了返回鍵桂塞,避免在閃屏頁中退出app
 */
 @Override
 public void onBackPressed() {
 }
}

我們的Log也可以很好的說明它們的執(zhí)行順序,成功的印證我們的思路是正確的馍驯。

image.png

這樣的話阁危,我們可以在啟動(dòng) splash 頁面加載一下庫,然后加載完成后汰瘫,進(jìn)入主頁面狂打,由于資源都初始化好了,自然用起來就快一點(diǎn)混弥,效果圖:
image.png

這里我們點(diǎn)擊桌面圖標(biāo)時(shí)趴乡,一啟動(dòng)的就是我們的 splash 的一張圖,而不是白茫茫的背景了蝗拿,看起來舒服了許多晾捏。
參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哀托,隨后出現(xiàn)的幾起案子惦辛,更是在濱河造成了極大的恐慌,老刑警劉巖仓手,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胖齐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俗或,警方通過查閱死者的電腦和手機(jī)市怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辛慰,“玉大人区匠,你說我怎么就攤上這事。” “怎么了驰弄?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵麻汰,是天一觀的道長。 經(jīng)常有香客問我戚篙,道長五鲫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任岔擂,我火速辦了婚禮位喂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乱灵。我一直安慰自己塑崖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布痛倚。 她就那樣靜靜地躺著规婆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝉稳。 梳的紋絲不亂的頭發(fā)上抒蚜,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音耘戚,去河邊找鬼嗡髓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毕莱,可吹牛的內(nèi)容都是我干的器贩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼朋截,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蛹稍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起部服,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤唆姐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后廓八,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奉芦,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年剧蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了声功。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宠叼,死狀恐怖先巴,靈堂內(nèi)的尸體忽然破棺而出其爵,到底是詐尸還是另有隱情,我是刑警寧澤伸蚯,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布摩渺,位于F島的核電站,受9級(jí)特大地震影響剂邮,放射性物質(zhì)發(fā)生泄漏摇幻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一挥萌、第九天 我趴在偏房一處隱蔽的房頂上張望绰姻。 院中可真熱鬧,春花似錦引瀑、人聲如沸龙宏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辆影,卻和暖如春徒像,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛙讥。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工锯蛀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人次慢。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓旁涤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迫像。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劈愚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容