Android開發(fā)之面試必備

經(jīng)典中的經(jīng)典四大組件

1 Activity
2 Service
3 BroadCastRevceiver
4 ContentProviders

Activity必須要了解的知識點(diǎn)

Activity的生命周期?


Paste_Image.png
當(dāng)我們啟動一個Activity執(zhí)行流程

onCreate->onStart->onResume

Activity退居后臺:當(dāng)我們點(diǎn)擊返回后執(zhí)行流程

onPause->onStop->onDestory

Activity退居后臺:當(dāng)我們點(diǎn)擊Home后執(zhí)行流程或者跳轉(zhuǎn)新的Activity

onPaused->onStop

Activity返回前臺:當(dāng)我們點(diǎn)擊Home后再次進(jìn)入Activity

onRestart->onStart->onResume

鎖屏:onPause->Stop
解鎖 :onReStart->onStart->onResume
理解清楚整個生命周期中只有三個狀態(tài)是穩(wěn)定的,其他都是屬于過渡狀態(tài)很重要。

Resume:此時Activity處于運(yùn)行狀態(tài)位于棧頂,能和用戶交互的狀態(tài);
Paused:此時Activity處理半遮擋狀態(tài),這個狀態(tài)不能接受用戶輸入;
Stopped:完全被覆蓋,也就是此Activity已經(jīng)不可見了。

Activity中緩存方法以及數(shù)據(jù)恢復(fù)機(jī)制

在Activity中提供了兩個很重要的方法

  • onSaveInstanceState()
  • onRestoreInstanceState()
當(dāng)Activity在未經(jīng)你的許可,也就不是你人為銷毀此Activity的情況下都會執(zhí)行onSvaInstanceState方法來保存你的數(shù)據(jù),舉例說明幾種情況會執(zhí)行onSaveInstanceState

1 當(dāng)用戶按下Home鍵;
并且onSaveInstanceState中能保證在onStop之前執(zhí)行,可能會在onPause之前也可能在后面。
2 長按Home鍵選擇其他程序;
3 按下電源鍵關(guān)閉屏幕顯示時;
4 從Activity中啟動一個新的Activity
5 當(dāng)屏幕方向切換時,如果沒有指定ConfigChange屬性
onSaveInstanceState方法的一般都是 記錄Activity和UI的瞬間狀態(tài),不應(yīng)該用這個方法不做持久化操作。

onRestoreInstanceState方法的恢復(fù)數(shù)據(jù)狀態(tài)

1 需要注意的是onSaveInstanceState
onRestoreInstanceState不一定是成雙的;
2 onRestoreInstanceState執(zhí)行條件是在此Activity的確被銷毀了;
3 onSaveInstanceState中的Bundle也會傳遞到onCreate中,所以也可以選擇在onCreate中恢復(fù)數(shù)據(jù);

 protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("anAnt","Android");
 }
Activity的四中啟動模式

使用android:launchMode="standard|singleInstance|singleTask|singleTop"來控制Acivity任務(wù)棧。

  • standard為默認(rèn)啟動模式,如果不指定其他模式則都會使用此模式啟動,每次都會創(chuàng)建一個新的Activcity,并且將其置于任務(wù)棧的棧頂,而不管這個Activity是否創(chuàng)建,并且執(zhí)行三回調(diào)(onCreate->onStart->onResume)
  • singleTop為棧頂復(fù)用模式,系統(tǒng)判斷你要啟動的Activity是否位于棧頂,如果位于棧頂則直接使用,所以他的啟動三回調(diào)不會執(zhí)行,但是Activity的onNewIntent的方法會執(zhí)行,如果Activity已存在不位于棧頂則和Standard模式一樣。
  • singleTask為棧內(nèi)復(fù)用模式,singleTop判斷頂棧元素是否是啟動的Activity,而singleTask則判斷棧內(nèi)是否存在Activity,如果存在則至于棧頂,并且執(zhí)行onNewIntent方法,以及會清理在當(dāng)前Activity上面的所有Activity;
  • singleInstance:為加強(qiáng)版的singleTask模式,這種模式類似使用瀏覽器,在多個程序中訪問瀏覽器時,如果當(dāng)前瀏覽器沒有打開則先打開瀏覽器,否則直接在瀏覽器中訪問,Activcity只能單獨(dú)位于任務(wù)棧內(nèi),由于棧內(nèi)復(fù)用的特性,所以后續(xù)的請求都不會創(chuàng)建新的Activity,除非這個獨(dú)特的任務(wù)棧被系統(tǒng)銷毀。

Service必須了解的知識點(diǎn)

 public void startService(){
        //啟動一個Service
        Intent intent=new Intent(this,Service.class);
        startService(intent);
  }
  public void startService(){
        Intent intent=new Intent(this, Service.class);
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {}
            @Override
            public void onServiceDisconnected(ComponentName name) {}
        },BIND_AUTO_CREATE);
    }

上面是Service的兩種啟動方式

Activity相比,service的生命周期已經(jīng)簡單的不能再簡單了

只有onCreate()->onStart()->onDestroy()三個方法。
Activity中和service有關(guān)的方法:

  • startService(Intent intent):啟動一個service
  • stopService(Intent intent) :停止一個service

如果我們想使用service中的一些數(shù)據(jù)或者訪問其中的一些方法,那么我們就要通過下面的方法:

  • public boolean bindService(Intent intent, ServiceConnection conn, int flags) ;
  • public void unbindService(ServiceConnection conn);

上面startService()和bindService()兩種模式是完全獨(dú)立的。你可以綁定一個已經(jīng)通過startService()方法啟動的服務(wù)
只要調(diào)用一次stopService()方法便可以停止服務(wù),無論之前它被調(diào)用了多少次的啟動服務(wù)方法

注意:Service的onCreate的方法只會被調(diào)用一次,就是你無論多少次的startService又 bindService,Service只被創(chuàng)建一次。如果先是bind了,那么start的時候就直接運(yùn)行Service的onStart方法,如果先是start,那么bind的時候就直接運(yùn)行onBind方法。如果你先bind上了,就stop不掉了,只能先UnbindService, 再StopService,所以是先start還是先bind行為是有區(qū)別的。

IntentService的使用

因?yàn)镾ervice默認(rèn)都是在主線程中使用,所以如果在服務(wù)里處理一些耗時操作很容易出現(xiàn)ARN的情況
這個時候就可以用到IntentService,而且當(dāng)IntentService執(zhí)行完畢后會自動停止。

Service怎么避免被殺毒軟件殺掉和系統(tǒng)回收

1 Service設(shè)置為START_STICKY,Kill后會被重啟,重傳Intent,保證和重啟前一樣。
2 提升Service的優(yōu)先級,在AndroidManifaster.xml中android:priority="1000"。
3 當(dāng)Service銷毀時發(fā)送個廣播來重啟Service
4 雙進(jìn)程守護(hù)
5 開啟一個一像素的Activity在前臺。
6 android的系統(tǒng)進(jìn)程分為五個等級, Foreground Process(前臺進(jìn)程), Visible Process(可見進(jìn)程), Service Process(服務(wù)進(jìn)程), Background Process(后臺進(jìn)程), Empty Process(空進(jìn)程), Service的進(jìn)程處于第三個位置. 系統(tǒng)的回收會從低到高依次回收, 所以我們必須提高Service的等級;
仔細(xì)看Service的API會發(fā)現(xiàn)這么個方法 參考鏈接

  • public final void startForeground (int id, Notification notification)
public class MyService extends Service {
    private void startForegroundCompat() {
        try {
            if (Build.VERSION.SDK_INT < 18) {
                Log.e(TAG, "startForgroundCompat");
                startForeground(1120, new Notification());
            }
        } catch (Exception e) {
        }
    }

如果這樣做之后, 你會發(fā)現(xiàn)一鍵清理對你的Service是完全不起作用的。

BroadcastReceive廣播接收器

標(biāo)準(zhǔn)廣播:是一個完全異步的廣播,在廣播發(fā)出后,所有的廣播接收器機(jī)會都會在同一時刻收到這條廣播消息,因此他們之間沒有任何先后順序而言。
有序廣播:是一個同步執(zhí)行廣播,在 廣播發(fā)出后,同一時刻只會有一個接收器接收到此廣播,并且當(dāng)廣播接收器接收執(zhí)行完畢后,廣播才會繼續(xù)傳播,所以 他們是有先后順序的,優(yōu)先級越高則先收到廣播,并且這樣的廣播接受者可以截斷正在傳播的 廣播,這樣后面的廣播接受者就無法接收到廣播了。
發(fā)送標(biāo)準(zhǔn)廣播和有序廣播只要改動一行代碼 sendBroadcast()改成sendOrderBroadCast()

廣播的使用
  • 動態(tài)注冊廣播
    registerReceiver(mBroadcastReceive,null);
    unregisterReceiver(mBroadcastReceive);
  • 靜態(tài)注冊廣播

1 Service的兩種啟動方法,有什么區(qū)別 1.在Context中通過public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來進(jìn)行Service與Context的關(guān)聯(lián)并啟動,并且Service的生命周期依附于Context(不求同時同分同秒生!但求同時同分同秒屎??!)。
2 通過public ComponentName startService(Intent service)方法去啟動一個Service,此時Service的生命周期與啟動它的Context無關(guān)。
在AndroidManifaster中注冊廣播

本地廣播

前面得廣播數(shù)據(jù)系統(tǒng)全局廣播,如果你發(fā)的 廣播只想本程序收到那么久可以使用本地廣播
開啟本地廣播只需要得到本地廣播管理器來發(fā)送和注冊廣播就可以LocalBoradCastManager

  • mLocalBroadcastManager.registerReceiver(mBroadcastReceive,null);
  • mLocalBroadcastManager.unregisterReceiver(mBroadcastReceive);

contentProvider內(nèi)容提供者,跨程序數(shù)據(jù)共享 。

一個程序通過ContentProvider抽象接口將自己的數(shù)據(jù)提供了外部訪問的接口,而且是以類似數(shù)據(jù)庫中表的方式暴露出去。ContentProviders存儲與檢索數(shù)據(jù),任何其他應(yīng)用程序都可以對這部分?jǐn)?shù)據(jù)進(jìn)行訪問。
1 創(chuàng)建自己的ContentProvider繼承ContentProvider
2 在AndroidManifaster中注冊自己 的ContenetProviders
3 通過設(shè)置 URL讓CotentPorvider內(nèi)部做類似數(shù)據(jù)庫的響應(yīng)操作
最后我們就可以更具此URL來實(shí)現(xiàn)數(shù)據(jù)的訪問操作

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,380評論 0 20
  • 1.什么是Activity?問的不太多,說點(diǎn)有深度的 四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activit...
    JoonyLee閱讀 5,858評論 2 51
  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,873評論 2 21
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    左神話閱讀 5,156評論 7 59
  • 感賞自己今天聽了紫雨老師和錦明老師的語音課,明白了自己目前的問題癥結(jié)所有在:剛?cè)肴簳r,有熱情,有信心,一個多月過去...
    小瓶蓋Q日記閱讀 115評論 1 3

友情鏈接更多精彩內(nèi)容