引言
- 這份面試題系列文章旨在查漏補(bǔ)缺,通過(guò)常見(jiàn)的面試題發(fā)現(xiàn)自己在Android基礎(chǔ)知識(shí)上的遺漏和欠缺贷洲,驗(yàn)證所學(xué)是否扎實(shí)。
- 這是系列的第一章晋柱,后面我會(huì)根據(jù)安卓知識(shí)模塊分類并網(wǎng)羅分析各種常見(jiàn)面試題优构。
面試題:
-
Activity的生命周期
答:onCreate->onStart->onResume->Activity運(yùn)行->新的Activity運(yùn)行->onPause->onStop->onDestroy->Activity銷毀
-
Activity的啟動(dòng)方式
答:四種啟動(dòng)模式,standard, singleTask, singleTop, singleInstance雁竞。
standard:標(biāo)準(zhǔn)模式钦椭,在當(dāng)前的任務(wù)棧上創(chuàng)建新的Activity,不論之前有沒(méi)有創(chuàng)建過(guò)該Activity碑诉。注意:ApplicationContext無(wú)法啟動(dòng)standard模式的Activity彪腔。
singleTask:棧內(nèi)復(fù)用模式,分兩種情況进栽,第一種情況:如果有任務(wù)棧里已經(jīng)創(chuàng)建了該Acitiviy德挣,直接銷毀該Acitivity棧上面的所有Acitivity,無(wú)須新創(chuàng)建一個(gè)Activity快毛;第二種情況:如果沒(méi)有任務(wù)棧里已經(jīng)創(chuàng)建該Activity格嗅,創(chuàng)建一個(gè)新的任務(wù)棧并在新棧上創(chuàng)建新Activity。注意:該模式下復(fù)用Activity唠帝,系統(tǒng)會(huì)調(diào)用Activity的onNewIntent方法屯掖。
singleTop:棧頂復(fù)用模式,如果該Activity在任務(wù)棧棧頂襟衰,即當(dāng)前活動(dòng)的Acitivty就是要?jiǎng)?chuàng)建的Activity贴铜,那么不會(huì)創(chuàng)建新的Activity。注意:該模式下復(fù)用Activity,系統(tǒng)會(huì)調(diào)用Activity的onNewIntent方法绍坝。
singleInstance:?jiǎn)螌?shí)例模式徘意,加強(qiáng)版的singleTask,當(dāng)每次都直接創(chuàng)建一個(gè)新的任務(wù)棧陷嘴,再在該新棧上創(chuàng)建新Activity映砖。注意:singleInstance永遠(yuǎn)是單棧單Activity
-
onSaveInstanceState和onRestoreInstanceState調(diào)用的過(guò)程和時(shí)機(jī)
- 調(diào)用時(shí)機(jī):Activity的異常情況下(例如轉(zhuǎn)動(dòng)屏幕或者被系統(tǒng)回收)的情況下,會(huì)調(diào)用到onSaveInstanceState和onRestoreInstanceState灾挨。其他情況不會(huì)觸發(fā)這個(gè)過(guò)程邑退。但是按Home鍵或者啟動(dòng)新Activity仍然會(huì)單獨(dú)觸發(fā)onSaveInstanceState的調(diào)用。
-
調(diào)用過(guò)程:舊的Activity要被銷毀時(shí)劳澄,由于是異常情況下的地技,所以除了正常調(diào)用onPause, onStop, onDestroy方法外,還會(huì)在調(diào)用onStop方法前秒拔,調(diào)用onSaveInstanceState方法莫矗。新的Activity重建時(shí),我們就可以通過(guò)onRestoreInstanceState方法取出之前保存的數(shù)據(jù)并恢復(fù)砂缩,onRestoreInstanceState的調(diào)用時(shí)機(jī)在onCreate之后浑玛。
Activity的異常情況下的生命周期.png
-
Activity A調(diào)用Activity B時(shí),A調(diào)用什么函數(shù)犹菇?
- 舊的Activity的onPause方法執(zhí)行結(jié)束涯曲,才執(zhí)行新的Activity的onCreat, onState和onResume方法。
- onPause方法中不能有重量級(jí)的任務(wù)双吆,不然會(huì)影響新Activity的創(chuàng)建眨唬。
-
onNewIntent的作用和調(diào)用時(shí)機(jī)?
- 調(diào)用時(shí)機(jī):如果Activity的啟動(dòng)模式是:singleTop, singleTask, singleInstance好乐,在復(fù)用這些Acitivity時(shí)就會(huì)在調(diào)用onStart方法前調(diào)用onNewIntent方法
- 作用:讓已經(jīng)創(chuàng)建的Activity處理新的Intent匾竿。
-
fragment的生命周期
-
fagement和Activity的通信
有四種方法
- Fragment可以通過(guò)getActivity()訪問(wèn)Activity實(shí)力,并輕松地執(zhí)行在Activity布局中查找視圖等任務(wù)蔚万。
View listView = getActivity().findViewById(R.id.list);
- Activity可以通過(guò)FragmentManager的findFragmentById()或findFragmentByTag()岭妖,獲取對(duì)Fragment的引用。
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
- 創(chuàng)建對(duì)Activity的事件回調(diào)
- 在fragment中定義一個(gè)回調(diào)接口反璃,并要求宿主Activity實(shí)現(xiàn)它区转。當(dāng)Activity通過(guò)該接口受到回調(diào)時(shí),可以根據(jù)需要與布局中的其他片段共享這些信息版扩。
- 代碼示例:
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);
}
}
- 向操作欄添加項(xiàng)目
- 通過(guò)Fragment.setArguments向Fragment傳遞參數(shù)
public void setArguments(Bundle args)
final pubilc Bundle getArguments()
知識(shí)點(diǎn)
- Activity典型情況下的生命周期分析
- Activity異常情況下的生命周期分析
- Activity的啟動(dòng)模式
- Fragment的生命周期
- Activity和Fragment的通信方法
參考資料:
fagement官方文檔
《Android開(kāi)發(fā)藝術(shù)探究》
個(gè)人博客(https://yoxin.github.io/)