安卓面試易考題(二)

這是延續上一部分的知識,依然是面試題,進入正題:android

 

面試題一:談談你對Activity的理解:面試

這是考官但願你把本身的心得,作項目的時候的體會寫出來;咱們能夠答Activity異常被系統回收的時候怎麼處理的,而後能夠講講Activity的生命週期。json

 

面試題二:Service是否運行在主線程?可否在Service裏面執行耗時的操做?app

       答:service是默認運行在主線程的,不少人以爲是後臺服務就以爲應該是在子線程,其實不是,因此咱們不能在裏面執行耗時的操做,由於會產生ANR異常。咱們要作耗時的操做要新開一個線程,處理耗時操做。異步

       固然咱們也能夠指定service在指定線程中執行,通常咱們在配置清單文件的時候指定所在的線程:this

Java代碼  
  1. <service  android:process="cn.itcast.xxx"></service>  

 

 

面試題三:兩個Activity之間怎麼傳遞數據?操作系統

答:若是是基本的數據類型,咱們能夠經過Intent 傳遞數據,也能夠經過intent putExtra傳遞一個bundle過來,其餘的intent想要獲取數據,能夠經過:線程

Java代碼  
  1. Intent intent = getIntent();  
  2.     Bundle bundle = intent.getExtras();  

 

Bundle 相似map的集合對象

Java代碼  
  1. intent.getStringExtra("key","value");  
  2. intent.getBooleanExtra("key","value")  

 

可是若是是複雜類型的話,咱們能夠在Application 全局裏面存放 對象 ,本身去實現本身的application的這個類,基礎系統的application ,每一個activity均可以取到 ,固然記得 清單文件裏面配置一下。接口

實現複雜類型的傳遞還能夠經過讓一個對象實現Serializable接口,實現了在各個接口後就能夠序列化到文件,具體實現過程是實例化一個FileOutputStream和一個ObjectOutputStream,而後經過對象輸出流向文件寫數據。咱們在另一個Activity經過對象 讀取這個對象數據,這樣就能實現了:

Java代碼  
  1. File file = new File("c:\\1.obj");  
  2.        FileOutputStream fos  = new FileOutputStream(file);  
  3.        ObjectOutputStream oos = new ObjectOutputStream(fos);  
  4.         
  5.        Student stu = new Student();  
  6.        stu.setId("10001");  
  7.        stu.setName("zs");  
  8.        oos.writeObject(stu);  
  9.         
  10.         
  11.        FileInputStream fis = new FileInputStream(file);  
  12.        ObjectInputStream ois = new ObjectInputStream(fis);  
  13.         Student stu1 = (Student) ois.readObject();  
  14.        System.out.println(stu1.getName());  

 

 

以上經過Serializable把對象序列化到文件而後讀取效率不高,入門若是是序列化到內存效率就高了,Google因而提供了parcelable接口,Parcelable 把對象序列化到android操做系統 的一塊公用的內存空間。

其實傳遞對象咱們還能夠用Gson,相似於json把對象按照必定格式打包成字符串,而後經過intent傳遞基本數據類型同樣再反序列化拿到數據:

Java代碼  
  1. Gson gson = new Gson();  
  2. List<Person> persons = new ArrayList<Person>();  
  3. for (int i = 0; i < 10; i++) {  
  4.      Person p = new Person();  
  5.      p.setName("name" + i);  
  6.      p.setAge(i * 5);  
  7.      persons.add(p);  
  8. }  
  9. String str = gson.toJson(persons);  

 

而後咱們拿到這個str字符串,取單個對象:

Java代碼  
  1. Person person = gson.fromJson(str, Person.class);  

 

取對象集合:

Java代碼  
  1. List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());  
  2.   
  3. for(int i = 0; i < ps.size() ; i++)  
  4.   
  5. {  
  6.   
  7. Person p = ps.get(i);  
  8.   
  9. System.out.println(p.toString());  
  10.   
  11. }  

 

可是若是咱們要傳遞一個大文件的時候就不能用上面的方法了,由於效率過低,咱們就會傳遞一個引用過去,經過uri:

Java代碼  
  1. //傳遞數據的引用  
  2. intent.setData(Uri)  
  3. Uri.fromFile();  //大圖片的傳遞  
  4. contentResolver.getInputStream(uri);-----存數據  
  5. contentResolver.getOutputStream(uri);----取數據  

 

 

面試題四:怎麼在啓動一個Activity的時候啓動一個service?

咱們在OnCreate方法裏面new Intent(要啓動的service);而後startService(intent);。

 

面試題五:同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?

    這是能夠的,咱們能夠在激活一個新的activity時候, 給intent設置flag:

    Intent的flag添加FLAG_ACTIVITY_NEW_TASK singleinstance  單獨的任務棧

,而後這個新開的Activity棧就會在單獨的task棧裏面。

    

Java代碼  
  1. Intent intent = new Intent(A.this,B.class);  
  2.     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  3.     startActivity(intent);  

 

當咱們在開啓的時候就已經設置了開啓新的任務棧,拿咱們在Activity的onCreate方法裏面,即便還寫了開啓一個新任務棧,也不會重複開啓。

 

面試題五:Activity怎麼和Service綁定,怎麼在activity中啓動本身對應的service?

咱們在Service的不一樣方法裏面寫服務,效果不同的。

StartService()裏面的話,一旦被建立  調用着無關   無法使用service裏面的方法。

bindService () 把service 與調用者綁定 ,若是調用者被銷燬, service會銷燬。同時咱們也可使用裏面的方法,經過複寫裏面的bandService啓動服務:咱們須要寫一個本身的ServiceConnection對象MyConn,(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:

Java代碼  
  1. private class Myconn implements ServiceConnection  
  2.    
  3.     {  
  4.    
  5.         public void onServiceConnected(ComponentName name, IBinder service) {  
  6.             // TODO Auto-generated method stub  
  7.             //能夠經過IBinder的對象 去使用service裏面的方法  
  8.         }  
  9.    
  10.         public void onServiceDisconnected(ComponentName name) {  
  11.             // TODO Auto-generated method stub  
  12.              
  13.         }  
  14.          
  15.     }  

 

 

面試題六:什麼是service,service的生命週期?怎麼啓動一個service,這些方法有啥區別,怎麼停用service?

在Service的生命週期中,由於沒有界面,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,方法,由於是服務,因此有onBind和onUnbind方法。

一般有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的。

1.經過startService

前面講過,StartService,沒有和調用者綁定在一塊兒,Service會經歷 onCreate 到onStart,而後處於運行狀態,stopService的時候調用onDestroy方法。

若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。

2.經過bindService

這種方法是和調用者綁定在一塊兒的,Service會運行onCreate,而後是調用onBind,調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。所謂綁定在一塊兒就共存亡了。調用者也能夠經過調用unbindService方法來中止服務,這時候Srevice就會調用onUnbind->onDestroyed方法。

可是幾個方法交織在一塊兒的話,會出現什麼狀況呢?

一個原則是Service的onCreate的方法只會被調用一次,就是你不管多少次的startService又bindService,Service只被建立一次。

若是先是bind了,那麼start的時候就直接運行Service的onStart方法,若是先是start,那麼bind的時候就直接運行onBind方法。

若是service運行期間調用了bindService,這時候再調用stopService的話,service是不會調用onDestroy方法的,service就stop不掉了,只能調用UnbindService, service就會被銷燬

若是一個service經過startService 被start以後,屢次調用startService 的話,service會屢次調用onStart方法。屢次調用stopService的話,service只會調用一次onDestroyed方法。

若是一個service經過bindService被start以後,屢次調用bindService的話,service只會調用一次onBind方法。

屢次調用unbindService的話會拋出異常。

 

面試題七:不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?

這個問題問得不太好,其實默認不作任何處理,B裏面的音樂都能播放.

遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解()

A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.

 

面試題八:什麼是IntentService?有何優勢?

簡單來說相對於通常service他本身開了一個thread,咱們在OnHandleIntent()裏面處理耗時的操做。它是Sdk給咱們提供的方便的,帶有異步處理的service類,異步處理的方法    OnHandleIntent()。每次執行OnHandleIntent方法,都回開啓一個不一樣的線程。

 

面試題九:何時使用Service?

    前臺進程優先級最高,最難被殺死,service只比前臺進程優先級第一點,用service能讓咱們在後臺運行的進程不容易掛掉。

1. 若是service正在調用onCreate,  onStartCommand或者onDestory方法,那麼用於當前service的進程至關於前臺進程以免被killed。

2. 若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.

3.若是一個前臺進程同時又綁定到了service上,那這個進程優先級最高。能夠理解爲,service是可見的。

4. 若是service可使用startForeground(true)方法來將service設置爲前臺狀態,至關於強行提升了這個service的優先級,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。

那service用在哪裏呢?

 1.Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做. 天氣預報 widget TimerTask Timer 按期執行timertask。

2.Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做.  Broadcast receiver生命週期 和 響應時間很短,只有10秒,沒執行完的話就沒有執行了。

 

  1. 遠程的service若是被啓動起來,能夠被屢次bind, 但不會從新create.  索愛手機X10i的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用.
相關文章
相關標籤/搜索