<?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>event &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/event/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>event &#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>
	</channel>
</rss>
