1. 程式人生 > >Android面試題(一)——Activity的生命週期和啟動模式

Android面試題(一)——Activity的生命週期和啟動模式

引言

  • 這份面試題系列文章旨在查漏補缺,通過常見的面試題發現自己在Android基礎知識上的遺漏和欠缺,驗證所學是否紮實。

  • 這是系列的第一章,後面我會根據安卓知識模組分類併網羅分析各種常見面試題。

面試題:

  1. Activity的生命週期

    答:onCreate->onStart->onResume->Activity執行->新的Activity執行->onPause->onStop->onDestroy->Activity銷燬
    Activity生命週期的切換過程.png

  2. 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

  3. onSaveInstanceState和onRestoreInstanceState呼叫的過程和時機

    • 呼叫時機:Activity的異常情況下(例如轉動螢幕或者被系統回收的情況下),會呼叫到onSaveInstanceState和onRestoreInstanceState。其他情況不會觸發這個過程。但是按Home鍵或者啟動新Activity仍然會單獨觸發onSaveInstanceState的呼叫。
    • 呼叫過程:舊的Activity要被銷燬時,由於是異常情況下的,所以除了正常呼叫onPause, onStop, onDestroy方法外,還會在呼叫onStop方法前,呼叫onSaveInstanceState方法。新的Activity重建時,我們就可以通過onRestoreInstanceState方法取出之前儲存的資料並恢復,onRestoreInstanceState的呼叫時機在onCreate之後
      Activity的異常情況下的生命週期.png
  4. Activity A呼叫Activity B時,A呼叫什麼函式?

    • 舊的Activity的onPause方法執行結束,才執行新的Activity的onCreat, onState和onResume方法。
    • onPause方法中不能有重量級的任務,不然會影響新Activity的建立。
  5. onNewIntent的作用和呼叫時機?

    • 呼叫時機:如果Activity的啟動模式是:singleTop, singleTask, singleInstance,在複用這些Acitivity時就會在呼叫onStart方法前呼叫onNewIntent方法
    • 作用:讓已經建立的Activity處理新的Intent。
  6. fragment的生命週期

    Fragment的生命週期.png

  7. 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()

知識點

  1. Activity典型情況下的生命週期分析
    • Activity異常情況下的生命週期分析
    • Activity的啟動模式
    • Fragment的生命週期
    • Activity和Fragment的通訊方法

參考資料: