1. 程式人生 > >Android的二三事

Android的二三事

1.什麼是 Activity?

a. 四大元件之一,是使用者互動的介面。一般的來說一個使用者互動介面對應一個activity。
b.activity 是 Context 的子類,同時實現了 window.callback 和 keyevent.callback, 可以處理與窗體使用者互動的事件.
c.常用的的有 FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty 等…

2.如何儲存 Activity 的狀態?

Activity 的狀態通常情況下系統會自動儲存的,只有當我們需要儲存額外的資料時才需要使用到這樣的功能。一般來說, 呼叫 onPause()和 onStop()方法後的 activity 例項仍然存在於記憶體中, activity 的所有資訊和狀態資料不會消失, 當 activity 重新回到前臺之後, 所有的改變都會得到保留。但是當系統記憶體不足時, 呼叫 onPause()和 onStop()方法後的 activity 可能會被系統摧毀, 此時記憶體中就不會存有該 activity 的例項物件了。如果之後這個 activity 重新回到前臺, 之前所作的改變就會消失 。為 了 避 免 此 種 情 況 的 發 生 , 我 們 可 以 覆 寫 onSaveInstanceState() 方 法 。onSaveInstanceState()方法接受一個 Bundle 型別的引數, 開發者可以將狀態資料儲存到這個Bundle物件中, 這樣即使activity被系統摧毀, 當用戶重新啟動這個activity而呼叫它的onCreate()方法時, 上述的 Bundle 物件會作為實參傳遞給 onCreate()方法, 開發者可以從 Bundle 物件中取出儲存的資料, 然後利用這些資料將 activity 恢復到被摧毀之前的狀態。需要注意的是, onSaveInstanceState()方法並不是一定會被呼叫的, 因為有些場景是不需要儲存狀態資料的. 比如使用者按下 BACK 鍵退出 activity 時, 使用者顯然想要關閉這個 activity, 此時是沒有必要儲存資料 以供下次恢復的, 也就是 onSaveInstanceState()方法不會被呼叫. 如果呼叫onSaveInstanceState()方法, 呼叫將發生在 onPause()或 onStop()方法之間。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
或者重寫onRestoreInstanceState()方法,從中取出儲存的狀態資料。

3.兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?

一般情況下比如說有兩個activity,分別叫A,B,當在A裡面啟用B元件的時候, A會呼叫 onPause()方法,然後 B 呼叫onCreate() ,onStart(), onResume()。這個時候 B 覆蓋了窗體, A 會呼叫 onStop()方法. 如果 B 是個透明的,或者是對話方塊的樣式, 就不會呼叫 A 的 onStop()方法。

4.橫豎屏切換時 Activity 的生命週期

此時的生命週期跟清單檔案裡的配置有關係。
a.不設定 Activity 的 android:configChanges 時,切屏會重新呼叫各個生命週期預設首先銷燬當前 activity,然後重新載入。
b.設定 Activity android:configChanges=”orientation|keyboardHidden|screenSize”時,切屏不會重新呼叫各個生命週期,只會執行 onConfigurationChanged 方法。通常在遊戲開發, 螢幕的朝向都是寫死的。

5.如何將一個 Activity 設定成視窗的樣式

Activity 配置如下屬性即可。
android:theme=”@android:style/Theme.Dialog”

6.如 何 退 出 Activity ? 如 何 安 全 退 出 已 調 用 多 個 Activity 的 Application?

a.通常情況使用者退出一個 Activity 只需按返回鍵,我們寫程式碼想退出 activity 直接呼叫 finish()方法就行。
b.記錄開啟的 Activity:每開啟一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
//虛擬碼List lists ;// 在 application 全域性的變數裡面
lists = new ArrayList();
lists.add(this);
for(Activity activity: lists){
activity.finish();
}
c.傳送特定廣播:
1、在需要結束應用時,傳送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
2、給某個 activity 註冊接受接受廣播的意圖registerReceiver(receiver, filter)
3、如果過接受到的是 關閉 activity 的廣播 就呼叫 finish()方法 把當前的 activity finish()掉
4、遞迴退出
在開啟新的 Activity 時使用 startActivityForResult,然後自己加標誌,在 onActivityResult 中處理,遞迴關閉。
5、其實 也可以通過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)啟用一個新的
activity。此時如果該任務棧中已經有該 Activity,那麼系統會把這個 Activity 上面的所有 Activity 幹掉。其實相當於
給Activity 配置的啟動模式為 SingleTop。

7.Activity 的四種啟動模式,singletop 和 singletask 區別是什麼?一般書籤的使用模式是 singletop,那為什麼不使用 singletask?

singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的物件是位於棧頂的 activity(應該可以理解為使用者眼前所 看到的 activity)時,程式將不會生成一個新的 activity 例項,而是直接跳到現存於棧頂的那個 activity 例項。拿上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉後棧裡面依舊只有一個例項,如果現在按返回鍵程式將直接退出。
singleTask 模式和 singleInstance 模式都是隻建立一個例項的。在這種模式下,無論跳轉的物件是不是位於棧頂的 activity,程式都不會生成一個新的例項(當然前提是棧裡面已經有這個例項)。
這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關係導致同個頁面生成多個例項,這個在使用者體驗上始終有點不好,而如果你將對應的 activity 宣告為 singleTask 模式,這種問題將不復存在。在主頁的 Activity 很常用。

8.Android 中的 Context, Activity,Appliction 有什麼區別?

相同:Activity 和 Application 都是 Context 的子類。Context 從字面上理解就是上下文的意思,在實際應用中它也確實
是起到了管理上下文環境中各個引數和變數的總用,方便我們可以簡單的訪問到各種資源。
不同:維護的生命週期不同。 Context 維護的是當前的 Activity 的生命週期,Application 維護的是整個專案的生命周
期。 使用 context 的時候,小心記憶體洩露,防止記憶體洩露,注意一下幾個方面:
a.對於生命週期長的物件,可以使用 application,context。
b.避免非靜態的內部類,儘量使用靜態類,避免生命週期問題,注意內部類對外部物件引用導致的生命周
期變化。
c.不要讓生命週期長的物件引用 activity context,即保證引用 activity 的物件要與 activity 本身生命週期是
一樣的。

9.兩個 Activity 之間傳遞資料,除了 intent,廣播接收者,contentprovider 還有啥?

a.利用 static 靜態資料,public static 成員變數
b.利用外部儲存的傳輸, 例如 File 檔案儲存 SharedPreferences 首選項
c.Sqlite 資料庫
d.EventBus的傳遞

10.Context 是什麼?

A.它描述的是一個應用程式環境的資訊,即上下文。
B.該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實現類(ContextIml)。
C.通過它我們可以獲取應用程式的資源和類,也包括一些應用級別操作,例如:啟動一個 Activity,傳送廣播,接受
Intent,資訊,等。
參考 http://blog.csdn.net/feiduclear_up/article/details/47356289