葵花寶典之Android程序員面試題精選

以下內容有兆隆IT雲學院就業部提供:

  1. 什麼是Activity?

四大組件之一,一般的,一個用戶交互界面對應一個activity

setContentView() ,// 要顯示的布局

, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.

button.setOnclickLinstener{

}

我開發常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…

如果界面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.

進度對話框的顯示與銷毀 doubanservice

Advertisements

2. 請描述一下Activity 生命周期。

生命周期描述的是一個類 從創建(new出來)到死亡(垃圾回收)的過程中會執行的方法..

在這個過程中 會針對不同的生命階段會調用不同的方法

Activity從創建到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:oncreate ondestroy onstop onstart onresume onpause

其實這些方法都是兩兩對應的,onCreate創建與onDestroy銷毀;

onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;

對話框的彈出, Activity.this

對話框是activity的一部分.

Advertisements

這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在什麼時候調用呢?

答案就是:在Activity被onStop后,但是沒有被onDestroy,在再次啟動此Activity時就調用onRestart(而不再調用onCreate)方法;

如果被onDestroy了,則是調用onCreate方法。

最後講自己項目中的經驗,比如說豆瓣客戶端每次進入某個界面的時候都要看到最新的數據,這個刷新列表的操作 就放在onStart()的方法裡面.

fillData() 這樣保證每次用戶看到的數據都是最新的.

多媒體播放, 播放來電話. onStop() 視頻, 視頻聲音設置為0 , 記錄視頻播放的位置 mediaplayer.pause();

onStart() 根據保存的狀態恢復現場. mediaplayer.start();

在讀文檔的時候 還發現 activity還有兩個方法 onPostResume() 和 OnPostCreate()這兩個生命周期的方法,不過開發的時候沒有用到過.

3. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。

一般情況比如說有兩個activity,分別叫A,B ,當在A裡面激活B組件的時候, A 會調用 onPause()方法,然後B 調用onCreate() ,onStart(), OnResume() ,

這個時候B覆蓋了窗體, A會調用onStop()方法. 如果B呢 是個透明的,或者是對話框的樣式, 就不會調用onStop()方法

4. 橫豎屏切換時候Activity的生命周期。

這個生命周期跟清單文件里的配置有關係

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期

默認首先銷毀當前activity,然後重新載入

Onpause onstop ondestory oncreate onstart onresume

2、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

遊戲開發中, 屏幕的朝向都是寫死的.

5. 如何將一個Activity設置成窗口的樣式。

可以自定義一個activity的樣式,詳細見手機衛士的程序詳細信息

android:theme="@style/FloatActivity"

E:\day9\mobilesafe\res\values\style

6. 你後台的Activity被系統 回收怎麼辦?如果後台的Activity由於某原因被系統回收可了,如何在被系統回收之前保存當前狀態?

除了在棧頂的activity,其他的activity都有可能在內存不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.

protected void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putLong("id", 1234567890);

}

public void onCreate(Bundle savedInstanceState) {

//判斷 savedInstanceState是不是空.

//如果不為空就取出來

super.onCreate(savedInstanceState);

}

7. 如何退出Activity?如何安全退出已調用多個Activity的Application?

退出activity 直接調用 finish () 方法 . //用戶點擊back鍵 就是退出一個activity

退出activity 會執行 onDestroy()方法 .

1、拋異常強制退出:

該方法通過拋異常,使程序Force Close。

驗證可以,但是,需要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。

//安全結束進程 android.os.Process.killProcess(android.os.Process.myPid());

2、記錄打開的Activity:

每打開一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。

List<Activity> lists ; 在application 全集的環境裡面

lists = new ArrayList<Activity>();

每一個activity在執行oncreate()方法的時候 lists.add(this);

Ondestory() lists.remove(this);

lists.add(activity);

for(Activity activity: lists)

{

activity.finish();

}

3、發送特定廣播:

在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播后,關閉即可。

//給某個activity 註冊接受接受廣播的意圖

registerReceiver(receiver, filter)

//如果過接受到的是 關閉activity的廣播 就調用finish()方法 把當前的activity finish()掉

4、遞歸退出

在打開新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞歸關閉。

404 退出程序

OnActivityResult();

講一講你對activity的理解

把上面的幾點用自己的心得寫出來

8. service是否在main thread中執行, service裡面是否能執行耗時的操作?

默認情況,如果沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裡面

service裡面不能執行耗時的操作(網路請求,拷貝資料庫,大文件 )

在子線程中執行 new Thread(){}.start();

特殊情況 ,可以在清單文件配置 service 執行所在的進程 ,

讓service在另外的進程中執行

<serviceandroid:process="cn.itcast.xxx"></service>

9. 兩個Activity之間怎麼傳遞數據?

基本數據類型可以通過. Intent 傳遞數據

extras.putDouble(key, value)

intent.putExtra(name, value)

// 通過intent putExtra 方法 基本數據類型 都傳遞

Bundle bundle = new Bundle();

bundle.putShort(key, value);

intent.putExtras(bundle);

intent.putExtras(bundle)

獲取到激活他的 getIntent();

Intent intent = getIntent();

Bundle bundle = intent.getExtras();

Bundle 類似map的集合

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

Application 全局裡面存放 對象 ,自己去實現自己的application的這個類,基礎系統的application , 每個activity都可以取到

讓對象實現 implements Serializable 介面把對象存放到文件上.

讓類實現Serializable 介面,然後可以通過 ObjectOutputStream //對象輸出流

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());

Parcelable 和 Serializable

Parcelable 把對象序列化到android操作系統 的一塊公用的內存空間

文件/網路

//傳遞數據的引用

intent.setData(Uri)

Uri.fromFile(); //大圖片的傳遞

contentResolver.getInputStream(uri);

10. 怎麼讓在啟動一個Activity是就啟動一個service?

在activity的onCreate()方法裡面 startService();

11. 同一個程序,但不同的Activity是否可以放在不同的Task任務棧中?

比方說在激活一個新的activity時候, 給intent設置flag

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

這個被激活的activity就會在新的task棧裡面…

Intent intent = new Intent(A.this,B.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

12. Activity怎麼和service綁定,怎麼在activity中啟動自己對應的service?

startService() 一旦被創建 調用著無關 沒法使用service裡面的方法

bindService () 把service 與調用者綁定 ,如果調用者被銷毀, service會銷毀

bindService() 我們可以使用service 裡面的方法

bindService(). 讓activity能夠訪問到 service裡面的方法

構建一個intent對象,

Intent service = new Intent(this,MyService.class);

通過bindService的方法去啟動一個服務,

bindService(intent, new MyConn(), BIND_AUTO_CREATE);

ServiceConnection 對象(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

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

}

}

13. 14 .什麼是Service以及描述下它的生命周期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?

在Service的生命周期中,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,

onBind和onUnbind。

通常有兩種方式啟動一個Service,他們對Service生命周期的影響是不一樣的。

1 通過startService

Service會經歷 onCreate 到onStart,然後處於運行狀態,stopService的時候調用onDestroy方法。

如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行。

2 通過bindService

Service會運行onCreate,然後是調用onBind, 這個時候調用者和Service綁定在一起。調用者退出了,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的話會拋出異常。

15. 不用service,B頁面為音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?

這個問題問的很山寨.默認不做任何處理,B裡面的音樂都能播放.

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

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

16. 什麼是IntentService?有何優點?

普通的service ,默認運行在ui main 主線程

Sdk給我們提供的方便的,帶有非同步處理的service類,

非同步處理的方法 OnHandleIntent()

OnHandleIntent() 處理耗時的操作

17. 什麼時候使用Service?

擁有service的進程具有較高的優先順序

官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啟動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先順序。

1. 如果service正在調用onCreate, onStartCommand或者onDestory方法,那麼用於當前service的進程相當於前台進程以避免被killed。

2. 如果當前service已經被啟動(start),擁有它的進程則比那些用戶可見的進程優先順序低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.

3. 如果客戶端已經連接到service (bindService),那麼擁有Service的進程則擁有最高的優先順序,可以認為service是可見的。

4. 如果service可以使用startForeground(true)方法來將service設置為前台狀態,那麼系統就認為是對用戶可見的,並不會在內存不足時killed。

如果有其他的應用組件作為Service,Activity等運行在相同的進程中,那麼將會增加該進程的重要性。

1.Service的特點可以讓他在後台一直運行,可以在service裡面創建線程去完成耗時的操作. 天氣預報 widget TimerTask Timer 定期執行timertask

2.Broadcast receiver捕獲到一個事件之後,可以起一個service來完成一個耗時的操作.

Broadcast receiver生命周期 和 響應時間很短

3.遠程的service如果被啟動起來,可以被多次bind, 但不會重新create. 索愛手機X10i的人臉識別的service可以被圖庫使用,可以被攝像機,照相機等程序使用.

18. 請描述一下Intent 和 Intent Filter。

Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內容,這好比一封 Email,其中不僅應該包含收件地址,還可以包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。

通過Intent 可以實現各種系統組件的調用與激活.

Intent filter: 可以理解為郵局或者是一個信箋的分揀系統…

這個分揀系統通過3個參數來識別

Action: 動作 Intent.ation_view

Data: 數據uri uri mime

Category : 而外的附加信息

Action 匹配

Action 是一個用戶定義的字元串,用於描述一個 Android 應用程序組件,一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時可以在其 <intent-filter >節點指定一個 Action 列表用於標示 Activity 所能接受的「動作」,例如:

<intent-filter >

<action android:name="android.intent.action.MAIN" />

<action android:name="cn.itcast.action" />

……

</intent-filter>

如果我們在啟動一個 Activity 時使用這樣的 Intent 對象:

Intent intent =new Intent();

intent.setAction("cn.itcast.action");

那麼所有的 Action 列表中包含了「cn.itcast」的 Activity 都將會匹配成功。

Android 預定義了一系列的 Action 分別表示特定的系統動作。這些 Action 通過常量的方式定義在 android.content. Intent中,以「ACTION_」開頭。我們可以在 Android 提供的文檔中找到它們的詳細說明。

URI 數據匹配

一個 Intent 可以通過 URI 攜帶外部數據給目標組件。在 <intent-filter >節點中,通過 <data/>節點匹配外部數據。

mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、埠、和路徑。如下:

<data android:mimeType="mimeType" android:scheme="scheme"

android:host="host" android:port="port" android:path="path"/>

電話的uri tel: 12345

http://www.baidu.com

自己定義的uri itcast://cn.itcast/person/10

如果在 Intent Filter 中指定了這些屬性,那麼只有所有的屬性都匹配成功時 URI 數據匹配才會成功。

Category 類別匹配

<intent-filter >節點中可以為組件定義一個 Category 類別列表,當 Intent 中包含這個列表的所有項目時 Category 類別匹配才會成功。

默認是DEFAULT

19. Intent傳遞數據時,可以傳遞哪些類型數據?

1.一般的基本數據類型 Intent .putextra() intent.getStringextra();

2. 數據的uri, intent.setData() intent.getData();

20. 說說Activity,Intent,Service是什麼關係 。

麥當勞和麥當娜的關係是什麼關係?

這種問題,就講下activity,講一下service,說一下 通過intent去激活組件,傳遞數據.

說自己項目中有這樣一個網路更新的功能,顯示界面就用的activity, 後台有個service每隔半小時都去訪問下伺服器獲取更新的數據…

開啟服務用的是intent來開啟

Advertisements

你可能會喜歡