面試題②


1.
什麼是Activity?java

四大組件之一,通常的,一個用戶交互界面對應一個activity 
setContentView() ,// 要顯示的佈局 linux

button.setOnclickLinstener{ 
} 

 


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

我開發經常使用的的有FragmentActivitiy,ListActivity , PreferenceActivity ,TabAcitivty等…git

若是界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity. 
① 抽取相同的代碼 
② 細化activity的生命週期 oncreate() findveiwbyid initview initdata 添加點擊事件程序員

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

生命週期描述的是一個類 從建立(new出來)到死亡(垃圾回收)的過程當中會執行的方法.. 
在這個過程當中 會針對不一樣的生命階段會調用不一樣的方法面試

Activity從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法,這些回調方法包括:oncreate ondestroy onstop onstart onresume onpause 
其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬; 
onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause; 
這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在何時調用呢? 
答案就是:在Activity被onStop後,可是沒有被onDestroy,在再次顯示此Activity時就調用onRestart(而再也不調用onCreate)方法;算法

若是被onDestroy了,則是調用onCreate方法。sql

最後講本身項目中的經驗,好比說手機衛士每次進入某個界面的時候都要看到最新的數據,這個刷新列表的操做 就放在onStart()的方法裏面.這樣保證每次用戶看到的數據都是最新的.數據庫

多媒體播放, 播放來電話. 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的生命週期。

這個生命週期跟清單文件裏的配置有關係 
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期 
默認首先銷燬當前activity,而後從新加載

二、設置Activity的android:configChanges=」orientation|keyboardHidden|screenSize」時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法

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

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

能夠自定義一個activity的樣式 

android:theme=」@android:style/Theme.Dialog」

 

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?如何安全退出已調用多個ActivityApplication

拋異常不靠譜 系統會幫助把應用恢復起來 
全局變量 不靠譜(慎用) 若是使用的話 必定要跟着非空判斷 須要保存的內容 經過序列化 或者把對象轉換成 json xml的字符串保存到本地 
退出activity 直接調用 finish () 方法 . //用戶點擊back鍵 就是退出一個activity 
退出activity 會執行 onDestroy()方法 . 
一、拋異常強制退出: 
該方法經過拋異常,使程序Force Close。 
驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。

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

A->B->c 
二、記錄打開的Activity: 
每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。

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

    lists = new ArrayList<Activity>();

lists.add(activity);

for(Activity activity: lists) 
{ 
activity.finish(); 
}

 

三、發送特定廣播: LocalBroadcastManager 
在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。 

//給某個activity 註冊接受接受廣播的意圖 
registerReceiver(receiver, filter)

 

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

四、遞歸退出 
在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。

上面是網上的一些作法.

其實 能夠經過 intent的flag 來實現.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity,而後在新的activity的oncreate方法裏面 finish掉.

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

默認狀況,若是沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面 
service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 ) 
在子線程中執行 new Thread(){}.start(); 
Thread.currentThread().getName(); 
特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,讓service在另外的進程中執行

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

基本數據類型能夠經過. Intent 傳遞數據 

extras.putDouble(key, value) 
intent.putExtra(name, value) 
// 經過intent putExtra 方法 基本數據類型 都傳遞 
intent.getStringExtra(「key」,」value」); 
intent.getBooleanExtra(「key」,」value」) 
Bundle bundle = new Bundle(); 
bumdle.putShort(key, value); 
intent.putExtras(bumdle); 
intent.putExtras(bundle)

 

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

    oos.writeObject(stu);

 

 

    //從文件中把對象讀出來 

    ObjectInputStream ois = new ObjectInputStream(arg0);

     Student stu1 = (Student) ois.readObject();

 

文件/網絡

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

 

實現Parcelable

10. 怎麼讓在啓動一個Activity時就啓動一個service

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

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

Singleinstance 運行在另外的單獨的任務棧裏面 
Singletask 使用場景 應用的主界面 
Singletop 使用場景 新聞類應用 新聞詳情頁 能夠做爲singletop 避免在棧頂建立多個實例

比方說在激活一個新的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裏面的方法 onCreate->onStartCommand 屢次調用startService屢次執行onStartCommand stopService 
bindService () 把service 與調用者綁定 ,若是調用者被銷燬, service會銷燬 onCreate->onBind()(只會執行一次)onServiceConnected 這個會執行屢次 unbindService 
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, onStartCommand, 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. 不用serviceB頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?

這個問題問的很山寨.默認不作任何處理,B裏面的音樂都能播放. 
遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解() 
A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.

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

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

Sdk給咱們提供的方便的,帶有異步處理的service類,

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(int, Notification)方法來將service設置爲前臺狀態,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。 
若是有其餘的應用組件做爲Service,Activity等運行在相同的進程中,那麼將會增長該進程的重要性。 
1.Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做. 
2.Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做. 
3.遠程的service若是被啓動起來,能夠被屢次bind, 但不會從新create. 索愛手機X10i的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用.

18. 請描述一下Intent Intent Filter IPC RPC android中進程間通訊

Ipc inter process communication 進程間通訊 
Rpc remote processure call 遠程過程調用 
經過Intent Activity Service BroadCastReceiver 
經過AIDL rpc 調用其餘進程中的方法 
經過內容提供者 ContentProvider 
經過Socket

Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。 
經過Intent 能夠實現各類系統組件的調用與激活. 
Intent filter: 能夠理解爲郵局或者是一個信箋的分揀系統… 
這個分揀系統經過3個參數來識別 
Action: 動做 view 
Data: 數據uri uri 
Category : 而外的附加信息 
Action 匹配 
Action 是一個用戶定義的字符串,用於描述一個 Android 應用程序組件,一個 Intent Filter 能夠包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時能夠在其 節點指定一個 Action 列表用於標示 Activity 所能接受的「動做」,例如: 



…… 

若是咱們在啓動一個 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 攜帶外部數據給目標組件。在 節點中,經過 節點匹配外部數據。 
mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。以下: 

19. Intent傳遞數據時,能夠傳遞哪些類型數據?

l 通常的基本數據類型,及對應的數組 
l String及對應的數組、ArrayList 
l Serializable、Parcelable及對應的數組、ArrayList 
l 數據的uri, intent.setData() intent.getData();

20. 說說ActivityIntentService是什麼關係

麥當勞和麥當娜的關係是什麼關係?遇到這樣的問題千萬不要被繞進去,不要去真的去說他們的關係.

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

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

開啓服務用的是intent來開啓

21. 請描述一下Broadcast Receiver

廣播分兩種 有序廣播、無序廣播 
指定接收者的廣播 . 是不能夠被攔截掉的




abortBroadcast(); 
系統有不少廣播:sd卡掛載,手機重啓,廣播通知,低電量,電量改變,音樂改變、來電,來短信等…. 
手機衛士中自定義一個broadcast receiver 
sms_received

來獲取短信到來的廣播, 根據黑名單來判斷是否攔截該短信. 
畫畫板生成圖片後,發送一個sd掛載的通知,通知系統的gallery去獲取到新的圖片. 
Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse(「file://」+Environment.getExternalStorageDirectory())); 
sendBroadcast(intent); 
LocalBroadcastManager 自定義的廣播或者接收自定義廣播的接收者 儘可能使用LocalBroadcastManager 發送或註冊 避免受其它應用影響 
應用場景 開機自啓動 進程保活(接收廣播 電量變化 網絡狀態變化)

22. manifest和代碼中如何註冊和使 broadcast receiver

設置廣播接收者的優先級,設置廣播接受者的action名字 等…

詳細見工程代碼.

    <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>

 

23. 請介紹下ContentProvider是如何實現數據共享的。

經過事先約定好的協議,把本身的數據經過uri的形式共享出去。協議就是使用在uri上面的,經過uir能知道要操做的是哪個資源。

UirMatcher.add(authories ,子路徑,匹配碼) 
Content://authories/子路徑 
android 系統下 不一樣程序 數據默認是不能共享訪問 
Uri.匹配 每個路徑 對應一張表

須要去實現一個類去繼承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[]) 
}

 

24. 請介紹下Android的數據存儲方式。

數據庫 orm object relation mapping 對象關係映射 
Ormlite 反射 greendao 代碼生成器 幫你寫代碼 
Greendao效率高

操做數據插入到表中跟操做集合同樣 不須要會sql語句 
文件 
sdcard 
//包名/files/ 
Enviroment 
context.openFileInput 
openFileOutput

數據庫 sqlite <data>/<data>/包名/databases/xxx.db

SQLiteOpenHelper 
Oncreate 
表結構初始化 
Onupgrade(SQliteDatabase, olderversion, newversion) 
處理數據庫升級

Getwriteabledatabase 
SQLiteDatabase Getreadabledatabase

SharedPreference  <data>/<data>/包名/shared_prefs 經過sp保存敏感數據須要加密    能夠還原   不能拿到原文 md5 sha

可以保存數據類型 int float boolean long string set 
Sp保存對象 若是是javabean 能夠把數據轉換成json進行保存 直接存對象是不能存的 
 
網絡 socket tcp udp , http httpurlconnection

網絡存儲須要注意數據的緩存、同步、認證等一些細節

25. 爲何要用ContentProvider?它和sql的實現上有什麼差異?

ContentProvider最重要的做用就是把用戶的私有數據共享出來。

屏蔽數據存儲的細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了 
不一樣app之間共享,操做數據

Sql也有增刪改查的方法. 

可是contentprovider 還能夠去增刪改查本地文件. xml文件的讀取,更改,

網絡數據讀取更改 
Content://authories/子路徑 
Contentresolver

用沒用過數據庫 存了哪些內容 使用的時候用沒用過orm框架 
SQLiteDatabase 
SQLiteOpenHelper

26. 請介紹下Android中經常使用的五種佈局。

FrameLayout(幀佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)

FrameLayout 
從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕. 
LinearLayout 
線性佈局,這個東西,從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每個LinearLayout裏面又可分爲垂直佈局 
(android:orientation=」vertical」)和水平佈局(android:orientation=」horizontal」 
)。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。 
AbsoluteLayout 
絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x=」20px」 
android:layout_y=」12px」 
qq鬥地主 qq遊戲大廳 800*480 800*480.apk fwvga 854*480 
指定平板機型的遊戲開發中常常用到絕對佈局 widget 絕對佈局 
 
4K:4096×2160 
指定機型的平板遊戲開發機頂盒開發。. 2.3 3.0 
1. 界面佈局 任務管理器 gridview 
2. 手機 任務管理 listview

RelativeLayout 
相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有: 
相對於某一個元素 
android:layout_below=」@id/aaa」 該元素在 id爲aaa的下面 
android:layout_toLeftOf=」@id/bbb」 改元素的左邊是bbb 
相對於父元素的地方 
android:layout_alignParentLeft=」true」 在父元素左對齊 
android:layout_alignParentRight=」true」 在父元素右對齊

TableLayout


表格佈局相似Html裏面的Table。每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity=」」 。 
每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。 
oa 自動化 生成報表 ,圖標 表示

 

27. 談談UI中, PaddingMargin有什麼區別?

Margin:一個控件與另外一個控件之間的間距 
Padding:一個控件的內容與邊框之間間距

28. widget相對位置的完成在activity的哪一個生命週期階段實現。

這個題沒看懂… 
widget能夠理解成桌面小控件, 
也能夠理解成 某個button, imageview這樣的控件… 
onmeasure() // 計算 控件在屏幕上的位子、大小 
onLayout 
某個view 要顯示在界面 ondraw 被顯示到界面上的 . 
android.widget.Button

29. 請解釋下在單線程模型中MessageHandlerMessage QueueLooper之間的關係。

 

handlerThread 
①Looper和MessageQueue建立 主線程 
prepareMainLooper(); 
ThreadLocal 保存這個Looper 線程級單例 保證線程和Looper的對應關係 Looper在建立的時候建立了一個MessageQueue對象 經過Loop中的一個final成員變量保存起來

主線程不能再建立looper 
子線程要想使用消息機制 要調用Looper.Prepare()方法 new Handler(); 
②Looper.loop(); 讓消息隊列循環起來 
死循環 阻塞 ActivityThread main方法 
Msg.target.dispatchMessage(); 
③ 發消息 handler.sendMessage() sendMessageAtTime(); messageQueue.enqueueMessage() 
MessageQueue 消息隊列如何保存消息 mMessage 消息隊列的第一條消息 
Message.next屬性 
④消息的建立 Message.obtain(); 
Message.recycle() 回收消息 msg.what = 0 msg.obj = null 
Message mpool 
50條

30. AsyncTask 原理?如何使用

3.0以後默認是串行的線程池 (一次只有一個線程在執行其他任務在排隊) 
若是要並行執行 須要本身寫線程池 executeOnExecuter方法

31. 請解釋下Android程序運行時權限與文件系統權限的區別。

Android程序執行須要讀取到安全敏感項必需在androidmanifest.xml中聲明相關權限請求, 打電話,訪問網絡,獲取座標,讀寫sd卡,讀寫聯繫人等..安裝的時候會提示用戶…

文件系統的權限是linux權限. 好比說sharedpreference裏面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable 
若是建立的文件夾或目錄沒有指定權限,那麼默認繼承父目錄的權限 
 
1是,0否,最高權限111,即7,3組權限都最高,即777 
openFileInput 
openFileOutput(文件名,mode)

普通權限 Internet 藍牙 
危險權限 跟用戶隱私相關 短信 電話 通訊錄 電話記錄 sd卡 麥克風 攝像頭 bodySensor

32. 系統上安裝了多種瀏覽器,可否指定某瀏覽器訪問指定頁面?

找到對應的瀏覽器的意圖,傳遞數據URI , 激活這個意圖 

Intent intent = new Intent(); 
intent.setClassName(packageName, className); 
intent.setData(Uri) 

 


Activity 若是配置了intent-filter 或者沒有intent-filter可是設置了Exported = true 
均可以用 intent.setClassName(packageName, className); 打開 
若是沒有intent-filter 也沒設置Exported = true 只能在本身的應用中打開

33. android主線程的運用和理解。

主ui線程不能執行耗時的操做, 

34. android虛擬機的理解,包括內存管理機制垃圾回收機制。

與JVM之間的區別 
Dalvik 基於寄存器,而 JVM 基於棧。(ARM 寄存器較多 16個) 
Dalvik執行.dex格式的字節碼,而JVM執行.class格式的字節碼。android程序編譯完以後生產.class文件,還有經過aapt工具生成的R.class等,而後dx工具會把.class文件處理成.dex文件,最終資源文件和.dex文件等打包成.apk文件。

垃圾回收 
垃圾回收包含兩個過程:

斷定階段,也就是判斷哪些對象能夠被回收, 
收集階段,是指具體的回收策略。 
斷定階段主要有兩種方式

引用計數,對象每多一個引用計數加1,少一個引用計數減1,計數爲0時就表示這個對象能夠被回收了。可是引用計數有個缺點,不能判斷循環引用的狀況,因此就有了下面的方式 
根搜索,從一些根對象(GCRoot)開始遍歷搜索,若是一個對象沒法被搜索到,說明這個對象能夠被回收了。 
能夠做爲GCRoot的對象: 
1 一些虛擬機棧中的對象;2 方法區中的類靜態屬性對象;3 方法區中的常量對象;4 Native棧中JNI的引用對象 
收集階段主要有四種方式 
(mark-sweep) Android採用的垃圾回收機制 
標記清除,最簡單的算法,講標記好的對象直接清除,速度快,但效率不高,內存碎片 
複製算法,每次使用可用內存的一半,收集時將可用對象複製到另外一半內存,回收這一半

標記整理,將存活對象整理到內存區域的一端,剩餘部分回收 
(jvm) 
分代回收,將內存區域按對象存活週期劃分爲青年代和老年代等,不一樣區域採用上面不一樣的收集算法。(大部分對象建立以後很快就沒用了,每次GC回收的對象90%都是上次GC以後建立的,若是對象能夠活過一個GC週期那麼在後續幾回GC中變成垃圾的概率很小)

虛擬機很小,空間很小,談談移動設備的虛擬機的大小限制 16M 。 
談談加載圖片的時候怎麼處理大圖片的,d System.gc(); 
垃圾回收,沒有引用的對象,在某個時刻會被系統gc掉.

Dalvik與ART androidruntime

Android5.0 以前使用Dalvik虛擬機,以後使用ART虛擬機,下面是一些比較:

Dalvik在運行時將字節碼轉換爲機器碼,ART在安裝的時候就轉換爲機器碼,這樣安裝好的應用會佔用更大的空間,可是運行時少了轉換的時間,因此運行更快 
ART提供了更好的垃圾回收表現,將垃圾回收時,程序的暫停次數由兩次(分析、清理)減小到一次;程序暫停時,並行的進行垃圾回收處理;回收新近分配的、生命期短的對象,垃圾回收器花費的時間更少 
Android垃圾回收 根搜索斷定方式 標記清理的回收方式 (dalvik) art(標記清理 分帶回收) 
減小應用卡頓的方法 避免大量建立小對象 若是須要大量的小對象 能夠搞對象池 跟Message相似 16ms刷新一幀 
JVM 分代回收

35. Framework層啓動流程,

  1. 在init.rc中配置Zygote啓動參數

2.啓動Socket服務端口 
當Zygote服務從app_process開始啓動後,會啓動一個Dalvik虛擬機,虛擬機第一個執行的java類就是ZygoteInit.java,該類第一個重要的工做就是啓動一個Socket服務端口,該Socket端口用於接收啓動新進程的命令。

3.加載preload-classes 
在Zygote類的main()函數中,建立完Socket服務端後還不能當即孵化出新的進程,由於這個「卵」尚未必須的「核酸」,這個「核酸」就是指預裝的Framework大部分類及資源。

4.加載preload-resources 
preload-resources包含兩類資源,一類是drawable資源,一類是color資源。加載這些資源是在preloadResource()函數中完成的,該函數調用preloadDrawable()和preloadColorStateLists()加載這兩類資源,原理就是把這些資源讀出來放到一個全局變量中,只要該類對象不被銷燬,這些全局變量就會一直保存。 
啓動java虛擬機

Zygote進程中 包含了 socket服務端 預加載的framework層的類和資源(圖片 color) 
Fork 分叉出第一個進程 SystemServer

5.使用fork啓動新的進程 
fork是Linux系統的一個系統調用,做用就是複製當前進程產生一個新的進程。除了進程id不一樣,新進程將擁有和原始進程徹底相同的進程信息。進程的信息包括該進程所打開的文件描述符列表、所分配的內存等。當新進程被建立後,兩個進程將共享已經分配的內存空間,若是其中一個須要向內存中寫入數據時,操做系統才複製一份目標地址空間,並將要寫的數據寫入到新的地址中。這種「僅當寫的時候才複製」的機制能夠最大限度的在多個進程中共享物理內存。

SystemServer 進程是如何啓動的? 
SystemServer進程是Zygote孵化出的第一個進程,而後再配置SystemServer進程的環境。

1.啓動各類系統服務線程 
SystemServer進程在Android運行環境中扮演了「神經中樞」的做用,APK應用中可以直接交互的大部分系統服務都在該進程中運行,常見的有WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms),這些系統服務都是以一個線程的方式存在於SystemServer進程中。

2.啓動第一個Activity 
當以上服務線程都啓動後,其中Ams服務是systemReady()調用完成最後啓動的,在Ams的systemReady()函數的最後一段代碼則發出了啓動任務隊列中最上面一個Activity消息。

在Ams的startHomeActivityLocked()中,系統發出了一個category字段包含CATEGORY_HOME的intent,代碼以下:

intent.setComponent(mTopComponent); 
if(mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL){ 
intent.addCategory(Intent.CATEGORY_HOME); 
}

 

只要應用聲明本身可以響應該Intent,那麼就能夠被認爲是Home程序。當系統中有多個程序可以響應該Intent時,系統會彈出一個對話框,讓用戶選擇啓動哪一個程序,也容許用戶記住該選擇。 
到此第一個Activity就啓動了。

Init.c 解析init.rc 以服務的形式啓動zygote進程 
zygoteInit.java 
Zygote進程中 包含了 socket服務端 預加載的framework層的類和資源(圖片 color) 建立dvm/art 
分叉一個進程 systemserver 啓動各類系統的服務 systemReady 
startHomeActivityLocked()啓動launcher

36. android自己的一些限制,好比apk包大小限制,讀取大文件時的時間限。

64k方法數限制 多dex 65536 
Java->.class->dex 
Class1.dex 
Class2.dex

64k方法數包括你本身寫的方法 也包括引入的三方庫的方法 
三方庫精簡方法數 progard混淆 能夠避免64k方法問題

這個問題問的有問題, apk包大小限制很差說, 
極品飛車有100M 仍是能裝到手機上, 
世面google market 上大程序 主程序 很小 5~10M 下載sdcard 
15分鐘以內 申請退款 
apk包,精簡包, 素材存放在服務器. 遊戲程序.

.class->.dex 一個dex最多包含64k個方法

Multidex 多個dex 減小方法數 
①引入別人jar包的時候 能夠只用本身有用的部分

64k 分包 方法數不能超過65536個 multidex 
Android Dalvik 可執行文件.dex中的java方法數不能超過64k 
單個.dex文件最多能引用的方法數是65536個 
AndroidFramework 和第三方函數庫以及APP自身的方法

解決方法: 
5.0以前 (api level 21) 拆分dex classes.dex主文件 
Google MultiDex Support Library 
/extras/android/support/multidex/目錄中找到 
5.0以後 art 支持從apk文件中加載多個.dex

儘可能避免 64k 三方的庫 能夠只使用有用的部分 
Proguard混淆

37. 如何加載的音樂信息,如何改善其效率。

Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統的數據庫表中,能夠經過content provider獲取,

顯示出來,改善效率,是個常見問題, 能夠從如下幾個方面做答, 
分批加載數據, 延時加載數據, 合理使用緩存等…

38. ListView如何提升其效率?

複用convertview , 歷史的view對象 
減小子孩子查詢的次數 viewholder 
異步加載數據, 分頁加載數據, 
使用靜態的view對象 避免建立過多的view.

減小加載item的時間 
緩存 
異步 
延遲加載

用空間換時間

16ms 刷新一次 60fps

39. 啓動應用後,改變系統語言,應用的語言會改變麼?

Intent.ACTION_LOCALE_CHANGED 
i18n 
在工程res文件下添加對應語種的values文件,ar:阿拉伯語, en:英語 zh_rCN: 簡體中文 
在strings.xml和arrays.xml須要國際化的字符串進行相應得翻譯 

//應用內配置語言 
Resources resources =getResources();//得到res資源對象 
Configuration config = resources.getConfiguration();//得到設置對象 
DisplayMetrics dm = resources.getDisplayMetrics(); 
config.locale = Locale.SIMPLIFIED_CHINESE; //簡體中文 
resources.updateConfiguration(config, dm);

 

40. 啓動一個程序,能夠主界面點擊圖標進入,也能夠從一個程序中跳轉過去,兩者有什麼區別?

Intent mIntent = new Intent(); 
mIntent.setClassName(「com.android.calculator2」,」com.android.calculator2.Calculator」); 
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(mIntent);

 

41. Android程序與Java程序的區別?

簡單地說,一種是操做系統,一種是開發語言。具體來講,Android是一種基於Linux的開放源碼操做系統,主要用於便攜設備(智能手機,平板電腦)。Java是一種面向對象的編程語言,它的最大的特色就是開源和免費,這由於如此,中國的大部分大型的軟件系統是用Java開發的。 
Android和Java的聯繫: 
Android的應用層上的應用程序是用Java編寫的,以Java做爲開發語言,可是,Java並不等同於Android,由於Android SDK引用了Java SDK的大部分,少數部分被Android SDK所拋棄。 
因此,要想從事Android的開發,就必須有Java基礎。 
Android程序用android sdk開發,java程序用javasdk開發. 
Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt swing package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。

將Java 遊戲或者j2me程序移植到Android平臺的過程當中, 
Android SDK 與Java SDK的區別是很須要注意的地方。

42. 手寫一個單例模式,能不能保證使用時對象的惟一性

a、餓漢式和懶漢式 
b、這兩種方法都不能保證使用時對象的惟一性。好比,當對象是可序列化的,保存對象到本地後,每次反序列化都是生成了一個新的對象。 
c、最好的實現單例模式的方案爲,編寫一個包含單個元素的枚舉。程序員沒法本身new出枚舉對象,保證了只能有一個對象。同時枚舉的序列化機制也不會在反序列化時建立出新的對象,保證對象的惟一性。Enum{ 

工廠 
簡單工廠 
工廠方法 
抽象工廠 
模板 適配器 裝飾

43. 如何避免OOM

a. 圖片過大致使OOM 
Android 中用bitmap時很容易內存溢出,好比報以下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。 
解決方法: 
方法1: 等比例縮小圖片 BitmapFactory.Options inSamplesize = 2 
方法2:使用LruCache機制管理圖片。限制圖片的內存上限,並及時地進行recyle()操做 提升效率 節省流量 
方法3:使用加載圖片框架處理圖片,如專業處理加載圖片的ImageLoader圖片加載框架。 
服務端控制: ①確保下載的每一張圖片都符合ImageView控件的大小 200*100 150*75 (ImageServer 處理圖片服務器) 
②低流量模式 2g 3g 
③急速模式 不加載圖片 使用默認佔位圖 
b.界面切換致使oom 
c.查詢數據庫沒有關閉cursor 
d.內存泄露致使oom

子線程加載數據 activity開子線程 及時退出線程 
子線程代碼執行完了 線程自動會被回收 
While(flag&&) 
static handler泄露 
Context泄露 
一個應用幾個上下文 
Application Activity Service

largeHeap = true 
多個進程 
申請native堆 malloc 突破dalvik的限制 
OOM緣由 java虛擬機 要申請的內存<可用堆內存 dalvik/art大小固定的 6G內存

避免OOM 
①代碼 圖片壓縮 資源釋放 handler/匿名內部類 使用的時候要注意若是有長時間執行的任務當組件銷燬時須要退出未執行完的任務 
②服務器配合 圖片能夠返回多種尺寸 列表中加載小圖 
③ 增長本身應用堆內存的佔用量 清單文件 largeHeap 多個進程 申請native堆

44. dvm的進程和Linux的進程, 應用程序的進程是否爲同一個概念

a、每一個dvm虛擬機都是linux裏面的一個進程. 
b、dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面, 
c、三個進程不是一個概念,可是在使用中因爲一個dvm虛擬機就是一個linux進程,同時一個虛擬機只運行一個應用,因此也默認三者是同一個能夠統一使用。

45. 開發過程當中使用到哪些自定義控件

pull2RefreshListView 下拉刷新 
LazyViewPager 只加載當前頁 
SlidingMenu 側欄菜單 
ToggleButton 滑動的開關

View/ ViewGroup繪製 
測量 onMeasure onMeasure 
佈局 onLayout 
繪製 onDraw

動畫 
touch事件 
Activity->ViewGroup->View 
一個touch事件 由一個down 0~n個move 一個up組成 down事件比較重要的 
dispatchTouchEvent 
onInterceptTouchEvent 
onTouchEvent

ViewGroup 的onTouchEvent down返回true onInterceptTouchEvent 攔截了move事件 move 和up都由ViewGroup處理 
View 的onTouchEvent down返回 true cancel事件 
requestDisallowInterceptTouchEvent 請求不攔截 只對move和up有效

46. 如何判斷是否有SD卡?

配置文件中有sd卡的權限, 經過environment的靜態方法, 
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

47. 項目如何向低版本兼容

a、樣式兼容: 
(1)使用兼容包中的樣式,如v7\v4 中的Compat 相關樣式。 
(2)定義多個不一樣value文件夾,不一樣版本指定不一樣樣式。 
b、佈局兼容: 
定義多個不一樣layout-verson(verson爲版本數字) 的文件夾,不一樣版本指定不一樣的佈局文件。 
c、高版本代碼兼容方式: 
(1)儘可能使用兼容包中的API,如getSupportActionBar, getSupportFragmentManager() 等。 
(2)使用系統Version 來判斷,使低版本系統不能執行高版本代碼。同時使用 @TargetApi 來消除eclipse、AS 等工具報錯。 
Dimens 經常使用分辨率 1280 720 1920*1080 2k 2560 1440 16:9屏幕 
底部虛擬按鍵 佔用屏幕分辨率 1800*1080

48. 介紹一下你的項目架構

架構是程序的骨架,肯定了整體的接口,要求具體的子類實現細節處理。並非非要用到反射、註解等高級技術才能叫架構。 
a、界面架構 BaseActivity,BaseFragmen。拆解onCreate過程爲initView、initListener、initData 
b、網絡架構 volley 13年穀歌開發大會 okhttp 14年 android-async-http 
c、圖片、文件、數據庫等數據數據管理架構 orm greendao ormLite 
BitmapFun sample

Picasso 
Fresco 
Android-universal-Image-Loader

49. 談談對Android NDK的理解。

大公司/金融相關/硬件

圖片處理/視頻 / 登錄 密碼的加密/ fork 進程 作推送進程的保活 
美圖秀秀 
看懂別人寫的c 須要傳遞的參數

Jni java->c 
處理圖片的方法( 接收兩個參數 一個是int類型數組的指針 數組的長度) 
Bitmap-> int[] ->jni javaint類型數組 -> c int* jni.h 
processPic(int*p , int length);

Jni.h 結構體 jniNativeinterface 定義了一系列函數指針 函數指針 ① java基本數據類型和C基本數據類型的相互轉換 ② c 經過反射的方式 回調java方法 操做java類的成員變量

聲明本地方法 native 
Android.mk 
Application.mk

本地方法命名規則 Java_包名類名本地方法名(JNIEnv* , jobject) jclass

native develop kit 只是一個交叉編譯的工具 .so 
Jni 推送進程保活 推送 後臺開一個service 維持一個跟服務端的長鏈接 tcp 10 30分鐘(心跳包) 
fork c進程 
保活聯盟 極光 百度 個推 信鴿 友盟 /華爲 小米 走系統的通道 透傳/非透傳 收到推送以後的操做 只能調用api指定的方法

TabHostActivity 3.0過期 
金融類 
可逆 dex (手機的用戶信息) 不可逆 md5 sha (用戶名 密碼) 
不可逆 md5 sha 不能獲取原文 密碼的保存 
可逆 des 能夠獲取原文 
對稱 非對稱 
購物類應用 訂單提交到服務端 加密 可逆加密 
用戶名 密碼 不可逆

1.何時用ndk,  實時性要求高,遊戲,圖形渲染,  opencv (人臉識別) , ffmpeg , rmvb  mp5 avi 高清解碼. ffmpeg, opencore.

2.爲何用ndk

咱們項目中那些地方用到了ndk,

進程保活 長鏈接通常都在service裏 保證service不被殺死 或者說 殺死了能再啓動起來 
廣播接收者 接受系統廣播 開機 網絡變化 應用卸載安裝 電量變化 
經過forkC進程 作進程守護 jni 5.0一下有效 40% 
註冊推送服務 收到推送觸發操做 小米/華爲 
保活聯盟

50. 談談Android的優勢和不足之處。

一、開放性,開源 ophone 阿里雲( 徹底兼容android) 
二、掙脫運營商束縛 
三、豐富的硬件選擇 mtk android 
四、不受任何限制的開發商 
五、無縫結合的Google應用

缺點也有5處: 
一、安全問題、隱私問題 
二、賣手機的不是最大運營商 
三、運營商對Android手機仍然有影響 
四、山寨化嚴重(碎片化) 
五、過度依賴開發商,缺少標準配置

51. Android系統中GC什麼狀況下會出現內存泄露呢?視頻編解碼/內存泄露

檢測內存泄露 工具 
Leakcanery 
致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放。若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器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引用這些對象。 
Oncreate)(){ 
New Thread(){ 
Run(){ 
While(true){ 
} 
} 
}.start(); 
}

 

Java 內存泄露的根本緣由就是 保存了不可能再被訪問的變量類型的引用

52. Android UI中的View如何刷新。

在主線程中 拿到view調用Invalide()方法 
在子線程裏面能夠經過postInvalide()方法; 

View view; 
view.invalidate();//主線程 
view.postInvalidate();//子線程 
requestLayout();

 

53. 簡單描述下Android 數字簽名。

Android 數字簽名 
在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係 
Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。 
這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。 
同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。 
(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。

(2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。 
在簽名時,須要考慮數字證書的有效期: 
(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。 
(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。 
(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。 
Android數字證書包含如下幾個要點: 
(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序 
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證 
(3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。 
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。

54. 什麼是ANR 如何避免它?

在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。

耗時的操做 worker thread裏面完成, handler message…AsynTask , intentservice.等…

55. android中的動畫有哪幾類,它們的特色和區別是什麼?

幀動畫, 補間動畫, 屬性動畫; 
l 幀動畫(Frame Animation)通常用於圖片的切換,實現生成連續的gif圖效果 
l 補間動畫(Tween Animation)分爲平移(Translate)、旋轉(Rotate)、縮放(Scale)、不透明度(Alpha);補間動畫只是改變了View的顯示效果 
l 屬性動畫(Property Animation),Android3.0 (API11)及之後出現的功能,3.0以前的版本可以使用github第三方開源庫nineoldandroids.jar進行支持。支持對全部View能更新的屬性的動畫,如translationX水平平移, translationY豎直平移,alpha透明度, left左邊位置, rotation旋轉角度, scale縮放等, 
l 屬性動畫不只能實現補間動畫的全部效果,並且是對view或任意對象的屬性的不斷進行的值操做。好比一個Button的位移,補間動畫只是重繪了view,並無真正的去改變Button的位置,點擊事件仍是停留在原來的位置,而屬性動畫就是在真正改變Button的位置;

56. 說說mvc/mvp模式的原理,它在android中的運用。

a、MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。 
b、Android裏MVC模式的使用隨處均可以見到。最基本的就是控件對象,xml佈局文件,Activity類。以及數據集合,ListView,Adapter。

57,java中的soft reference是個什麼東西

a、StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收 
b、SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存 
c、WeekReference 在每次GC時都被回收 
d、在之前的開發裏,圖片的緩存多數使用軟引用,保證內存不足時圖片可以及時被回收。在Android2.3版本以後軟引用的功能被修改成弱引用同樣,致使圖片老是要不斷從新加載,性能不好。新的圖片緩存實現都是LruCache機制。

58,說說LruCache底層原理

a、LruCache使用一個LinkedHashMap簡單的實現內存的緩存,沒有軟引用,都是強引用。若是添加的數據大於設置的最大值,就刪除最早緩存的數據來調整內存。 
b、經過構造方法初始化的maxSize值,它表示這個緩存的最大值是多少。通常都是可用的內存大小的八分之一, Runtime.getRuntime().maxMemory() / 8, 
c、插入圖片時首先會判斷插入後的size大小是否超過maxSize,若是超過了,就刪除最長時間未使用的緩存。這個操做將一直循環下去,直到size比maxSize小或者緩存爲空。

59,udp鏈接和TCP的不一樣之處 http

Tcp/ip 協議族 
4層 http 應用層協議 tcp/udp ip 物理 
http socket 
http 提交方式 7種 trace delete put head option 
經常使用的2種 get post 
Get 參數經過url拼接 長度限制 瀏覽器限制 2k~8k 
Post 經過請求體 以流的形式傳到服務端 
響應碼 200 302 304 404 500 206 Range 
UDP 
l 將數據及源和目的封裝成數據包中,不須要創建鏈接 
l 每一個數據報的大小在限制在64k內 
l 因無鏈接,是不可靠協議 
l 不須要創建鏈接,速度快

TCP 
l 創建鏈接,造成傳輸數據的通道 
l 在鏈接中進行大數據量傳輸 
l 經過3次握手完成鏈接,是可靠協議 
l 必須創建鏈接,效率會稍低

UDP應用:視頻會議、聊天程序、桌面共享等對於一些丟失數據不是很重要的軟件,相似於生活中的對講機 
TCP 應用:下載,相似現實生活中的打電話 
http->TCP->IP->底層硬件協議

TCP/UTP 流的傳輸 http 對流的封裝 rtsp 直播的協議

60, android開發中怎麼去調試bug

邏輯錯誤 
1.斷點 debug 
2. logcat

Wiki 
知識庫 
接口文檔 
業務流程說明

Jira(分配任務 監督任務進度 處理bug 跟進bug狀態) 
沒法復現 
已解決 
之後解決 
沒法解決 
關閉任務 
開始處理 
從新打開

bug重開數據 1 a b c d

分配任務 

61.service裏面能夠彈土司麼

能夠

62.手寫算法

a、通常面試考察的都是計算機入門的基本算法,好比排序和查找,而且會要求在紙上手寫Java代碼或僞代碼。 
b、排序最基礎的是冒泡排序。若是可使用快速排序,能夠認爲學習能力優秀。 
c、查找最基礎的算法是有序數組的折半查找。 
d、對於複雜的測試,好比讓現場寫一個自定義控件。能夠分析一下實現思路,儘可能不要在現場寫代碼,除非有極大的把握完成。第一思路不清晰,不必定能實現出來,第二實現過程當中不免會有不少bug,在現場環境下會極大的打擊自信。工做裏都是一週以上才能完成一個自定義控件,並非像咱們上課,一天能夠寫好幾個。。。 
//繼承view 
//

63. JNI調用經常使用的兩個參數

JNIEnv *env, jobject javaThis

64. 書寫出android工程的目錄結構

src 
android. jar 
asset 
res 
gen 
manifest

65. 利用mvc的模式重構代碼

1) 重構前的代碼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()中; 

// 聲明 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)應該寫在哪裏,最終使維護和擴展代碼變得更加容易! 
其實,重構很簡單,通讀代碼,感受哪邊不太爽,就改那邊吧!(我目前的感覺) 
一個良好的代碼應該是能讓人感到舒服的!

2) 重構後的代碼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);

        }

    }

};

}

 

66. Android都有哪些解析數據的方法,你一般用哪一種,說說它們的優缺點。

xml 
l DOM 
l SAX 
l Pull 
json 
Google Gson

67. Application類的做用

l 查看文檔:Application類是爲了那些須要保存全局變量設計的基本類 
l android框架的一個系統組件 
l 單例 
l 生命週期最長

68. 描述一下Android的系統架構

 

/** 
圖片下載接口 
*/ 
public class ImageLoader { 
ImageCache mCache = new MemoryCache(); 
public void loadImage(String url, ImageView imageView){ 
Bitmap bmp = mCache.get(url); 
If(bmp == null){ 
//異步加載圖片並緩存 
}else{ 
imageView.setImageBitmap(bmp); 
} 
} 
}

Public interface ImageCache { 
Public Bitmap getPic(Sring url); 
Public void getPicFroSdcard(Sring url,Bitmap bmp); 
}

 

須要背出來的一些經典例子

寫一個單例

public class Singlton {

private static final Singlton instance = new Singlton();

 

private Singlton() {

 

}

 

public static Singlton getInstance() {

    return instance;

}

}

 

菲波那契數列(Fibonacci

求Fibonacci數列:1,1,2,3,5,8,…第40個數的值。 

public static int fibonacci(int n) { 
if (n == 1 || n == 2) { 
return 1; 
} else { 
return fibonacci(n - 1) + fibonacci(n - 2); 
} 
}

 

打印菲波那契數數列(Fibonacci)

如n = 6,則順序打印出6個Fibonacci數列:1, 1, 2 ,3, 5, 8 

public static void printFibonacci(int n) { 
int f1 = 1; 
int f2 = 1; 
for (int i = 0; i < n; i++) { 
if (i < 2) { 
System.out.print(「1, 「); 
} else { 
int temp = f1; 
f1 = f2; 
f2 = temp + f2; 
System.out.print(f2 + 「, 「); 
} 
} 
}

 

冒泡排序法(BubbleSort)

public static int[] bubbleSort(int[] arr) { 
for(int i = arr.length -1;i > 0; i–){ 
for(int j = 0; j < i; j++) { 
if(arr[j] > arr[j+1]) swap(arr, j, j+1); 
} 
} 
return arr; 
}

private static void swap(int[] arr, int i, int j) { 
int temp = arr[i]; 
arr[i] = arr[j]; 
arr[j] = temp; 
}

 

n的階乘(Factorial)

隨便給一參數n,n不小於0,假如n=3,則算出1 * 2 * 3 = 6,如n=5,則算出1 * 2 * 3 * 4 * 5 = ? 

public static int factorial(int n) { 
if (n == 1) { 
return 1; 
} else { 
return n * factorial(n - 1); 
} 
}

 

三方登陸 sharesdk 友盟 微信 微博 QQ QQ空間 支付 
Oauth認證 當前應用到要登陸的應用上 註冊 申請一個appkey 
發起三方登陸 打開微博的登陸界面 用戶輸入用戶名 密碼 而且把權限 appkey 一塊兒傳到微博的服務端 
令牌 token 返回當前應用 token(用戶 權限)令牌有有效期

須要把答案准備好的非技術題:

l 請自我介紹一下 
l 爲何辭職(公司的項目完成了,沒新東西能夠作了。外包公司裏面對項目質量要求不高,上線太快,學習不到西。 以前在其它地方工做, 以爲北京發展更大) 
l 職業生涯規劃 
l 說說你的優勢 
l 說說你的缺點 
l 平時怎麼學習的,用什麼時間學習,上什麼網站、看什麼書 www.google.com stackoverflow github csdn http://android-developers.blogspot.com/ android開發週報 
l 你有什麼須要問個人嗎 
l 指望薪資(外包公司 沒有年終獎 避稅)(避稅 差很少全額公積金) 
基本工資 30% 績效工資 
大公司 年終獎 1~3個月

l 你瞭解過咱們公司嗎 
小公司 創業公司 比較關心項目 
大公司 基本不看項目 
若是是計算機科班畢業 工做年限不長 數據結構算法 java基礎 
若是工做年限比較久 也不是計算機相關專業 數據結構算法 java基礎問道這些知識點兒機率會低一些

日活 下載量越大的應用下載的數據和日均活躍用戶的數據越靠近 
靠什麼掙錢

總結

關於項目 
在就是你項目經驗,必定要突出你遇到什麼難點,而後是怎麼解決的!把問題引導到你熟悉的領域,或者知識點上,儘可能將每一個技術點細節凸顯出來,

面試時間通常是30分鐘 
回答問題的時候,儘可能多說一些,相關知識點,往項目

答筆試題的時候,能夠手機百度。

心態

什麼樣的面試官都有,去面試的時候要作好一切心理準備,無論是技術仍是基礎都得紮實。一我的的交談能力也很重要,總之不是很是標準的普通話, 最起碼你說的得讓別人聽得懂,並且得把面試官講得很是完全,這樣你得到offer的機會更大,談工資也有優點~~

Devstore

簡歷準備 項目的個數 時間 每一個項目之間間隔不要超過一個月 能夠有迭代(最好有迭代) 
注意技術點 ①提到的技術點 必定會說 ②項目中用到的技術點時間

迭代 ①加功能 ②改bug ③UI調整(改版) ④重構 小團隊 3人左右 1個月一版

投簡歷 若是沒有電話 
安排面試 
面試結束 及時記錄問題 及時修復問題 若是面試了10家左右仍是沒有offer 
面試過程的非技術問題

簡歷

面試安排  面試過程

相關文章
相關標籤/搜索