葵花寶典之Android程序員面試題精選
以下內容有兆隆IT雲學院就業部提供:
什麼是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來開啟