安卓面試易考題(二)

來源:互聯網
上載者:User

標籤:des   android   ar   io   os   使用   sp   for   java   

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

 

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

這是考官希望你把自己的心得,做項目的時候的體會寫出來;我們可以答Activity異常被系統回收的時候怎麼處理的,然後可以講講Activity的生命週期。

 

面試題二:Service是否運行在主線程?能否在Service裡面執行耗時的操作?

       答:service是預設運行在主線程的,很多人覺得是後台服務就覺得應該是在子線程,其實不是,所以我們不能在裡面執行耗時的操作,因為會產生ANR異常。我們要做耗時的操作要新開一個線程,處理耗時操作。

       當然我們也可以指定service在指定線程中執行,一般我們在配置資訊清單檔的時候指定所在的線程:

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傳遞基礎資料型別 (Elementary Data Type)一樣再還原序列化拿到資料:

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的Face Service的service可以被圖庫使用,可以被攝像機,照相機等程式使用.

安卓面試易考題(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.