Android面試

Android四大組件android

  • Activity
  1. Activity之間經過Intent進行通訊。
  2. android應用中每個Activity都必需要在AndroidManifest.xml配置文件中聲明,不然系統將不識別也不執行該Activity。
  3. 四種啓動模式 standard(默認) singleTop singleTask singleInstance

standard模式下,每當啓動一個新的Activity,它就會進入任務棧,並處於棧頂的位置,對於使用standard模式的Activity,系統不會判斷該Activity在棧中是否存在,每次啓動都會建立一個新的實例app

singleTop模式與standard相似,不一樣的是,當啓動的Activity已經位於棧頂時,則直接使用它不建立新的實例。若是啓動的Activity沒有位於棧頂時,則建立一個新的實例位於棧頂ide

singleTask模式,每次啓動該Activity時,系統首先會檢查棧中是否存在該Activity的實例,若是發現已經存在則直接使用該實例,並將當前Activity之上的全部Activity出棧,若是沒有發現則建立一個新的實例。oop

singleInstance模式加載Activity時,不管從哪一個任務棧中啓動該Activity,只會建立一個Activity實例,而且會使用一個全新的任務棧來裝載該Activity實例。採用這種模式啓動Activity會費爲一下兩種狀況:post

第一種:若是要啓動的Activity不存在,系統會建立一個新的任務棧,在建立該Activity的實例,並把該Activity加入棧頂this

第二種::若是要啓動的Activity已經存在,不管位於哪一個應用程序或者哪一個任務棧中,系統都會把該Activity所在的任務棧轉到前臺,從而使該Activity顯示出來。spa

4.activity的生命週期 onCreate onStart onResume onPause onStop onDestroy線程

  • Service

1.啓動的兩種方式:code

startService(啓動):當應用程序組件(如activity)調用startService()方法啓動服務時,服務處於started狀態。xml

bindService(綁定):當應用程序組件調用bindService()方法綁定到服務時,服務處於bound狀態。

區別:started service(啓動服務)是由其餘組件調用startService()方法啓動的,這致使服務的onStartCommand() 方法 (該方法每次startSevice啓動都會調用一次)被調用。當服務是started狀態時,其生命週期與啓動它的組件無關,而且能夠在後臺無限期運行,即便啓動服務的組件已經被銷燬。所以,服務須要在完成任務後調用stopSelf()方法中止,或者由其餘組件調用stopService()方法中止。

(b)使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。

開發人員須要在應用程序配置文件中聲明所有的service,使用<service></service>標籤

  • Content Provider

其餘應用能夠經過ContentResolver類從該內容提供者中獲取或存入數據; Content Provider的啓動方式也是當ContentResolver對象在請求時纔會啓動。

開發人員不會直接使用ContentProvider類的對象,大多數是經過ContentResolver對象實現對ContentProvider的操做。

  • Broadcast Receiver

廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊

動態註冊廣播接收器特色是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔心廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器也是打開着的。也就是說哪怕app自己未啓動,該app訂閱的廣播在觸發時也會對它起做用。

內容提供者僅在響應ContentResolver提出請求的時候激活。而一個廣播接收器僅在響應廣播信息的時候激活。因此,沒有必要去顯式的關閉這些組件。Activity關閉:能夠經過調用它的finish()方法來關閉一個activity。服務關閉:對於經過startService()方法啓動的服務要調用Context.stopService()方法關閉服務,使用bindService()方法啓動的服務要調用Contex.unbindService()方法關閉服務。

Handler機制

Looper Message MessageQueue

在子線程中new 一個 Handler須要注意的地方: 子線程中必需要持有Looper對象,否則沒法建立

更便捷的方式是使用HandlerThread

thread= new Thread(){
            @Override
            public void run() {
                super.run();
                Looper.prepare();

                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.i(TAG, "handleMessage: "+msg.toString());
                    }

                    @Override
                    public void dispatchMessage(Message msg) {
                        super.dispatchMessage(msg);
                        Log.i(TAG, "dispatchMessage: "+msg.toString());
                    }
                };
                Looper.loop();
            }
        };
              thread.start();
        //Looper.
    }

HandlerThread的源碼:

@Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }

子線程中如何更新UI

1 Activity.runOnUiThread(Runnable)

2 View.post(Runnable)

3 View.postDelayed(Runnable,long)

4 Handler

5 AsyncTask

相關文章
相關標籤/搜索