1、功能模塊html
環境:Eclipse 、JDK1.七、ADTjava
根據模塊來剖析項目中所採用的技術吧linux
Activity、Service、BroadCastRevicer 、handler、多線程、io流、json(項目中沒有解析xml,運用的是json)、http協議android
數據存儲:記錄用戶登陸帳號,採用SharePreference,聊天數據存儲,聯繫人運用sqlitec++
查找陌生人:百度地圖API、除此在圖片處理那塊用到了開源的XUtils、搖一搖運用了傳感器面試
解密遊戲:一個小遊戲,主要運用了重量級的SurfaceView,剩下的就是算法了算法
通信錄:主要是sqlite,對數據庫的操做,以及各個Activity之間信息的傳遞sql
語音聊天、圖片分享:語音聊天那塊沒負責,不清楚,哪天抽時間研究實現以後再補筆記吧數據庫
除此以外,json
自定義ListView、自定義GridView(分享圖片,圖片排列的佈局方式)、自定義Fragment、自定義toast、自定義加載動畫、
=====================================================================================================
根據上面的內容,如下爲面試可能碰到的問題(若是有錯誤,歡迎你們指正):
===================================Android部分=============================================
1.簡述Activity的生命週期(最基本的問題如今比較少問道,可是回答不上來就吹了)
當Activity啓動的時候,會一次執行onCreate()、onStart()、onResume()方法,此時Activity對用戶來講可見也能夠響應用戶操做。
當Activity從可見變爲被Dialog遮擋時,會調用onPause()方法,此時Activity對用戶仍然可見,可是沒法獲取焦點。也就不能響應用戶的操做。
當Activiry從被Dialog遮擋的狀態恢復的時候,會調用onResume()方法,從而恢復能夠響應事件的狀態。
當Activity從可見狀態變爲被其餘Activity覆蓋或者點擊Home進入後臺的時候,會依次調用onPause()、onStop()方法,若是在此期間,系統內存不足,致使Activity被回收的話,會調用onDestory()方法。
當Activity從被其餘Activity遮擋或者進入後臺狀態恢復,且沒有被系統回收的狀況下,會調用onRestart()、onStart()、onResume(),恢復到能夠響應用戶操做的狀態。
當Activity從被其餘Activity遮擋或者進入後臺狀態恢復,被系統回收的狀況下,此時至關於從新打開一個Acitivity,會調用onCreate()、onStart()、onResume()方法。
在onPause()方法執行後,系統會中止動畫等消耗CPU的操做,同時應該在此時保存數據,由於此時當前Activity的優先級下降,可能被系統回收,應在onResume將數據讀出並保存,幫用戶恢復到以前的狀態。
在onDestory()執行後,activity就不存在了,能夠用isFinish()來判斷,若是此時有Progress Dialog顯示,則應該在onDestory裏面cancel掉,不然線程結束的時候,調用Dialog的cancel方法會拋異常。
2.Intent啓動Activity有幾種方式,如何實現?
啓動方式有兩種,即隱士啓動和顯示啓動
①顯示啓動
1 Intent intent = new Intent(MainActivity.this,SecondActivity.class); 2 StartActivity(intent);
顯示啓動除了上面的方法之外還存在另外一種
1 Intent intent = new Intent(); 2 ComponentName component = new ComponentName(this,SecondActivity.class); 3 intent.setComponent(component); 4 startActivity(intent);
其實兩種啓動方式是一致的,如下是Intent構造函數的代碼
1 public Intent(Context packageContext,Class<?>cls){ 2 mComponent = new ComponentName(packageContext,cls) 3 }
②隱式意圖的實現
1 Intent intent = new Intent(); 2 intent.setAction("second"); 3 startActivity(intent);
Action在清單文件中自行配製,且此處的信息要和清單文件中聲明的徹底相同
3.android系統架構有幾層?哪幾層?
android系統架構分爲4層,分別爲
應用程序層 java語言開發 應用程序開發
應用程序架構層 java os定製 framework層的開發
系統運行庫層 c/c++ so庫
Linux內核層
4.android的四大組件是什麼?其做用是什麼?
四大組件分別爲Activity、Service、Broadcast Receiver、Content Provider
Activity:一個Activity一般就是一個單獨的屏幕,它在上面能夠顯示一些控件也能夠監聽並處理用戶的事件作出響應。Activity之間利用Intent進行通訊
Service服務:沒有用戶界面,一段長生命週期的,能夠用來開發監控類的程序。
BroadcastReceiver:廣播接收者,可使用它對外部事件進行過濾只對須要進行處理的事件進行接收並響應,沒有用戶界面。一般經過啓動一個activity或Service來響應接收到信息。
Content Provider內容提供者:主要用於多個應用程序間數據的共享,這些數據能夠存儲在文件系統中或者SQLite數據庫中。
5.廣播如何調用,有什麼方式?區別是什麼?
程序中發送廣播經過sendBroadcastReceiver()實現
接收廣播步驟 ①繼承BroadcastReceiver ②重寫onReceiver()方法
廣播的註冊有兩種方法
①在清單文件中經過<receiver>標籤聲明
常駐型廣播,當應用程序關閉之後,若是有廣播信息傳來,則廣播接收器一樣能夠接收到
②在代碼中動態註冊,代碼以下:
1 IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 2 IncomingSMSReceiver receiver = new IncomingSMSReceiver(); 3 registerReceiver(receiver,filter);
很是駐型廣播,廣播跟隨activity的生命週期,須要注意的是,在activity結束前,移除廣播接收器。
6.Android中assets文件夾和raw文件夾的區別?
共同點:
二者目錄下的文件在打包後,會原封不動的保存在APK中,不會編譯成二進制。
不一樣點:
①res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID 即R.raw.fileName;assets文件夾下的資源不會被映射到R.java中,訪問的時候須要AssetManage類。
②res/raw不能夠有目錄結構,而assets則能夠有目錄結構,即assets目錄下能夠再建文件夾
③讀取文件資源舉例:
讀取raw下的文件資源,經過如下方式獲取輸入流來進行寫操做
InputStream is = getResourse().openRawResource(R.raw.fileName);
讀取assets下的文件資源,經過如下方式獲取輸入流來進行操做
AssetManager am = null; am = getAssets(); InputStream is = am.open("fileName");
7.橫豎屏切換時候Activity的生命週期?
今生命週期和清單文件中的配置息息相關
①不設置Activity的android:ConfigChanges時,切屏會從新調用各個生命週期 ,首先銷燬當前Activity而後從新開始
②設置Activity的android:configChanges = "orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行onConfigChanged方法。
8.如何將Activity設置成窗口樣式?
首先自定義一個Activity,而後作以下指定,android:theme = "@android:style/Theme.Dialog"
9.若是你後臺的activity被系統回收之後怎麼辦?若是後臺的Activity因爲某種緣由被系統回收了,如何在被系統回收以前保存當前的狀態?
除了在棧頂的activity,其餘的activity都有可能在系統內存不足的時候被系統回收,一個Activity越處於棧底,被系統回收的可能性越大。
1 protected void onSaveInstanceState(Bundle outState){ 2 super.onSaveInstanceState(outState); 3 outState.putLong("id",33); 4 } 5 6 public void onCreate(Bundle savedInstanceState){ 7 //判斷savedInstanceState是否爲空,若不爲空則取出 8 super.onCreate(savedInstanceState); 9 }
10.如何退出Activity?如何安全退出已調用多個Activity的Application?
退出activity直接調用finish()方法
退出Activity會調用onDestory()方法
①拋異常強制退出
該方法經過拋異常,使程序Force Close,此方法交互不好,須要解決的問題是,在不彈出Force Close的狀況下將程序結束掉
//安全結束進程
android.os.Process.killProcess(android.os.Process.myPid());
②記錄打開的Activity:
每次打開一個Activity,就記錄下來。在須要退出時,關閉沒一個Activity便可
List<Activity>lists; 在application全集環境裏面
lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity:lists){
activity.finish();
}
ondestory lists.remove(this);
③發送特定廣播
在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可
//給某個Activity註冊接收廣播的意圖
registerReceiver(receiver,filter);
若是接收到的是關閉activity的廣播,就調用finish()方法,把當前的activity finish()掉
④遞歸退出
在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActicityResult中處理,遞歸關閉。
11.兩個activity之間如何傳遞數據?
基本數據類型能夠經過Intent傳遞
extras.putDouble(key,value);
intent.putExtra(name,value);
//經過Intent putExtra方法,基本數據類型都傳遞
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value");
Bundle bundle = new Bundle();
bundle.putShort(key,value);
intent.putExtras(bundle);
Application全局裏面存放對象,本身去實現本身的application的這個類,基礎系統的application.每一個Activity均可以取到
讓對象實現implements Serializable接口把對象存放到文件上,讓類實現Serializable接口,而後能夠經過ObjectOutputStream讀取
File file = new File("\path.obj"); FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new objectOutputStream(fos); Student stu = new Stident(); oos.writeObject(stu); //從文件中讀出對象 ObjectInputStream ois = new ObjectInputStream(arg0); Student stu1 = (Student)ois.redObject();
網絡
intent.setData(Uri)
Uri.fromFile();
12.service是否在main thread中執行,service裏面是否能執行耗時操做?
默認狀況下,若是沒有指定service所運行的進程,Service和activity是運行在當前app所在的進程的main thread(UI主線程)裏面
service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件),耗時操做須要在子線程中執行new TAHREAS{}.start();
13.怎麼在啓動一個Activity就是啓動一個Service?
在activity的onCreate()方法裏面startService();
14.同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
Singleinstance運行在另外的單獨的任務棧中
在激活一個新的activity時候,給Intent設置flag,Intent的flag添加FLAG_ACTIVITY_NEW_TASK,此時這個被激活的activity就會在新的task棧中。
1 Intent intent = new Intent(A.this,B.class); 2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3 setActivity(intent);
15.Activity怎麼和Service綁定,怎麼在activity中啓動本身對應的service?
startService()一旦被建立,和調用者無關
bindService()方法把service和調用者綁定,若是調用者被銷燬,service也會被銷燬,可使用service裏面的方法,構建一個Intent對象
Intent service = new Intent(this,MyService.class); //經過bindService的方法啓動一個服務 bindService(intent,new conn,BIND_AUTO_CREATE); private class conn implements ServiceConnection{ public void onServiceConnected(ComponentName name,IBinder service) //使用IBinder的對象 去使用service裏面的方法 } public void onServiceDisconnected(ComponentName name){ }
16.activity與service怎麼交互?
17.acticity的啓動模式之間的區別?
當應用程序運行起來後就會開啓一條線程,線程中會運行一個棧,當activity實例建立後就會放入任務棧中。Activity啓動模式的設置在AndroidManifest.xml文件中,經過配置Activity的屬性android:launchMode=""設置
activity有四種啓動模式,分別爲standared、SingleTop、SingTask、signleInstance
standared:默認的標準模式,即在清單文件中不指定時,爲此啓動方式,該模式的特色是:只要建立一經激活,則會向任務棧中加入新建立的實力,退出activity時則會在任務棧中銷燬該實例。
SingleTop:若是任務棧元素是要被激活的組件處於任務棧的棧頂,不會建立新的activity放在任務棧,而是會複用棧頂的activity。若是棧頂的元素不是要激活的activity,就會建立新的activity放置到任務棧裏面。
SingleTask:若是發現任務棧裏面已經有了要啓動的這個Activity,它會清空這個activity所在棧上面的全部activity,而後複用這個已經存在的Activity。
SingleInstance:首先要開啓一個新的任務棧,把要激活的Activity放置到新的任務棧裏,這個任務棧裏面只有一個實例。
18.Intent傳遞數據時,能夠傳遞那些類型數據?
1.通常的基本數據類型 Intent.putExtra() intent.getExtra()
2.數據的uri,intent.setData() intent.getData()
19.請介紹下ContentProvider是如何實現數據共享的?
把本身的數據經過uri的形式共享出去, android 系統下不一樣程序數據默認不能共享訪問 須要實現一個類去繼承ContentProvider
public class PersonContentProvider extends ContentProvider{ public boolean onCreate(){ //........................ } query(Uri,String[],String,String[],String); insert(Uri,ContentValues); update(Uri,ContentValues,String,String[]); delete(Uri,String,String[]); }
20.android的數據存儲方式有哪些?
文件 sdcard <data>
數據庫 sqlite
SharedPreference <data>/<data>/shared_preps
網絡 socket tcp udp http
21.爲何要使用ContentProvider?它和sql的實現上有什麼差異?
ContentProvider屏蔽數據的存儲細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了,實現不一樣app之間數據的共享
sql也有增刪改查的方法 可是contentprovider還能夠去增刪改查本地文件,xml文件的讀取,更改,網絡數據讀取更改
22.AIDL的全稱是什麼?如何工做?
AIDL全稱是android interface definition language(android定義接口語言)。用來跨進程的訪問方法
經過這種語言定義接口之後,Eclipse插件會自動生成相應的Java代碼接口代碼
編寫一個AIDL服務的基本步驟:
①在Eclipse工程的package目錄中創建一個擴展名爲aidl的文件,package目錄就是java類所在的目錄,該文件的語法相似於Java代碼,aidl文件中定義的是AIDL服務的接口。這個接口須要在調用AIDL服務的程序中訪問。
②若是aidl文件的內容hi正確的,Eclipse插件會自動生成一個Java接口文件(*.java)
③實現由aidl文件生成的java接口
④在清單文件中配置AIDL服務,由其要注意的是,<action>標籤的android:name屬性值就是客戶端要引用改服務的ID,也就是Intent類構造方法的參數值。
23.請解釋下android程序運行時權限與文件系統權限的區別。
android程序運行時權限,android程序須要讀取到安全敏感項必須在androidmanifest.xml中聲明相關權限相關權限請求,如撥打電話,網絡訪問,獲取當前地理位置,讀寫聯繫人等,安裝的時候會提示用戶
文件系統權限是linux權限。如sharedPreference裏面的Context.Mode.private Context.Mode.world_readable Context.Mode_world_writeable
24.系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定的頁面?
找到對應的瀏覽器意圖,傳遞uri,激活這個意圖
1 Intent intent = new Intent(); 2 intent.setClassName(packageName,className); 3 intent.seturi()
25對android虛擬機的理解,包括內存管理機制,垃圾回收機制
26.Framwork工做方式及原理,activity是如何生成一個view的,機制是什麼?
27.Android UI中的View如何刷新?
在主線程中,拿到View調用Invalide()方法,查看畫面板裏面更新imageView的方法
在子線程中能夠經過postInvalide()方法
View view;
view.invalidate()
view.postInvalidate()
28.簡單描述下android數字簽名。
29.什麼是ANR,如何避免它?
ANR即android not responding,當應用程序有一段時間響應不流暢時,系統會向用戶顯示ANR的提示對話框。用戶能夠選擇等待,或者強制關閉,因ANR的出現會極大的影響用戶體驗,所以程序裏對響應性能的設計很重要,通常狀況下,activity5秒內,broadcast 10秒內
耗時的操做,在子線程中完成 可使用handler message...AsynTask,intentService
30.android中的動畫有哪幾類?其特色和區別是什麼?
兩種,一種是Tween動畫,一種是Frame動畫
31.說說MVC模式的原理,它在android中的運用。
MVC即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用就被分爲三個層--模型層、視圖層、控制層
android中界面部分採用了該框架,在android中M就是應用程序中二進制的數據,V就是用戶的界面。android中的界面直接採用xml文件保存(也可使用js+html),界面開發很方便。
32.ddms和traceviewde區別
33.android開發中怎麼去調試bug
34.service裏面能夠彈吐司嗎?
35.android工程的目錄結構
36.寫10個簡單的linux命令
37.java中的soft reference是什麼?
38.tcp鏈接和udp鏈接的不一樣之處?
39.android中獲取圖片有哪幾種方式?
40.TCP/IP和http協議的區別?
TCP/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。
41.屏幕適配問題
42.android中如何隱藏應用程序標題和通知欄
若是想同時隱藏標題欄和通知欄的話:
①在manifest裏面的activity加
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
②在activity的onCreate方法如下代碼:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
若是隻是想隱藏標題欄的話:
①在manifest裏面的activity加
android:theme="@android:style/Theme.NoTitleBar"
② 在activity的onCreate方法寫入一下代碼
requestWindowFeature(Window.FEATURE_NO_TITLE);
43.android系統的優缺點
44.android中圖片怎麼存?具體存在哪裏?
android中圖片通常存在scard中(或者機身內存中),若是圖片不少,最好建立不一樣的子文件夾,而後再把圖片放置到相應的子文件夾下,好比qq、微信。存儲的時候只存儲相應圖片的路徑,保存在sqlite中,經過圖片路徑,再從sd讀取出便可。
45.你用到過什麼設計模式?具體用在哪裏?怎麼實現的?
經典的MVC模式,分析上面有
命令模式:將事件代碼寫到自定義的監聽器內,把監聽器設置給控件,操做控件的時候內部調用監聽器方法,來代替事件處理代碼。
使用自定義控件時用到,下拉刷新和分頁加載列表。
46.軟件爲何要分層?
爲了實現「高內聚,低耦合」。把問題劃分開來各個解決,易於控制,易於擴展,易於分配資源......
47.軟件分層的優缺點?
①開發人員能夠只關注整個結構中的某一層;
②能夠很容易用新的實現來替換原有層次的實現
③能夠下降層與層之間的依賴
④有利於標準化
⑤利於各邏輯的複用
歸納來講,分層式設計能夠達至以下目的:分散關注、鬆散耦合、邏輯複用、標準定義
缺點:
①下降了系統的性能,若是不採用分層式結構,不少業務能夠直接訪問數據庫,以此獲取相應的數據,如今必須經過中間層來實現。
②有時會致使級聯的修改。這種修改尤爲體如今自上而下的方向。若是在表示層中須要增長一個功能,爲保證其符合分層式結構,可能須要在相應的業務邏輯層和數據訪問層中都增長相應的代碼。
關於第一個缺點能夠經過系統的緩存機制來減少對性能的影響。第二個缺點能夠經過設計模式進行改善。
================================================JAVA開發===============================================
1.ArrayList,Vector,LinkedList的存儲性能和特性。
2.Collection和Collections的區別。
3.HashMap和Hashtable。
4.sleep()和wait()有什麼區別。
5.Overload和Override的區別。
6.同步和異步有何異同,在什麼狀況下分別使用它們?
7.多線程
=============================================項目結構==================================================
在拿到一個項目作的第一件事,不是直接敲代碼,而是分析需求,如何組織代碼結構,是根據業務邏輯劃分,仍是根據功能模塊劃分等等。
印象很深的一次是,去比賽的時候,應該是一個出題的考官吧,問咱們有沒有實現消息推送的功能,這在賽題中只是一句話,一筆帶過,可是不少人都沒有作,結果就是扣分。還有一次是,在分配項目的過程當中出現了問題,在提交項目前兩天發現一個功能漏掉了,3我的熬了3天2夜趕出來了(從實驗室出來,路都不會走了......)
如今談談咱們這個項目的組織結構吧,咱們是根據功能模塊劃分的
①Activity com.usc.decode.activity
②Service com.usc.decode.service
③BroadCast com.usc.decode.receiver
④數據庫 com.usc.decode.db.dao
⑤對象 com.usc.decode.bean
⑥自定義控件 com.usc.decode.view
⑦工具類 com.usc.decode.utils
⑧業務邏輯 com.usc.decode.engine
項目建立
最低兼容到2.3,爲何是2.3?別問我,本身去查
最高到4.4,也別問我爲何,本身去查
整個項目結構
來張圖吧!
木有徹底畫完,畫不下了(ps:畫得很亂,請勿吐槽)