Android面試題(一)——Activity的生命週期和啟動模式
引言
這份面試題系列文章旨在查漏補缺,通過常見的面試題發現自己在Android基礎知識上的遺漏和欠缺,驗證所學是否紮實。
這是系列的第一章,後面我會根據安卓知識模組分類併網羅分析各種常見面試題。
面試題:
Activity的生命週期
答:onCreate->onStart->onResume->Activity執行->新的Activity執行->onPause->onStop->onDestroy->Activity銷燬
Activity的啟動方式
答:四種啟動模式,standard, singleTask, singleTop, singleInstance。
standard:標準模式,在當前的任務棧上建立新的Activity,不論之前有沒有建立過該Activity。注意:ApplicationContext無法啟動standard模式的Activity。
singleTask:棧內複用模式,分兩種情況,第一種情況:如果有任務棧裡已經建立了該Acitiviy,直接銷燬該Acitivity棧上面的所有Acitivity,無須新建立一個Activity;第二種情況:如果沒有任務棧裡已經建立該Activity,建立一個新的任務棧並在新棧上建立新Activity。注意:該模式下複用Activity,系統會呼叫Activity的onNewIntent方法。
singleTop:棧頂複用模式,如果該Activity在任務棧棧頂,即當前活動的Acitivty就是要建立的Activity,那麼不會建立新的Activity。注意:該模式下複用Activity,系統會呼叫Activity的onNewIntent方法。
singleInstance:單例項模式,加強版的singleTask,當每次都直接建立一個新的任務棧,再在該新棧上建立新Activity。注意:singleInstance永遠是單棧單Activity
onSaveInstanceState和onRestoreInstanceState呼叫的過程和時機
- 呼叫時機:Activity的異常情況下(例如轉動螢幕或者被系統回收的情況下),會呼叫到onSaveInstanceState和onRestoreInstanceState。其他情況不會觸發這個過程。但是按Home鍵或者啟動新Activity仍然會單獨觸發onSaveInstanceState的呼叫。
- 呼叫過程:舊的Activity要被銷燬時,由於是異常情況下的,所以除了正常呼叫onPause, onStop, onDestroy方法外,還會在呼叫onStop方法前,呼叫onSaveInstanceState方法。新的Activity重建時,我們就可以通過onRestoreInstanceState方法取出之前儲存的資料並恢復,onRestoreInstanceState的呼叫時機在onCreate之後。
Activity A呼叫Activity B時,A呼叫什麼函式?
- 舊的Activity的onPause方法執行結束,才執行新的Activity的onCreat, onState和onResume方法。
- onPause方法中不能有重量級的任務,不然會影響新Activity的建立。
onNewIntent的作用和呼叫時機?
- 呼叫時機:如果Activity的啟動模式是:singleTop, singleTask, singleInstance,在複用這些Acitivity時就會在呼叫onStart方法前呼叫onNewIntent方法
- 作用:讓已經建立的Activity處理新的Intent。
fragment的生命週期
fagement和Activity的通訊
有五種方法
- Fragment可以通過getActivity()訪問Activity例項,並輕鬆地執行在Activity佈局中查詢檢視等任務。
View listView = getActivity().findViewById(R.id.list);
- Activity可以通過FragmentManager的findFragmentById()或findFragmentByTag(),獲取對Fragment的引用。
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
- 建立對Activity的事件回撥
- 在fragment中定義一個回撥介面,並要求宿主Activity實現它。當Activity通過該介面受到回撥時,可以根據需要與佈局中的其他片段共享這些資訊。
- 程式碼示例:
public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Append the clicked item's row ID with the content provider Uri
Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
// Send the event and Uri to the host activity
mListener.onArticleSelected(noteUri);
}
}
- 向操作欄新增專案
- 通過Fragment.setArguments向Fragment傳遞引數
public void setArguments(Bundle args)
final pubilc Bundle getArguments()
知識點
- Activity典型情況下的生命週期分析
- Activity異常情況下的生命週期分析
- Activity的啟動模式
- Fragment的生命週期
- Activity和Fragment的通訊方法