<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lifecycle &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/lifecycle/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Wed, 12 Oct 2022 07:15:53 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>lifecycle &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</title>
		<link>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/</link>
					<comments>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 29 Feb 2012 12:30:06 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[lifecycle]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[onConfigurationChanged]]></category>
		<category><![CDATA[screenOrientation]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2120</guid>

					<description><![CDATA[<p>前幾篇文章中介紹了 使用Activity取代TabActivity 以及 透過ActivityGroup達到TabHost中切換Activity。之後會再補上使用 FragmentActivity +&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/" data-wpel-link="internal">Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>前幾篇文章中介紹了<strong> <a href="https://noter.tw/2109" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">使用Activity取代TabActivity</a> </strong>以及<strong> <a href="https://noter.tw/2114" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">透過ActivityGroup達到TabHost中切換Activity</a></strong>。之後會再補上使用 <strong>FragmentActivity + Fragment + TabHost </strong>的作法 (Google 建議使用 Fragment)。這篇文章小蛙要記錄當使用者螢幕方向改變時的處理方式。<br />
<span id="more-2120"></span>在發表完上面兩篇文章後，小蛙馬上實作看看使用 <strong>FragmentActivity </strong>的方法，實作上面跟 <strong>ActivityGroup </strong>差不多，勝過 ActivityGroup 的部分在於有<strong>自動維護的 BackStack</strong>，不用再自行建立 ArrayList&lt;View&gt; history 來管理 BackStack。至於為什麼沒有馬上發表文章呢？是因為小蛙想要把螢幕方向這件事情一起處理掉再發表，目前的情況是這樣的：</p>
<p><a href="https://lh3.googleusercontent.com/-G5xDZcMB46k/T03qTlq7ANI/AAAAAAAAEMo/oZaTRQIRWeA/s800/orientation.PNG" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img fetchpriority="high" decoding="async" class="aligncenter" title="Android orientation" src="https://lh3.googleusercontent.com/-G5xDZcMB46k/T03qTlq7ANI/AAAAAAAAEMo/oZaTRQIRWeA/s800/orientation.PNG" alt="orientation Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle" width="611" height="284"></a></p>
<p>問題1.</p>
<p>使用者在 portrait 時切換到 Tab 2，翻轉螢幕成 landscape 時卻回到 Tab 1 (應該要停在 Tab 2)。</p>
<p>問題2.</p>
<p>軟體啟動時為 portrait(A)，使用者在 Tab 1 先後運行了 Page1-1、Page1-2、Page1-3，在 Tab2 也同樣運行了 Page2-1 ~ Page2-4，這時候使用者翻轉螢幕變成landscape(B)，BackStack 全部被清光光，使用者看到的畫面變成軟體剛啟動時的空白畫面。</p>
<p>針對問題1小蛙直接使用 <strong><a href="https://noter.tw/1892" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">onSaveInstanceState, onRestoreInstanceState使用</a> </strong>這個方法複寫了 <strong>onRestoreInstanceState </strong>及 <strong>onSaveInstanceState </strong>兩個方法。</p>
<div>
<div id="highlighter_780226" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java color1">@Override</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onSaveInstanceState(Bundle outState) {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java comments">// 發生翻轉動作的時候將目前頁籤儲存到Bundle中</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java plain">outState.putInt(</code><code class="java string">"which"</code><code class="java plain">, tabHost.getCurrentTab());</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onSaveInstanceState(outState);</code></div>
<div class="line number6 index5 alt1"><code class="java plain">}</code></div>
<div class="line number7 index6 alt2"><code class="java color1">@Override</code></div>
<div class="line number8 index7 alt1"><code class="java keyword">protected</code> <code class="java keyword">void</code> <code class="java plain">onRestoreInstanceState(Bundle savedInstanceState) {</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">    </code><code class="java comments">// 把剛剛存的取出來</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">    </code><code class="java keyword">if</code><code class="java plain">(savedInstanceState != </code><code class="java keyword">null</code><code class="java plain">)</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">        </code><code class="java plain">tabHost.setCurrentTab(savedInstanceState.getInt(</code><code class="java string">"which"</code><code class="java plain">));</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onRestoreInstanceState(savedInstanceState);</code></div>
<div class="line number13 index12 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>但是今天發現了一個新的東西叫作「<a href="http://developer.android.com/guide/topics/manifest/activity-element.html#config" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><span style="color: #ff0000;"><strong><code>android:configChanges</code></strong></span><span class="wpel-icon wpel-image wpel-icon-6"></span></a>」，這應該算是一個蠻基礎的設定，小蛙真是太失敗了&#8230;下面這個設定方法可以一併解決上述問題 1,2，也就是說上面的方法不需要用到。用小蛙簡單白話的說明就是：</p>
<blockquote><p>當使用者翻轉螢幕時，就歷經了一次舊 Activity 的死亡及新 Activity 的誕生，透過 android:configChanges 可以使得翻轉螢幕的動作不用歷經這一個過程，取而代之的是呼叫 onConfigurationChanged 方法。</p></blockquote>
<p>好吧！總而言之就是只要在 <strong>AndroidManifest.xml </strong>的 Activity 敘述中加入<strong>android:configChanges=&#8221;orientation&#8221;</strong>，如此一來，當發生螢幕翻轉事件的時候，就可以保留各個 Tab 的狀態以及 BackStack 囉！另外可以透過複寫 onConfigurationChanged 方法來做更進一步的處理。例如官方範例：</p>
<div>
<div id="highlighter_410817" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java color1">@Override</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">onConfigurationChanged(Configuration newConfig) {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">    </code><code class="java keyword">super</code><code class="java plain">.onConfigurationChanged(newConfig);</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">    </code><code class="java comments">// Checks the orientation of the screen</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">    </code><code class="java keyword">if</code> <code class="java plain">(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">        </code><code class="java plain">Toast.makeText(</code><code class="java keyword">this</code><code class="java plain">, </code><code class="java string">"landscape"</code><code class="java plain">, Toast.LENGTH_SHORT).show();</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">    </code><code class="java plain">} </code><code class="java keyword">else</code> <code class="java keyword">if</code> <code class="java plain">(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">        </code><code class="java plain">Toast.makeText(</code><code class="java keyword">this</code><code class="java plain">, </code><code class="java string">"portrait"</code><code class="java plain">, Toast.LENGTH_SHORT).show();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">    </code><code class="java plain">}</code></div>
<div class="line number10 index9 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>附上 Android Activity Lifecycle 圖 (圖片來源：<a href="http://developer.android.com/reference/android/app/Activity.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://developer.android.com/reference/android/app/Activity.html<span class="wpel-icon wpel-image wpel-icon-6"></span></a>)。<br />
<a href="https://lh6.googleusercontent.com/-7Pj4WcuPH_A/T03yugNy6xI/AAAAAAAAEM0/bPKsMNREUNs/s800/activity_lifecycle.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Activity Lifecycle" src="https://lh6.googleusercontent.com/-7Pj4WcuPH_A/T03yugNy6xI/AAAAAAAAEM0/bPKsMNREUNs/s800/activity_lifecycle.png" alt="activity lifecycle Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle" width="523" height="673"></a><br />
由於小蛙看到 横竖屏切换时候Activity的生命周期 @ Android开发教程 ( http://android.tgbus.com/Android/tutorial/201103/346550.shtml 連結已失效) 及 【亲测】Activity中的 ConfigChanges 属性以及横竖屏切换时候 Activity 的生命周期 @ 漫步云端 (http://www.cnblogs.com/charley_yang/archive/2011/04/17/2018940.html 連結已失效) 這兩篇文章中的 Lifecycle 感覺有點奇怪，於是自己測了一下，所得到的結果似乎不太一樣，可能是模擬器的行為跟手機的不同，也有可能是 Android 版本不同 (小蛙是用 HTC Desire + MIUI2.3 測試的，android:minSdkVersion=&#8221;4&#8243;)，以下是測試結果供參考。</p>
<div>
<div id="highlighter_492244" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">// 正常啟動Activity</code></div>
<div class="line number2 index1 alt1"><code class="text plain">onCreate</code></div>
<div class="line number3 index2 alt2"><code class="text plain">onStart</code></div>
<div class="line number4 index3 alt1"><code class="text plain">onResume</code></div>
<div class="line number5 index4 alt2"><code class="text plain">// 結束Activity</code></div>
<div class="line number6 index5 alt1"><code class="text plain">onPause</code></div>
<div class="line number7 index6 alt2"><code class="text plain">onStop</code></div>
<div class="line number8 index7 alt1"><code class="text plain">onDestroy</code></div>
<div class="line number9 index8 alt2"><code class="text plain">// 翻轉螢幕(直轉橫、橫轉直)</code></div>
<div class="line number10 index9 alt1"><code class="text plain">onSaveInstanceState</code></div>
<div class="line number11 index10 alt2"><code class="text plain">onPause</code></div>
<div class="line number12 index11 alt1"><code class="text plain">onStop</code></div>
<div class="line number13 index12 alt2"><code class="text plain">onDestroy</code></div>
<div class="line number14 index13 alt1"><code class="text plain">onCreate</code></div>
<div class="line number15 index14 alt2"><code class="text plain">onStart</code></div>
<div class="line number16 index15 alt1"><code class="text plain">onRestoreInstanceState</code></div>
<div class="line number17 index16 alt2"><code class="text plain">onResume</code></div>
<div class="line number18 index17 alt1"><code class="text plain">// 翻轉螢幕(直轉橫、橫轉直)</code></div>
<div class="line number19 index18 alt2"><code class="text plain">// 以及android:configChanges="orientation"</code></div>
<div class="line number20 index19 alt1"><code class="text plain">onConfigurationChanged</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>今天用模擬器測試了一下，android:configChanges=&#8221;orientation&#8221; 在模擬器上沒法正常使用，必須要改成 android:configChanges=&#8221;orientation|keyboardHidden&#8221;，有遇到問題的網友不妨試試看。</p>
<p>最後memo一下，小蛙在<a href="http://developer.android.com/guide/topics/resources/runtime-changes.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">官網連結<span class="wpel-icon wpel-image wpel-icon-6"></span></a>中看到 <span style="color: #ff0000;"><strong>onRetainNonConfigurationInstance </strong></span>這個東西，查了三篇文章大概看了一下內容看起來應該蠻實用的，之後有空實作完再把結果Post上來。</p>
<p><strong><a href="http://chipin01.blogspot.com/2009/04/android.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">[Android] 煩人的螢幕旋轉 @ 生活藝術 ● 藝術生活<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong><br />
<a href="http://chengbs.iteye.com/blog/1156167" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>activity状态的保存和保持(onRetainNonConfigurationInstance和getLastNonConfigurationInstance) @ chengbs</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a><br />
<a href="http://blog.yam.com/ipray/article/29768416" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right"><strong>[Android] 比較onSaveInstanceState() 與 onRetainNonConfigurationInstance() 函式 @ 我思故我在</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/" data-wpel-link="internal">Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2120/android-screen-orientation-event%e8%9e%a2%e5%b9%95%e6%96%b9%e5%90%91%e8%99%95%e7%90%86acitivity-liftcycle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>onSaveInstanceState, onRestoreInstanceState使用</title>
		<link>https://noter.tw/1892/onsaveinstancestate-onrestoreinstancestate%e4%bd%bf%e7%94%a8/</link>
					<comments>https://noter.tw/1892/onsaveinstancestate-onrestoreinstancestate%e4%bd%bf%e7%94%a8/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 18 Jan 2012 11:00:10 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[onSaveInstanceState]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[lifecycle]]></category>
		<category><![CDATA[onActivity]]></category>
		<category><![CDATA[onActivityResult]]></category>
		<category><![CDATA[onRestoreInstanceState]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=1892</guid>

					<description><![CDATA[<p>這篇文章要記錄onSaveInstanceState以及onRestoreInstanceState的使用，小蛙其實對這個部分了解還不是很透徹，但是小蛙的做法的確是可以work，供大家做個參考囉！ 照&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1892/onsaveinstancestate-onrestoreinstancestate%e4%bd%bf%e7%94%a8/" data-wpel-link="internal">onSaveInstanceState, onRestoreInstanceState使用</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>這篇文章要記錄<span style="color: #ff0000;"><strong>onSaveInstanceState</strong></span>以及<span style="color: #ff0000;"><strong>onRestoreInstanceState</strong></span>的使用，小蛙其實對這個部分了解還不是很透徹，但是小蛙的做法的確是可以work，供大家做個參考囉！<br />
<span id="more-1892"></span><br />
照照明星臉上架以來直到現在(好慚愧)，一直無法擺脫拍完照片，或是從相簿選取圖片後無法使用的情況(有些是Force Close, 有些是直接跳回主畫面沒有任何反應)，這裡面的問題有很多，是小蛙一開始不太能夠完全掌握相機及相簿的使用造成的，後來慢慢的大部分的機種都可以正常使用，卻面臨到同樣機種的手機，有些可以正常使用，有些卻無法使用，例如：HTC Sensation有使用者回報正常使用，卻也有回報無法使用 … 同樣的最近小蛙面臨到的是 SE Arc S。<br />
小蛙的同事昨天跟小蛙說，他的Arc S沒有辦法使用明星臉，跟上面敘述的是一樣的問題，小蛙借了他的Arc S測試後發現，拍照前建立的tmpFile以及傳給相機的imageUri，<strong>在最後onActivityResult回來後全部都變成null</strong>，小蛙百思不得其解啊！為什麼回到主畫面之後會變成null，直到看到這篇<a href="http://stackoverflow.com/questions/7285998/camera-intent-staying-open-on-android" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">stackoverflow的文章<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，文章的標題雖然看起來沒關係，但jeffamaphone的回應幫了小蛙大忙！</p>
<blockquote><p>onSaveInstanceState跟onRestoreInstanceState的官方說明如下(截錄自<a href="http://developer.android.com/reference/android/app/Activity.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Activity | Android Developers<span class="wpel-icon wpel-image wpel-icon-6"></span></a>)：</p>
<h4>protected void onSaveInstanceState (<a href="http://developer.android.com/reference/android/os/Bundle.html" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Bundle<span class="wpel-icon wpel-image wpel-icon-6"></span></a> outState)</h4>
<div>
<div>Since: <a href="http://developer.android.com/guide/appendix/api-levels.html#level1" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">API Level 1<span class="wpel-icon wpel-image wpel-icon-6"></span></a></div>
</div>
<div>
Called to retrieve per-instance state from an activity before being killed so that the state can be restored in <code><a href="http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onCreate(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> or <code><a href="http://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onRestoreInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> (the <code><a href="http://developer.android.com/reference/android/os/Bundle.html" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Bundle<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> populated by this method will be passed to both).<br />
This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state. For example, if activity B is launched in front of activity A, and at some point activity A is killed to reclaim resources, activity A will have a chance to save the current state of its user interface via this method so that when the user returns to activity A, the state of the user interface can be restored via <code><a href="http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onCreate(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> or <code><a href="http://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onRestoreInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>.<br />
Do not confuse this method with activity lifecycle callbacks such as <code><a href="http://developer.android.com/reference/android/app/Activity.html#onPause%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onPause()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>, which is always called when an activity is being placed in the background or on its way to destruction, or <code><a href="http://developer.android.com/reference/android/app/Activity.html#onStop%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onStop()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> which is called before destruction. One example of when <code><a href="http://developer.android.com/reference/android/app/Activity.html#onPause%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onPause()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> and <code><a href="http://developer.android.com/reference/android/app/Activity.html#onStop%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onStop()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> is called and not this method is when a user navigates back from activity B to activity A: there is no need to call <code><a href="http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onSaveInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> on B because that particular instance will never be restored, so the system avoids calling it. An example when <code><a href="http://developer.android.com/reference/android/app/Activity.html#onPause%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onPause()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> is called and not <code><a href="http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onSaveInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> is when activity B is launched in front of activity A: the system may avoid calling <code><a href="http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onSaveInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> on activity A if it isn&#8217;t killed during the lifetime of B since the state of the user interface of A will stay intact.<br />
The default implementation takes care of most of the UI per-instance state for you by calling <code><a href="http://developer.android.com/reference/android/view/View.html#onSaveInstanceState%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onSaveInstanceState()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> on each view in the hierarchy that has an id, and by saving the id of the currently focused view (all of which is restored by the default implementation of <code><a href="http://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onRestoreInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>). If you override this method to save additional information not captured by each individual view, you will likely want to call through to the default implementation, otherwise be prepared to save all of the state of each view yourself.<br />
If called, this method will occur before <code><a href="http://developer.android.com/reference/android/app/Activity.html#onStop%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onStop()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>. There are no guarantees about whether it will occur before or after <code><a href="http://developer.android.com/reference/android/app/Activity.html#onPause%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onPause()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>.</p>
<h4>protected void onRestoreInstanceState (<a href="http://developer.android.com/reference/android/os/Bundle.html" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Bundle<span class="wpel-icon wpel-image wpel-icon-6"></span></a> savedInstanceState)</h4>
<div>
<div>Since: <a href="http://developer.android.com/guide/appendix/api-levels.html#level1" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">API Level 1<span class="wpel-icon wpel-image wpel-icon-6"></span></a></div>
</div>
<div>
This method is called after <code><a href="http://developer.android.com/reference/android/app/Activity.html#onStart%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onStart()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> when the activity is being re-initialized from a previously saved state, given here in <var>savedInstanceState</var>. Most implementations will simply use <code><a href="http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onCreate(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen by <code><a href="http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onSaveInstanceState(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>.<br />
This method is called between <code><a href="http://developer.android.com/reference/android/app/Activity.html#onStart%28%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onStart()<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code> and <code><a href="http://developer.android.com/reference/android/app/Activity.html#onPostCreate%28android.os.Bundle%29" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">onPostCreate(Bundle)<span class="wpel-icon wpel-image wpel-icon-6"></span></a></code>.</div>
</div>
</blockquote>
<p>看得懂的就看，看不懂的google一下，對岸有很多網站對於這兩個function都有翻譯。小蛙這邊直接講照照明星臉相機及相簿無法使用的原因。<br />
點選從使用相機拍照及從相簿選擇的同時，小蛙先建了一個tmpFile，在丟入相機的參數中增加imageUri = Uri.fromFile(tmpFile);，正常情況下若從相簿挑選照片回來，小蛙會把得到的相片轉存到tmpFile(如此是為了避免修改或刪除原始照片)；假設從相機回來，可以從剛剛設定的imageUri中取得圖片，但偏偏這兩個回來的東西在一台Arc S上面正常，在另一台Arc S上面卻回傳java.lang.NullPointerException。<br />
Override了onSaveInstanceState及onRestoreInstanceState這兩個function印出Log訊息發現，兩台都會呼叫onSaveInstanceState，但是只有其中一台會呼叫onRestoreInstanceState，而這台恰巧就是會發生錯誤的那台。小蛙猜測當使用Intent開啟內建相機時(MediaStore.ACTION_IMAGE_CAPTURE)，<span style="color: #ff0000;"><strong>由於手機內部的記憶體不夠使用，造成照照明星臉主程式必須先暫時關閉，當照相動作完成後才會再回到照照明星臉，這時候照照明星臉之前建立的變數，</strong></span>例如：tmpFile, imageUri。<span style="color: #ff0000;"><strong>就會變成null</strong><span style="color: #000000;">，</span></span>解決的方法只要在Override onSaveInstanceState並且在該function中加入要保存的變數及其值，當主控權又回到照照明星臉時再呼叫onRestoreInstanceState把剛剛存起來的值還原，就可以避免掉onActivityResult()中有時候會出現java.lang.NullPointerException，有時候卻又可以正常使用的問題了！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/1892/onsaveinstancestate-onrestoreinstancestate%e4%bd%bf%e7%94%a8/" data-wpel-link="internal">onSaveInstanceState, onRestoreInstanceState使用</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/1892/onsaveinstancestate-onrestoreinstancestate%e4%bd%bf%e7%94%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
