1. 什麼是Activity
四大組件之一,通常一個用戶交互界面對應一個activity
activity 是Context的子類,同時實現了window.callback和keyevent.callback, 能夠處理與窗體用戶交互的事件.
開發經常使用的的有ListActivity , PreferenceActivity ,TabAcitivty等,若是界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity.
2. 請描述一下Activity 生命週期
生命週期描述的是一個Activity從建立(new出來)到銷燬的過程當中會執行的方法,在這個過程當中 會針對不一樣的生命階段會調用不一樣的方法.
Activity從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法.
這些回調方法包括:
- oncreate
- ondestroy
- onstop
- onstart
- onresume
- onpause
其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬;onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;對話框的彈出, Activity.this
這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是透明的,或者是對話框的樣式, A就不會調用onStop()方法.
4. 橫豎屏切換時候Activity的生命週期.
這個生命週期跟清單文件裏的配置有關係
①不設置Activity的android:configChanges時,切屏會從新調用各個生命週期,默認首先銷燬當前activity,而後從新加載.
②設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法
通常遊戲開發中, 屏幕的朝向都是寫死的.
5. 如何將一個Activity設置成窗口的樣式.
能夠自定義一個activity的樣式,詳細見手機衛士的程序詳細信息,android:theme="@style/FloatActivity"
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()方法 .
①拋異常強制退出:
該方法經過拋異常,使程序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(activity);
for(Activity activity: lists)
{
activity.finish();
}
③發送特定廣播:
在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可.
//給某個activity 註冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//若是過接受到的是關閉activity的廣播 就調用finish()方法 把當前的activity finish()掉
④遞歸退出:
在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉.
上面是網上的一些作法.
其實能夠經過 intent的flag來實現
intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity,而後在新的activity的oncreate方法裏面 finish掉.
Intent intent = new Intent(this,B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
侷限性 :全部的activity的啓動模式都要是默認的啓動模式
8. service是否在main thread中執行, service裏面是否能執行耗時的操做?
默認狀況,若是沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面,service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 )
在子線程中執行 new Thread(){}.start();
特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,讓service在另外的進程中執行
<service android:process="cn.itcast.xxx"></service>
9. 兩個Activity之間怎麼傳遞數據?
基本數據類型能夠經過Intent傳遞數據
extras.putDouble(key, value)
intent.putExtra(name, value)
// 經過intent putExtra 方法基本數據類型都傳遞
Bundle bundle = new Bundle();
bumdle.putShort(key, value);
intent.putExtras(bundle);
intent.putExtras(bundle)
獲取到激活他的 getIntent();
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
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(url);
10. 怎麼讓在啓動一個Activity是就啓動一個service?
在activity的onCreate()方法裏面 startService();
11. 同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
比方說在激活一個新的activity時候, 給intent設置flag
Intent的flag添加FLAG_ACTIVITY_NEW_TASK
這個被激活的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.什麼是Service以及描述下它的生命週期.Service有哪些啓動方法,有什麼區別,怎樣停用Service?
在Service的生命週期中,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind.
一般有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的.
①經過startService
Service會經歷 onCreate 到onStart,而後處於運行狀態,stopService的時候調用onDestroy方法.若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行.
②經過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的話會拋出異常.
14. 不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?
這個問題問的很山寨.默認不作任何處理,B裏面的音樂都能播放.
遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解()
A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.
15. 什麼是IntentService?有何優勢?
普通的service ,默認運行在ui main 主線程,Sdk給咱們提供的方便的,帶有異步處理的service類,異步處理的方法OnHandleIntent(),OnHandleIntent() 處理耗時的操做.
16. 何時使用Service?
擁有service的進程具備較高的優先級.
官方文檔告訴咱們,Android系統會盡可能保持擁有service的進程運行,只要在該service已經被啓動(start)或者客戶端鏈接(bindService)到它.當內存不足時,須要保持,擁有service的進程具備較高的優先級.
①若是service正在調用onCreate, onStartCommand或者onDestory方法,那麼用於當前service的進程至關於前臺進程以免被killed.
②若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.
③若是客戶端已經鏈接到service (bindService),那麼擁有Service的進程則擁有最高的優先級,能夠認爲service是可見的.
④若是service可使用startForeground(true)方法來將service設置爲前臺狀態,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed.
若是有其餘的應用組件做爲Service,Activity等運行在相同的進程中,那麼將會增長該進程的重要性.
特色:
①Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做. 如天氣預報 widget TimerTask Timer 按期執行timertask
②Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做. Broadcast receiver生命週期 和 響應時間很短
③遠程的service若是被啓動起來,能夠被屢次bind, 但不會從新create. 手機的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用.
17. 請描述一下Intent 和 Intent Filter.
Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容.對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項.
經過Intent 能夠實現各類系統組件的調用與激活.
Intent filter: 能夠理解爲郵局或者是一個信箋的分揀系統,這個分揀系統經過3個參數來識別:
Action: 動做 view
Data: 數據uri uri
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.
18. Intent傳遞數據時,能夠傳遞哪些類型數據?
①通常的基本數據類型 Intent .putextra() intent.getStringextra();
②數據的uri, intent.setData() intent.getData();
19. 說說Activity,Intent,Service是什麼關係 .
這種問題,就講下activity,講一下service,說一下經過intent去激活組件,傳遞數據.說一下本身項目中有這樣一個網絡更新的功能,顯示界面就用的activity, 後臺有個service每隔半小時都去訪問下服務器獲取更新的數據.開啓服務用的是intent來開啓.
20. 請描述一下Broadcast Receiver.
有不少廣播接收者 ,系統已經實現了.廣播分兩種
有序廣播
無序廣播
指定接收者的廣播,是不能夠被攔截掉的
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
onReceive() 方法. abortBroadcast();
有序廣播有一個特例
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
resultReceiver 廣播接受者 若是咱們顯示的指定了廣播接收者
不管如何 都會接受廣播時間 abortBroadcast(); 的方法不會終止廣播時間
Sticky
sendStickyBroadcast(intent) // 陰魂不散的廣播
Wifi設置
用於接收系統的廣播通知, 系統會有不少sd卡掛載,手機重啓,廣播通知,低電量,來短信等,一個apk的安裝成功.
手機衛士中自定義一個broadcast receiver
<intent-filter android:> <action> sms_received </action> </intent-filter>
來獲取短信到來的廣播,根據黑名單來判斷是否攔截該短信.
畫畫板生成圖片後,發送一個sd掛載的通知,通知系統的gallery去獲取到新的圖片.
Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
21. 在manifest和代碼中如何註冊和使 用 broadcast receiver .
設置廣播接收者的優先級,設置廣播接受者的action名字等
靜態註冊:詳細見工程代碼.
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<receiver android:name=".BootCompleteReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
動態註冊:代碼中註冊,若是代碼沒有執行,就接受不到廣播事件
registerReceiver(receiver, filter)
22. 請介紹下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[])
}
content:// 表明contentprovider
技巧:
①看urlmarcher.
②根據匹配碼,查看增刪改查的具體實現
23. 請介紹下Android的數據存儲方式.
①文件 訪問權限. sdcard :<data>/<data> context.openFileInput(name) 默認是私有的訪問權限
②數據庫 sqlite
③SharedPreference <data>/<data>/shared_preps Context.modeprivate
④網絡 socket tcp udp ,http httpurlconnection,ftp的網絡
24. 爲何要用ContentProvider?它和sql的實現上有什麼差異?
屏蔽數據存儲的細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了,對應的參數.不一樣app之間共享,操做數據,可是contentprovider 還能夠去增刪改查本地文件. xml文件的讀取,更改,網絡數據讀取更改,Sql也有增刪改查的方法.
25. 請介紹下Android中經常使用的五種佈局.
- FrameLayout(幀佈局)
- LinearLayout (線性佈局)
- AbsoluteLayout(絕對佈局)
- RelativeLayout(相對佈局)
- TableLayout(表格佈局)
幀佈局: 從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕.
線性佈局:從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上.每個LinearLayout裏面又可分爲垂直佈局
(android:orientation="vertical")和水平佈局(android:orientation="horizontal"
).當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列.
絕對佈局:猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x="20px" android:layout_y="12px"
表格佈局:相似Html裏面的Table.每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity="" .
每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面.
26. 談談UI中, Padding和Margin有什麼區別?
Padding 至關於內邊距,如文字對邊框, margin至關於外邊局,如控件與控件之間的距離.
27. widget相對位置的完成在activity的哪一個生命週期階段實現.
待補充...
widget能夠理解成桌面小控件,也能夠理解成某個button, imageview這樣的控件.
onmeasure() // 計算控件在屏幕上的位子
ondraw() //被顯示到界面上的
28. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係.
Handler簡介:
一個Handler容許你發送和處理Message和Runable對象,這些對象和一個線程的MessageQueue相關聯.每個線程實例和一個單獨的線程以及該線程的MessageQueue相關聯.當你建立一個新的Handler時,它就和建立它的線程綁定在一塊兒了.這裏,線程咱們也能夠理解爲線程的MessageQueue.從這一點上來看,Handler把Message和Runable對象傳遞給MessageQueue,並且在這些對象離開MessageQueue時,Handler負責執行他們.
Handler有兩個主要的用途:
①肯定在未來的某個時間點執行一個或者一些Message和Runnable對象.
②在其餘線程(不是Handler綁定線程)中排入一些要執行的動做.
Scheduling Message,即①,能夠經過如下方法完成:
post(Runnable):Runnable在handler綁定的線程上執行,也就是說不建立新線程.
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動做讓你把Runnable對象排入MessageQueue,MessageQueue收到這些消息的時候執行他們,固然以必定的排序.sendMessage這個動做容許你把Message對象排成隊列,這些Message對象包含一些信息,Handler的hanlerMessage(Message)會處理這些Message.固然,handlerMessage(Message)必須由Handler的子類來重寫.這是編程人員須要作的事.
當posting或者sending到一個Hanler時,你能夠有三種行爲:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精確的時間去處理.後二者容許你實現timeout,tick,和基於時間的行爲.
當你的應用建立一個新的進程時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應用對象(像activities,broadcast receivers等)和主線程建立的窗體.你能夠建立本身的線程,並經過一個Handler和主線程進行通訊.這和以前同樣,經過post和sendmessage來完成,差異在於在哪個線程中執行這方法.在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled.
Message簡介:
Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數據對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可讓你在大多數狀況下不用做分配的動做.儘管Message的構造函數是public的,可是獲取Message實例的最好方法是調用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個.
MessageQueue簡介:
這是一個包含message列表的底層類.Looper負責分發這些message.Messages並非直接加到一個MessageQueue中,而是經過MessageQueue.IdleHandler關聯到Looper.
你能夠經過Looper.myQueue()從當前線程中獲取MessageQueue.
Looper簡介:
Looper類被用來執行一個線程中的message循環.默認狀況,沒有一個消息循環關聯到線程.在線程中調用prepare()建立一個Looper,而後用loop()來處理messages,直到循環終止.大多數和message loop的交互是經過Handler.
下面是一個典型的帶有Looper的線程實現.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
29. AIDL的全稱是什麼?如何工做?
Android interface definition language (android接口定義語言) ,
用來跨進程的訪問方法, 訪問遠程的服務的方法.
30. 請解釋下Android程序運行時權限與文件系統權限的區別.
Android程序執行須要讀取到安全敏感項必需在androidmanifest.xml中聲明相關權限請求, 打電話,訪問網絡,獲取座標,讀寫sd卡,讀寫聯繫人等..安裝的時候會提示用戶.
文件系統的權限是linux權限. 好比說sharedpreference裏面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable 777本身 同組 其餘.
31. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?
找到對應的瀏覽器的意圖,傳遞數據URI, 激活這個意圖
Intent intent = new Intent();
intent.setClassName(packageName, className);
Intent.setdata(uri);
32. 對android主線程的運用和理解.
主ui線程不能執行耗時的操做
33. 對android虛擬機的理解,包括內存管理機制垃圾回收機制.
虛擬機很小,空間很小,談談移動設備的虛擬機的大小限制16M,談談加載圖片的時候怎麼處理大圖片的,
垃圾回收,沒有引用的對象,在某個時刻會被系統gc掉.
System.gc(); 不是馬上去執行垃圾回收.
34. Framework工做方式及原理,Activity是如何生成一個view的,機制是什麼.
反射,配置文件.能夠講下activity的源碼,好比說 每一個activity裏面都有window.callback和keyevent.callback,一些回調的接口或者函數. 框架把activity建立出來就會調用裏面的這些回調方法,會調用activity生命週期相關的方法.
setContentView();
普通的狀況:
Activity建立一個view是經過 ondraw 畫出來的, 畫這個view以前呢,還會調用onmeasure方法來計算顯示的大小.
35.android自己的一些限制,好比apk包大小限制,讀取大文件時的時間限.
這個問題問的有問題, apk包大小限制很差說,讀大文件的時間限制應該是main線程裏面的時間限制:5秒.
36. 如何加載的音樂信息,如何改善其效率.
Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統的數據庫表中,能夠經過content provider獲取,
顯示出來,改善效率,是個常見問題, 能夠從如下幾個方面做答,
分批加載數據, 延時加載數據, 合理使用緩存等.
37. ListView如何提升其效率?
複用convertview , 歷史的view對象.異步加載數據,分頁加載數據, onscallLinster();
Static class ViewHolder //使用靜態的view對象 避免建立過多的view.
把下載後的數據緩存到數據庫裏.
38. 啓動應用後,改變系統語言,應用的語言會改變麼?
通常系統應用會改變,由於應用中作了對應的語言包能夠實現匹配,好比android原生的自帶的應用源碼都有語言匹配values-en,values-it等,這個加載機制是android自帶的.若是一個應用中沒有作對應的語言包翻譯,則會自動加載values文件夾下的翻譯.因此這個問題和具體的應用有關,不能一律而論.
39. 啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別?
區別是根據activity在manifest裏面的配置,這個activity可能會放在不一樣的task棧裏面
intent設置的flag flag_new_task
40. Android程序與Java程序的區別?
Android程序用android sdk開發,java程序用javasdk開發.
Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt swing
package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用.
android sdk 添加工具jar httpclient , pull openGL等.
41. Android中Task任務棧的分配.
假若有三個Activity A B C,A跳到B,而後B跳到C,如今須要從C跳到A如何傳遞數據並且使效率最高呢?
首先咱們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 這意思就是說Task其實是一個Activity棧,一般用戶感覺的一個Application就是一個Task.從這個定義來看,Task跟Service或者其餘Components是沒有任何聯繫的,它只是針對Activity而言的.
Activity有不一樣的啓動模式, 能夠影響到task的分配
Task,簡單的說,就是一組以棧的模式彙集在一塊兒的Activity組件集合.它們有潛在的先後驅關聯,新加入的Activity組件,位於棧頂,並僅有在棧頂的Activity,纔會有機會與用戶進行交互.而當棧頂的Activity完成使命退出的時候,Task會將其退棧,並讓下一個將跑到棧頂的Activity來於用戶面對面,直至棧中再無更多Activity,Task結束.
事件 Task棧(粗體爲棧頂組件)
點開Email應用,進入收件箱(Activity A) A
選中一封郵件,點擊查看詳情(Activity B) AB
點擊回覆,開始寫新郵件(Activity C) ABC
寫了幾行字,點擊選擇聯繫人,進入選擇聯繫人界面(Activity D) ABCD
選擇好了聯繫人,繼續寫郵件 ABC
寫好郵件,發送完成,回到原始郵件 AB
點擊返回,回到收件箱 A
退出Email程序 null
如上表所示,是一個實例.從用戶從進入郵箱開始,到回覆完成,退出應用整個過程的Task棧變化.這是一個標準的棧模式,對於大部分的情況,這樣的Task模型,足以應付,可是,涉及到實際的性能、開銷等問題,就會變得殘酷許多.
好比,啓動一個瀏覽器,在Android中是一個比較沉重的過程,它須要作不少初始化的工做,而且會有不小的內存開銷.但與此同時,用瀏覽器打開一些內容,又是通常應用都會有的一個需求.設想一下,若是同時有十個運行着的應用(就會對應着是多個Task),都須要啓動瀏覽器,這將是一個多麼殘酷的場面,十個Task棧都堆積着很雷同的瀏覽器Activity,是多麼華麗的一種浪費啊.因而你會有這樣一種設想,瀏覽器Activity,可不能夠做爲一個單獨的Task而存在,無論是來自那個Task的請求,瀏覽器的Task,都不會歸併過去.這樣,雖然瀏覽器Activity自己須要維繫的狀態更多了,但總體的開銷將大大的減小,這種舍小家爲你們的行爲,仍是很值得歌頌的standard", "singleTop", "singleTask", "singleInstance".
standard模式, 是默認的也是標準的Task模式,在沒有其餘因素的影響下,使用此模式的Activity,會構造一個Activity的實例,加入到調用者的Task棧中去,對於使用頻度通常開銷通常什麼都通常的Activity而言,standard模式無疑是最合適的,由於它邏輯簡單條理清晰,因此是默認的選擇.
而singleTop模式,基本上於standard一致,僅在請求的Activity正好位於棧頂時,有所區別.此時,配置成singleTop的Activity,再也不會構造新的實例加入到Task棧中,而是將新來的Intent發送到棧頂Activity中,棧頂的Activity能夠經過重載onNewIntent來處理新的Intent(固然,也能夠無視...).這個模式,下降了位於棧頂時的一些重複開銷,更避免了一些奇異的行爲(想象一下,若是在棧頂連續幾個都是一樣的Activity,再一級級退出的時候,這是怎麼樣的用戶體驗...),很適合一些會有更新的列表Activity展現.一個活生生的實例是,在Android默認提供的應用中,瀏覽器(Browser)的書籤Activity(BrowserBookmarkPage),就用的是singleTop.
singleTask,和singleInstance,則都採起的另闢Task的蹊徑.
標誌爲singleTask的Activity,最多僅有一個實例存在,而且,位於以它爲根的Task中.全部對該Activity的請求,都會跳到該Activity的Task中展開進行.singleTask,很象概念中的單件模式,全部的修改都是基於一個實例,這一般用在構形成本很大,但切換成本較小的Activity中.最典型的例子,仍是瀏覽器應用的主Activity(名爲Browser...),它是展現當前tab,當前頁面內容的窗口.它的構形成本大,但頁面的切換仍是較快的,於singleTask相配,仍是挺天做之合的.
singleInstance顯得更爲極端一些.在大部分時候singleInstance與singleTask徹底一致,惟一的不一樣在於,singleInstance的Activity,是它所在棧中僅有的一個Activity,若是涉及到的其餘Activity,都移交到其餘Task中進行.這使得singleInstance的Activity,像一座孤島,完全的黑盒,它不關注請求來自何方,也不計較後續由誰執行.在Android默認的各個應用中,不多有這樣的Activity,在我我的的工程實踐中,曾嘗試在有道詞典的快速取詞Activity中採用過,
是由於我以爲快速取詞入口足夠方便(從notification中點選進入),而且會在各個場合使用,應該作得徹底獨立.
大的apk 拆成不少小的apk
●Activity的 android:taskAffinity=""屬性 姻緣關係
①配置後 當啓動這個activity時就先去找有沒有activity的親和力屬性相同 有就加入這個
activity所在的任務中沒有就新開任務
②affinity起做用須要的條件而者具有一個:
1.intent包含FLAG_ACTIVITY_NEW_TASK標記
2.activity元素啓用了allowTaskReparenting屬性.
42. 在Android中,怎麼節省內存的使用,怎麼主動回收內存?
回收已經使用的資源,合理的使用緩存,合理設置變量的做用範圍, application 對象
//將來的某一段時間執行.gc();
43. 不一樣工程中的方法是否能夠相互調用?
能夠,列舉aidl訪問遠程服務的例子.
44. 在Android中是如何實現判斷區分電話的狀態,去電,來電、未接來電?
待補充...
45. dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念
Dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面,每一個android程序系統都會給他分配一個單獨的liunx uid(user id), 每一個dvm都是linux裏面的一個進程.因此說這兩個進程是一個進程.
46. sim卡的EF 文件有何做用
待補充...
47. 如何判斷是否有SD卡?
配置文件中有sd卡的權限, 經過environment的靜態方法,
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {...}
48. 嵌入式操做系統內存管理有哪幾種, 各有何特性.
頁式,段式,段頁,等
待補充...
49. 什麼是嵌入式實時操做系統, Android 操做系統屬於實時操做系統嗎?
實時操做系統是指當外界事件或數據產生時,可以接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間以內來控制生產過程或對處理系統做出快速響應,並控制全部實時任務協調一致運行的嵌入式操做系統.主要用於工業控制、軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就須要使用實時系統.又可分爲軟實時和硬實時兩種,而android是基於linux內核的,所以屬於軟實時. 硬實時. 火星探測車.
50. 一條最長的短信息約佔多少byte?
中文70(包括標點),英文160,160個字節 這個說法不許確,
要跟手機制式運營商等信息有關.
作實驗,看源碼
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, pi, null);
}
51. Linux中跨進程通訊的幾種方式 .
linux編程
# 管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用.進程的親緣關係一般是指父子進程關係.
# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊.
# 信號量( semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問.它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源.所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段.
# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識.消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點.
# 信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生.
# 共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問.共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的.它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊.
# 套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊.
52. 談談對Android NDK的理解.
native develop kit 只是一個交叉編譯的工具 .so
①何時用ndk, 實時性要求高,遊戲,圖形渲染, opencv (人臉識別) , ffmpeg , rmvb mp5 avi 高清解碼. ffmpeg, opencore.
②爲何用ndk,ndk的優勢 ,缺點,咱們項目中那些地方用到了ndk
53. 談談Android的優勢和不足之處.
①開放性,開源
②掙脫運營商束縛
③豐富的硬件選擇
④不受任何限制的開發商
⑤無縫結合的Google應用
缺點:
①安全問題、隱私問題
②賣手機的不是最大運營商
③運營商對Android手機仍然有影響
④山寨化嚴重
⑤過度依賴開發商,缺少標準配置 版本過多
54. Android系統中GC什麼狀況下會出現內存泄露呢? 視頻編解碼/內存泄露
致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放.若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要.若是存在對象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放.要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用.典型的作法就是把對象數據成員設爲null或者從集合中移除該對象.但當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理.
Java帶垃圾回收的機制,爲何還會內存泄露呢?
Vector v = new Vector(10);
for (int i = 1; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象.
Java 內存泄露的根本緣由就是保存了不可能再被訪問的變量類型的引用,這樣會致使內存資源使用不斷累計從而出現異常.
55. Android UI中的View如何刷新.
在主線程中,拿到view調用Invalide()方法,查看畫畫板裏面更新imageview的方法,在子線程裏面能夠經過postInvalide()方法;
56. 簡單描述下Android 數字簽名.
Android 數字簽名:
在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係
Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中.Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序.
這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的.
同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處.
①有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本.若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名.
②有利於程序的模塊化設計和開發.Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序.因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊.
在簽名時,須要考慮數字證書的有效期:
①數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級.
②若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期.
③Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後.
Android數字證書包含如下幾個要點:
①全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
②Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證
③若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布.
④數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期.若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能.
57. 什麼是ANR 如何避免它?
在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框.用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框.所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶.Activity 5秒 broadcast10秒
耗時的操做 worker thread裏面完成, handler message AsynTask , intentservice.等
58. android中的動畫有哪幾類,它們的特色和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫.
Tween動畫,這種實現方式可使視圖組件移動、放大、縮小以及產生透明度的變化;
能夠經過佈局文件,能夠經過代碼.
59. 說說mvc模式的原理,它在android中的運用.
MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層.
Android中界面部分也採用了當前比較流行的MVC框架,在Android中M就是應用程序中二進制的數據,V就是用戶的界面.Android的界面直接採用XML文件保存的,界面開發變的很方便.在Android中C也是很簡單的,一個Activity能夠有多個界面,只須要將視圖的ID傳遞到setContentView(),就指定了以哪一個視圖模型顯示數據.
在Android SDK中的數據綁定,也都是採用了與MVC框架相似的方法來顯示數據.在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就能夠直接在視圖模型上顯示了,從而實現了數據綁定.好比顯示Cursor中全部數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示.
60. 經過點擊一個網頁上的url 就能夠完成程序的自動安裝,描述下原理
待補充...
61,Service和Activity在同一個線程嗎
默認狀況同一線程 main主線程 ui線程
62,java中的soft reference是個什麼東西
StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收
SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存
63,udp鏈接和TCP的不一樣之處
tcp/滑動窗口協議. 擁塞控制.
udp 不關心數據是否達到,是否阻塞
畫面優先:tcp
流暢優先:udp
64, android開發中怎麼去調試bug
邏輯錯誤
①斷點 debug
②logcat
65.service裏面能夠彈Toast麼
能夠
66.寫10個簡單的linux命令
cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig startup dhcp
67 JNI調用經常使用的兩個參數
JNIEnv *env, jobject javaThis
68. 書寫出android工程的目錄結構
src
android. jar
asset
res
gen
manifest
69. ddms 和traceview的區別.
daivilk debug manager system
①在應用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");
②一樣在主activity的onStop方法中加入Debug.stopMethodTracing();
③同時要在AndroidManifest.xml文件中配置權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
④從新編譯,安裝,啓動服務,測試完成取對應的traceview文件(adb pull /sdcard/xxxx.trace).
⑤直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應的應用便可.
traceview 分析程序執行時間和效率
KPI : key performance information : 關鍵性能指標:
splash界面不能超過5秒
從splash 界面加載mainactivity 不能超過0.7秒
70, 同步異步的理解,什麼是同步,什麼是異步,屢次調用異步方法會出現什麼問題.
待補充...
71. 利用mvc的模式重構代碼
重構前的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listen for button clicks
Button button = (Button) findViewById(R.id.submit);
button.setOnClickListener(calcBMI);
}
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
EditText fieldheight = (EditText) findViewById(R.id.height);
EditText fieldweight = (EditText) findViewById(R.id.weight);
double height = Double.parseDouble(fieldheight.getText().toString()) / 100;
double weight = Double.parseDouble(fieldweight.getText().toString());
double BMI = weight / (height * height);
TextView result = (TextView) findViewById(R.id.result);
result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
TextView fieldsuggest = (TextView) findViewById(R.id.suggest);
if (BMI > 25) {
fieldsuggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
fieldsuggest.setText(R.string.advice_light);
} else {
fieldsuggest.setText(R.string.advice_average);
}
}
};
}
Step1:抽取全部界面元件的聲明和定義,整合到單獨一個函數findViews()中; java
// 聲明 view
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
此部分便是MVC中的V:View視圖.
Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數setListensers()中;
//Listen for button clicks
private void setListensers() {
button_calc.setOnClickListener(calcBMI);
}
此部分便是MVC中的C:Controller控制器.
接着,onCreate()就顯得很是簡潔、明瞭了:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
Step3:修改按鈕監聽器calcBMI中相應的部分(主要是變量已經在視圖部分定義了);
private OnClickListener calcBMI = new OnClickListener() {
@Override
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.00");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText("Your BMI is " + nf.format(BMI));
// Give health advice
if (BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
總之,此重構的目的無非是使程序的脈絡更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應該寫在哪裏,程序邏輯(Controller)應該寫在哪裏,最終使維護和擴展代碼變得更加容易!
其實,重構很簡單,通讀代碼,感受哪邊不太爽,就改那邊吧!(我目前的感覺)
一個良好的代碼應該是能讓人感到舒服的!
重構後的代碼Bmi.java:
package com.demo.android.bmi;
import java.text.DecimalFormat;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Bmi extends Activity {
private Button button_calc;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_suggest;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
// 定義
private void findViews() {
button_calc = (Button) findViewById(R.id.submit);
field_height = (EditText) findViewById(R.id.height);
field_weight = (EditText) findViewById(R.id.weight);
view_result = (TextView) findViewById(R.id.result);
view_suggest = (TextView) findViewById(R.id.suggest);
}
// Listen for button clicks
private void setListeners() {
calcbutton.setOnClickListener(calcBMI);
}
private Button.OnClickListener calcBMI = new Button.OnClickListener() {
public void onClick(View v) {
DecimalFormat nf = new DecimalFormat("0.0");
double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double BMI = weight / (height * height);
// Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
// Give health advice
if (BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
} else if (BMI < 20) {
view_suggest.setText(R.string.advice_light);
} else {
view_suggest.setText(R.string.advice_average);
}
}
};
}
總結:
關於項目
在就是你項目經驗,必定要突出你遇到什麼難點,而後是怎麼解決的!把問題引導到你熟悉的領域,或者知識點上,儘可能將每一個技術點細節凸顯出來.
心態:
什麼樣的面試官都有,去面試的時候要作好一切心理準備,無論是技術仍是基礎都得紮實.一我的的交談能力也很重要,總之不是很是標準的普通話,最起碼你說的得讓別人聽得懂,並且得把面試官講得很是完全,這樣你得到offer的機會更大,談工資也有優點.
整理自:百度文庫 linux
20150428 android
ANDROID面試筆記系列 面試
-------------------------------------------- sql
聯繫方式 數據庫
-------------------------------------------- 編程
Weibo: ARESXIONG 瀏覽器
E-Mail: aresxdy@gmail.com 緩存
------------------------------------------------