標籤:des android ar io os 使用 sp for java
這是延續上一部分的知識,依然是面試題,進入正題:
面試題一:談談你對Activity的理解:
這是考官希望你把自己的心得,做項目的時候的體會寫出來;我們可以答Activity異常被系統回收的時候怎麼處理的,然後可以講講Activity的生命週期。
面試題二:Service是否運行在主線程?能否在Service裡面執行耗時的操作?
答:service是預設運行在主線程的,很多人覺得是後台服務就覺得應該是在子線程,其實不是,所以我們不能在裡面執行耗時的操作,因為會產生ANR異常。我們要做耗時的操作要新開一個線程,處理耗時操作。
當然我們也可以指定service在指定線程中執行,一般我們在配置資訊清單檔的時候指定所在的線程:
Java代碼
- <service android:process="cn.itcast.xxx"></service>
面試題三:兩個Activity之間怎麼傳遞資料?
答:如果是基本的資料類型,我們可以通過Intent 傳遞資料,也可以通過intent putExtra傳遞一個bundle過來,其他的intent想要擷取資料,可以通過:
Java代碼
- Intent intent = getIntent();
- Bundle bundle = intent.getExtras();
Bundle 類似map的集合
Java代碼
- intent.getStringExtra("key","value");
- intent.getBooleanExtra("key","value")
但是如果是複雜類型的話,我們可以在Application 全域裡面存放 對象 ,自己去實現自己的application的這個類,基礎系統的application ,每個activity都可以取到 ,當然記得 資訊清單檔裡面配置一下。
實現複雜類型的傳遞還可以通過讓一個對象實現Serializable介面,實現了在各個介面後就可以序列化到檔案,具體實現過程是執行個體化一個FileOutputStream和一個ObjectOutputStream,然後通過對象輸出資料流向檔案寫資料。我們在另外一個Activity通過對象 讀取這個對象資料,這樣就能實現了:
Java代碼
- File file = new File("c:\\1.obj");
- FileOutputStream fos = new FileOutputStream(file);
- ObjectOutputStream oos = new ObjectOutputStream(fos);
-
- Student stu = new Student();
- stu.setId("10001");
- stu.setName("zs");
- oos.writeObject(stu);
-
-
- FileInputStream fis = new FileInputStream(file);
- ObjectInputStream ois = new ObjectInputStream(fis);
- Student stu1 = (Student) ois.readObject();
- System.out.println(stu1.getName());
以上通過Serializable把對象序列化到檔案然後讀取效率不高,入門如果是序列化到記憶體效率就高了,Google於是提供了parcelable介面,Parcelable 把對象序列化到android作業系統 的一塊公用的記憶體空間。
其實傳遞對象我們還可以用Gson,類似於json把對象按照一定格式打包成字串,然後通過intent傳遞基礎資料型別 (Elementary Data Type)一樣再還原序列化拿到資料:
Java代碼
- Gson gson = new Gson();
- List<Person> persons = new ArrayList<Person>();
- for (int i = 0; i < 10; i++) {
- Person p = new Person();
- p.setName("name" + i);
- p.setAge(i * 5);
- persons.add(p);
- }
- String str = gson.toJson(persons);
然後我們拿到這個str字串,取單個對象:
Java代碼
- Person person = gson.fromJson(str, Person.class);
取對象集合:
Java代碼
- List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
-
- for(int i = 0; i < ps.size() ; i++)
-
- {
-
- Person p = ps.get(i);
-
- System.out.println(p.toString());
-
- }
但是如果我們要傳遞一個大檔案的時候就不能用上面的方法了,因為效率太低,我們就會傳遞一個引用過去,通過uri:
Java代碼
- //傳遞資料的引用
- intent.setData(Uri)
- Uri.fromFile(); //大圖片的傳遞
- contentResolver.getInputStream(uri);-----存資料
- 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代碼
- Intent intent = new Intent(A.this,B.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
當我們在開啟的時候就已經設定了開啟新的任務棧,拿我們在Activity的onCreate方法裡面,即使還寫了開啟一個新任務棧,也不會重複開啟。
面試題五:Activity怎麼和Service綁定,怎麼在activity中啟動自己對應的service?
我們在Service的不同方法裡面寫服務,效果不一樣的。
StartService()裡面的話,一旦被建立 調用著無關 沒法使用service裡面的方法。
bindService () 把service 與調用者綁定 ,如果調用者被銷毀, service會銷毀。同時我們也可以使用裡面的方法,通過複寫裡面的bandService啟動服務:我們需要寫一個自己的ServiceConnection對象MyConn,(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:
Java代碼
- private class Myconn implements ServiceConnection
-
- {
-
- public void onServiceConnected(ComponentName name, IBinder service) {
- // TODO Auto-generated method stub
- //可以通過IBinder的對象 去使用service裡面的方法
- }
-
- public void onServiceDisconnected(ComponentName name) {
- // TODO Auto-generated method stub
-
- }
-
- }
面試題六:什麼是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秒,沒執行完的話就沒有執行了。
- 遠端service如果被啟動起來,可以被多次bind, 但不會重新create. 索愛手機X10i的Face Service的service可以被圖庫使用,可以被攝像機,照相機等程式使用.
安卓面試易考題(二)