1. Intent的幾種有關Activity啓動的方式有哪些,你瞭解每一個含義嗎? java
這裏Android123提示你們,Intent的一些標記有FLAG_ACTIVITY_BROUGHT_TO_FRONT 將activity帶動最前面FLAG_ACTIVITY_CLEAR_TOP清除頂部FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET重要任務時清除android
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS排除最近的git
FLAG_ACTIVITY_MULTIPLE_TASK多任務器的面試
FLAG_ACTIVITY_NEW_TASK 新任務啓動。算法
每種含義你們看SDK文檔和具體跑下這樣你的記憶會更深入些。 數據庫
2. Activity和Task的啓動模式有哪些? 每種含義是什麼? api
有關在AndroidManifest.xml中的android:launchMode定義,主要有standard、singleTop、singleTask和singleInstance,同時對於android:taskAffinity這些問題你們也要了解,Android開發網在之前的文章中講過,不過不少開發者仍然不是很清楚,這些基礎問題咱們之後仍然會再次總結。 數組
關於Activity的啓動模式,參考: http://blog.csdn.net/feng88724/archive/2011/05/11/6412638.aspx瀏覽器
3. 經過Intent傳遞一些二進制數據的方法有哪些? 緩存
1). 使用Serializable接口實現序列化,這是Java經常使用的方法。
2). 實現Parcelable接口,這裏Android的部分類好比Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換數據也很常見的。
4. 能說下Android應用的入口點嗎?
在Sun的Java體系中入口點和標準c語言同樣是main(),而每一個Android程序都包含着一個Application實例,一個Application實例中有多個Activity、Service、ContentProvider或Broadcast Receiver。由於大部分的應用都包含Activity因此,說不少網友認爲是Activity的onCreate,可是你沒有發現你的工程中有多個Activity嗎? 你可能沒有見過沒有Activity的Android應用吧
其實在android.app.Application這個包的onCreate纔是真正的Android入口點,只不過大多數開發者無需重寫該類,他的繼承關係以下圖:
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Application
android.app.Application類包含了4個公開的方法
void onConfigurationChanged(Configuration newConfig)
void onCreate() //這裏纔是真正的入口點。
void onLowMemory()
void onTerminate()
因此但願你們,記住真正的Android入口點是application的main,你能夠看下androidmanifest.xml的包含關係就清楚了,並非每一個應用都必須有Activity的
5. Android都有哪些XML解析器,都熟練掌握嗎?
這裏XmlPull、SAX和DOM相信作過Web開發的都已經倒背如流了。
6. SQLite支持事務嗎? 添加刪除如何提升性能?
SQLite做爲輕量級的數據庫,比MySQL還小,但支持SQL語句查詢,提升性能能夠考慮經過原始通過優化的SQL查詢語句方式處理。
7. Android Service和Binder、AIDL你都熟練嗎?
做爲Android重要的後臺服務,這些每一個Android開發者都應該掌握,這也算是和Java SE最大的不一樣了,具體的實例你們能夠查看Android音樂播放器的源代碼Music.git中的,這裏再也不贅述。
http://my.oschina.net/u/226973/blog/42108
8. 你用過哪款Android手機,有哪些優勢和不足,相對於iPhone或Symbian又有哪些優缺點?
把這個做爲面試題也是考察下,能夠大概瞭解到它對Android的瞭解程度,多移動開發的認識。
1. 請描述下Activity的生命週期。
建立 oncreate - 啓動onstart – 恢復 onResume – 暫停 onPause – 結束 onEnd – 銷燬onDestroy
2. 若是後臺的Activity因爲某緣由被系統回收了,如何在被系統回收以前保存當前狀態?
在」暫停 onPause」 狀態將數據保存。
3. 如何將一個Activity設置成窗口的樣式。
設置Theme。
4. 如何退出Activity?如何安全退出已調用多個Activity的Application?
5. 請介紹下Android中經常使用的五種佈局。
線性佈局LinearLayout, 相對佈局 RelativeLayout
表單佈局 TableLayout,
絕對佈局AbsLayout(已淘汰)
幀佈局FrameLayout
6. 請介紹下Android的數據存儲方式。
sharedPreference,文件,數據庫SQlite,網絡存儲
7. 請介紹下ContentProvider是如何實現數據共享的。
8. 如何啓用Service,如何停用Service。
啓動:
Context.startService()
and
Context.bindService().
關閉: Context.stopService().
Service.stopSelf()
or
Service.stopSelfResult()
9. 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。
Android廣播機制(兩種註冊方法)
在android下,要想接受廣播信息,那麼這個廣播接收器就得咱們本身來實現了,咱們能夠繼承BroadcastReceiver,就能夠有一個廣播接受器了。有個接受器還不夠,咱們還得重寫BroadcastReceiver裏面的onReceiver方法,當來廣播的時候咱們要幹什麼,這就要咱們本身來實現,不過咱們能夠搞一個信息防火牆。具體的代碼:
public class SmsBroadCastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
Object[] object = (Object[])bundle.get("pdus");
SmsMessage sms[]=new SmsMessage[object.length];
for(int i=0;i<object.length;i++)
{
sms[0] = SmsMessage.createFromPdu((byte[])object[i]);
Toast.makeText(context, "來自"+sms[i].getDisplayOriginatingAddress()+" 的消息是:"+sms[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show();
}
//終止廣播,在這裏咱們能夠稍微處理,根據用戶輸入的號碼能夠實現短信防火牆。
abortBroadcast();
}
}
當實現了廣播接收器,還要設置廣播接收器接收廣播信息的類型,這裏是信息:android.provider.Telephony.SMS_RECEIVED
咱們就能夠把廣播接收器註冊到系統裏面,可讓系統知道咱們有個廣播接收器。這裏有兩種,一種是代碼動態註冊:
//生成廣播處理
smsBroadCastReceiver = new SmsBroadCastReceiver();
//實例化過濾器並設置要過濾的廣播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//註冊廣播
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver, intentFilter);
一種是在AndroidManifest.xml中配置廣播
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadCastReceiverActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--廣播註冊-->
<receiver android:name=".SmsBroadCastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="7" />
<!-- 權限申請 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
兩種註冊類型的區別是:
1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命週期。
2)第二種是常駐型,也就是說當應用程序關閉後,若是有信息廣播來,程序也會被系統調用自動運行。
10. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係。
1. Android進程
當一個程序第一次啓動的時候,Android會啓動一個LINUX進程和一個主線程。默 認的狀況下,全部該程序的組件都將在該進程和線程中運行。
同 時,Android會爲每一個應用程序分配一個單獨的LINUX用戶。Android會盡可能保留一個正在運行進程,只在內存資源出現不足時,Android 會嘗試中止一些進程從而釋放足夠的資源給其餘新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。Android會根據進程中運行的組件類別以及組件的狀態來判斷該進程的重要 性,Android會首先中止那些不重要的進程。
按照重要性從高到低一共有五個級別:
前臺進程
前臺進程是用戶當前正在使用的進程。只有一些前臺進程能夠在任什麼時候候都存在。他們是最後一個被結束的,當內存低到根本連他們都不能運行的時候。通常來講, 在這種狀況下,設備會進行內存調度,停止一些前臺進程來保持對用戶交互的響應。
可見進程
可見進程不包含前臺的組件可是會在屏幕上顯示一個可見的進程是的重要程度很高,除非前臺進程須要獲取它的資源,否則不會被停止。
服務進程
運 行着一個經過startService() 方法啓動的service,這個service不屬於上面提到的2種更高重要性的。service所在的進程雖然對用戶不是直接可見的,可是他們執行了用 戶很是關注的任務(好比播放mp3,從網絡下載數據)。只要前臺進程和可見進程有足夠的內存,系統不會回收他們。
後臺進程
運 行着一個對用戶不可見的activity(調用過 onStop() 方法).這些進程對用戶體驗沒有直接的影響,能夠在服務進程、可見進程、前臺進 程須要內存的時候回收。一般,系統中會有不少不可見進程在運行,他們被保存在LRU (least recently used) 列表中,以便內存不足的時候被第一時間回收。若是一個activity正 確的執行了它的生命週期,關閉這個進程對於用戶體驗沒有太大的影響。
空進程
未運行任何程序組件。運行這些進程的惟一緣由是做爲一個緩存,縮短下次程序須要從新使用的啓動時間。系統常常停止這些進程,這樣能夠調節程序緩存和系統緩 存的平衡。
Android 對進程的重要性評級的時候,選取它最高的級別。另外,當被另外的一個進程依賴的時候,某個進程的級別可能會增高。一個爲其餘進程服務的進程永遠不會比被服 務的進程重要級低。由於服務進程比後臺activity進程重要級高,所以一個要進行耗時工做的activity最好啓動一個service來作這個工 做,而不是開啓一個子進程――特別是這個操做須要的時間比activity存在的時間還要長的時候。例如,在後臺播放音樂,向網上上傳攝像頭拍到的圖片, 使用service可使進程最少獲取到「服務進程」級別的重要級,而不用考慮activity目前是什麼狀態。broadcast receivers作費時的工做的時候,也應該啓用一個服務而不是開一個線程。
2. 單線程模型
當一個程序第一次啓動時,Android會同時啓動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處 理。因此主線程一般又被叫作UI線程。在開發Android應用時必須遵照單線程模型的原則: Android UI操做並非線程安全的而且這些操做必須在UI線程中執行。
2.1 子線程更新UI
Android的UI是單線程(Single-threaded)的。爲了不拖住GUI,一些較費時的對象應該交給獨立的線程去執行。若是幕後的線程來 執行UI對象,Android就會發出錯誤訊息
CalledFromWrongThreadException。之後遇到這樣的異常拋出時就要知道怎麼回 事了!
2.2 Message Queue
在單線程模型下,爲了解決相似的問題,Android設計了一個Message Queue(消息隊列), 線程間能夠經過該Message Queue並結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:
1. Message
Message消息,理解爲線程間交流的信息,處理數據後臺線程須要更新UI,則發送Message內含一些數據給UI線程。
2. Handler
Handler處理者,是Message的主要處理者,負責Message的發送,Message內容的執行處理。後臺線程就是經過傳進來的 Handler對象引用來sendMessage(Message)。而使用Handler,須要implement 該類的 handleMessage(Message)
方法,它是處理這些Message的操做內容,例如Update UI。一般須要子類化Handler來實現handleMessage方法。
3. Message Queue
Message Queue消息隊列,用來存放經過Handler發佈的消息,按照先進先出執行。
每一個message queue都會有一個對應的Handler。Handler會向message queue經過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但經過這兩種方法發送的消息執行的方式略有不一樣:經過sendMessage發送的是一個message對象,會被 Handler的handleMessage()函數處理;而經過post方法發送的是一個runnable對象,則會本身執行。
4. Looper
Looper是每條線程裏的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)創建Message Queue,但在子線程裏並無創建Message Queue。因此調用Looper.getMainLooper()獲得的主線程的Looper不爲NULL,但調用Looper.myLooper() 獲得當前線程的Looper就有可能爲NULL。
對於子線程使用Looper,API Doc提供了正確的使用方法:
這個Message機制的大概流程:
1. 在Looper.loop()方法運行開始後,循環地按照接收順序取出Message Queue裏面的非NULL的Message。
2. 一開始Message Queue裏面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函數裏面設置了那個Message對象的target屬性是當前的Handler對象。隨後Looper取出了那個Message,則調用 該Message的target指向的Hander的dispatchMessage函數對Message進行處理。
在dispatchMessage方法裏,如何處理Message則由用戶指定,三個判斷,優先級從高到低:
1) Message裏面的Callback,一個實現了Runnable接口的對象,其中run函數作處理工做;
2) Handler裏面的mCallback指向的一個實現了Callback接口的對象,由其handleMessage進行處理;
3) 處理消息Handler對象對應的類繼承並實現了其中handleMessage函數,經過這個實現的handleMessage函數處理消息。
因而可知,咱們實現的handleMessage方法是優先級最低的!
3. Handler處理完該Message (update UI) 後,Looper則設置該Message爲NULL,以便回收!
在網上有不少文章講述主線程和其餘子線程如何交互,傳送信息,最終誰來執行處理信息之類的,我的理解是最簡單的方法——判斷Handler對象裏面的 Looper對象是屬於哪條線程的,則由該線程來執行!
1. 當Handler對象的構造函數的參數爲空,則爲當前所在線程的Looper;
2. Looper.getMainLooper()獲得的是主線程的Looper對象,Looper.myLooper()獲得的是當前線程的Looper對象。
11. AIDL的全稱是什麼?如何工做?能處理哪些類型的數據?
12. 請解釋下Android程序運行時權限與文件系統權限的區別。(Edited by Sodino)
http://my.oschina.net/u/226973/blog/42238
13. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?請說明起因。
14. 有一個一維整型數組int[]data保存的是一張寬爲width,高爲height的圖片像素值信息。請寫一個算法,將該圖片全部的白色不透明(0xffffffff)像素點的透明度調整爲50%。
暫時沒有找到!
一、什麼是ANR 如何避免它?
http://blog.csdn.net/Zengyangtech/archive/2010/11/21/6025671.aspx
ANR:Application Not Responding,五秒
在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應。當出現下列狀況時,Android就會顯示ANR對話框了:
對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒
意向接受器(intentReceiver)超過10秒鐘仍未執行完畢
Android應用程序徹底運行在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運行的,須要消耗大量時間的操做都會引起ANR。由於此時,你的應用程序已經沒有機會去響應輸入事件和意向廣播(Intent broadcast)。
所以,任何運行在主線程中的方法,都要儘量的只作少許的工做。特別是活動生命週期中的重要方法如onCreate()和 onResume()等更應如此。潛在的比較耗時的操做,如訪問網絡和數據庫;或者是開銷很大的計算,好比改變位圖的大小,須要在一個單獨的子線程中完成(或者是使用異步請求,如數據庫操做)。但這並不意味着你的主線程須要進入阻塞狀態已等待子線程結束 -- 也不須要調用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程爲子線程提供一個句柄(Handler),讓子線程在即將結束的時候調用它(xing:能夠參看Snake的例子,這種方法與之前咱們所接觸的有所不一樣)。使用這種方法涉及你的應用程序,可以保證你的程序對輸入保持良好的響應,從而避免由於輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐須要應用到全部顯示用戶界面的線程,由於他們都面臨着一樣的超時問題
二、什麼狀況會致使Force Close ?如何避免?可否捕獲致使其的異常?
通常像空指針啊,能夠看起logcat,而後對應到程序中 來解決錯誤
三、Android自己的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會致使什麼問題?如何解決?
會有運行時異常, 運行時異常無需捕捉
四、簡要解釋一下activity、 intent 、intent filter、service、Broadcast、BroadcaseReceiver
一個activity呈現了一個用戶能夠操做的可視化用戶界面
一個service不包含可見的用戶界面,而是在後臺無限地運行
能夠鏈接到一個正在運行的服務中,鏈接後,能夠經過服務中暴露出來的藉口與其進行通訊
一個broadcast receiver是一個接收廣播消息並做出迴應的component,broadcast receiver沒有界面
intent:content provider在接收到ContentResolver的請求時被激活。
activity, service和broadcast receiver是被稱爲intents的異步消息激活的。
一個intent是一個Intent對象,它保存了消息的內容。對於activity和service來講,它指定了請求的操做名稱和待操做數據的URI
Intent對象能夠顯式的指定一個目標component。若是這樣的話,android會找到這個component(基於manifest文件中的聲明)並激活它。但若是一個目標不是顯式指定的,android必須找到響應intent的最佳component。
它是經過將Intent對象和目標的intent filter相比較來完成這一工做的。一個component的intent filter告訴android該component能處理的intent。intent filter也是在manifest文件中聲明的。
五、IntentService有何
其實它也是避免ANR的方法:
IntentService 的好處
* Acitivity的進程,當處理Intent的時候,會產生一個對應的Service
* Android的進程處理器如今會盡量的不kill掉你
* 很是容易使用
1. android:paddingLeft與android:layout_marginLeft的區別
當按鈕分別設置以上兩個屬性時,獲得的效果是不同的。
android:paddingLeft="30px"
按鈕上設置的內容(例如圖片)離按鈕左邊邊界30個像素
android:layout_marginLeft="30px"
整個按鈕離左邊設置的內容30個像素
2. Android 動畫有哪幾種?描述一下
兩種。 Tween動畫和Frame動畫。 Tween動畫主要是透明度、尺寸伸縮、旋轉、位移等效果。
Frame動畫能夠理解成gif, 一幀一幀的顯示圖片。比較經常使用的有滾動條效果。
3. 對Intent、Activity、廣播、Service等的理解。
4. 哪些狀況下會發生ANR ? 怎麼對應 ? (這個問題也重複了)
Application Not Response。
5. 隱式、顯式Intent的區別
· 顯式意圖
經過名字指明目標組件(這個組件名字字段component name field,
前面提到過,
有一個數值集)。既然組件名稱一般不爲其餘應用程序的開發者所瞭解,顯式意圖典型的被用做應用程序的內部消息-例如一個活動啓動一個附屬服務或姊妹活動。
隱式意圖
不命名目標組件(組件名稱字段爲空)。隱式意圖常常用來激活其餘應用程序的組件。
這一塊參考Intent說明,能夠同時看一下Notepad的例子, 幫助理解,我的感受很重要!
(上面幾個問題感受都不錯,各位本身查漏補缺吧! 有些尚未寫答案的, 各位有空能夠回答一下~ 我會將你的答案填充上去)
返回鍵與Home鍵區別?
back鍵默認行爲是finish處於前臺的Activity的即Activity的狀態爲Destroy狀態爲止,再次啓動該Activity是從onCreate開始的(不會調用onSaveInstanceState方法)。Home鍵默認是stop前臺的Activity即狀態爲onStop爲止而不是Destroy,若再次啓動它,會調用onSaveInstanceState方法,保持上次Activity的狀態則是從OnRestart開始的---->onStart()--->onResume()。
思科面試題
1. Android中如何傳遞二進制數據?
2. ANR是什麼?哪些狀況下會發生?開發時如何尋找ANR?
3. 解釋AIDL
4. SAX、DOM、PULL解析xml的原理,以及各自優缺點
4. DIP、DPI分別是什麼?
5.java線程的sleep(),wait(),notify(),yield()方法的區別?
1.sleep()使線程休眠一段時間,一段時間結束後,線程進入可執行狀態,但並非當即執行,只是在被排程器調用的時候才執行。在休眠期間,並不釋放所持有的「鎖」; 2.wait()使線程休眠一段時間,若設置參數,時間到時,線程就自動進入可執行狀態。若沒有,則須要notify()方法去調用。注意:wait()方法和notify()方法都時針對this對象的,調用wait()方法後,會釋放加在對象上的「鎖」。 3.yield()使線程放棄執行的權利,進入可執行狀態,也就意味着線程在yield()方法後,有可能又執行。使用yield()方法,線程並不釋放本身鎖持有的「鎖」。 已有