android面試,那些年我們遺忘的基礎(chǔ)

1.什么是Activity?問的不太多,說點(diǎn)有深度的

四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activity

setContentView() ,// 要顯示的布局

, activity 是Context的子類,同時實(shí)現(xiàn)了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.

button.setOnclickLinstener{

}

我開發(fā)常用的的有ListActivity, PreferenceActivity ,TabAcitivty等…

PreferenceActivity與設(shè)置有關(guān)的activity

TabActivity就是有一個Tabhost

如果界面有共同的特點(diǎn)或者功能的時候,還會自己定義一個BaseActivity.

界面的初始化,進(jìn)度對話框的顯示與銷毀doubanservice

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

生命周期描述的是一個類 從創(chuàng)建(new出來)到死亡(垃圾回收)的過程中會執(zhí)行的方法..

在這個過程中 會針對不同的生命階段會調(diào)用不同的方法

Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時會激發(fā)相應(yīng)的回調(diào)方法,這些回調(diào)方法包括:oncreate ondestroy onstop onstart onresume onpause

其實(shí)這些方法都是兩兩對應(yīng)的:

onCreate創(chuàng)建與onDestroy銷毀;

onStart可見與onStop不可見;

onResume可編輯(即焦點(diǎn))與onPause;

對話框是activity的一部分.

所以對話框的彈出,指定上下文必須是 Activity.this

所以彈出對話框(對話框獲取焦點(diǎn))不會調(diào)用任何生命周期方法

這6個方法是相對應(yīng)的,那么就只剩下一個onRestart方法了,這個方法在什么時候調(diào)用呢?

答案就是:在Activity被onStop后,但是沒有被onDestroy,在再次啟動此Activity時就調(diào)用onRestart(而不再調(diào)用onCreate)方法;

如果被onDestroy了,則是調(diào)用onCreate方法。

最后講自己項(xiàng)目中的經(jīng)驗(yàn),比如說豆瓣客戶端每次進(jìn)入某個界面的時候都要看到最新的數(shù)據(jù),這個刷新列表的操作 就放在onStart()的方法里面.

fillData() 這樣保證每次用戶看到的數(shù)據(jù)都是最新的.

多媒體播放, 播放來電話.

onStop() 視頻聲音設(shè)置為0 , 記錄視頻播放的位置 mediaplayer.pause();

onStart() 根據(jù)保存的狀態(tài)恢復(fù)現(xiàn)場. mediaplayer.start();

在讀文檔的時候 還發(fā)現(xiàn) activity還有兩個方法 onPostResume() 和 OnPostCreate()這兩個生命周期的方法,不過開發(fā)的時候沒有用到過.

這倆方法一般開發(fā)是用不到,是給框架使用的,在onResume和onCreate方法之前調(diào)用

3.兩個Activity之間跳轉(zhuǎn)時必然會執(zhí)行的是哪幾個方法。

一般情況比如說有兩個activity,分別叫A,B ,當(dāng)在A里面激活B組件的時候, A 會調(diào)用 onPause()方法,然后B 調(diào)用onCreate() ,onStart(), OnResume() ,

這個時候B覆蓋了窗體, A會調(diào)用onStop()方法.如果B呢 是個透明的,或者是對話框的樣式,就不會調(diào)用onStop()方法

4.橫豎屏切換時候Activity的生命周期。

這個生命周期跟清單文件里的配置有關(guān)系

1、不設(shè)置Activity的android:configChanges時,切屏?xí)匦抡{(diào)用各個生命周期

默認(rèn)首先銷毀當(dāng)前activity,然后重新加載

onpause onstop ondestory oncreate onstart onresume

2、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

Api13以上還需要給configChanges配置screensize一個值

游戲開發(fā)中, 屏幕的朝向都是寫死的. 因?yàn)槿绻梢郧袚Q橫豎屏,那么用戶體驗(yàn)不好,而且還要保持游戲相關(guān)數(shù)據(jù),比較消耗時間性能。

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

可以自定義一個activity的樣式,style中增加theme:

新建一個Theme,指定他的parent為android:Theme.Dialog,然后Activity添加這個theme即可。

6.你后臺的Activity被系統(tǒng) 回收怎么辦?如果后臺的Activity由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?

除了在棧頂?shù)腶ctivity,其他的activity都有可能在內(nèi)存不足的時候被系統(tǒng)回收,一個activity越處于棧底,被回收的可能性越大.

當(dāng)activity被系統(tǒng)異?;厥諘r調(diào)用onSaveInstanceState方法

protectedvoidonSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putLong("id", 1234567890);

}

publicvoidonCreate(Bundle savedInstanceState) {

//判斷 savedInstanceState是不是空.

//如果不為空就取出來

super.onCreate(savedInstanceState);

}

7.如何退出Activity?如何安全退出已調(diào)用多個ActivityApplication?

應(yīng)用場景,例如UC瀏覽器,你打開了100個頁面,然后通常做法是點(diǎn)擊返回,點(diǎn)擊100次才能正常退出Application。這樣用戶體驗(yàn)太差,UC瀏覽器的菜單提供了退出按鈕,點(diǎn)擊退出即可安全退出應(yīng)用。

退出activity 直接調(diào)用 finish () 方法 . //用戶點(diǎn)擊back鍵 就是退出一個activity

退出activity 會執(zhí)行 onDestroy()方法 .

做法:

1、拋異常強(qiáng)制退出:測試沒通過?

該方法通過拋異常,使程序Force Close。 Force close,系統(tǒng)會清空我們的任務(wù)棧,清空所有打開的界面。

驗(yàn)證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出Force Close的窗口。

//安全結(jié)束進(jìn)程android.os.Process.killProcess(android.os.Process.myPid());

2、記錄打開的Activity:

思路:

每打開一個Activity,通過就記錄下來。手動退出時,就移除集合。點(diǎn)擊退出按鈕時,循環(huán)關(guān)閉集合中的Activity。

步驟:

定義MyApp 繼承Application,然后再清單文件中給Application節(jié)點(diǎn)指定name為MyApp。

定義成員變量List lists ;

在生命周期方法onCreate方法中初始化:lists = new ArrayList();

每一個activity在執(zhí)行onCreate()方法的時候 lists.add(this);

Ondestory() lists.remove(this);

當(dāng)點(diǎn)擊退出按鈕時,循環(huán)關(guān)閉集合中的activity

for(Activity activity: lists)

{

activity.finish();

}

3、發(fā)送特定廣播:

在需要結(jié)束應(yīng)用時,發(fā)送一個特定的廣播,每個Activity收到廣播后,關(guān)閉即可。

//給某個activity 注冊接受接受廣播的意圖

registerReceiver(receiver, filter)

//如果過接受到的是 關(guān)閉activity的廣播就調(diào)用finish()方法 把當(dāng)前的activity finish()掉

4、遞歸退出(不推薦)

在打開新的Activity時使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。

404 退出程序

OnActivityResult();

*講一講你對activity的理解 (有些公司會出一些這種題目,對xxx的理解)

把自己的心得寫出來即可。

Activity用于與用戶交互。

在講一講Activity的生命周期,可以利用這些生命周期方法做初始化,

例如:進(jìn)入某個界面的時候都要看到最新的數(shù)據(jù),就要在onstart方法內(nèi)填充數(shù)據(jù)。

還有處理橫豎屏?xí)r,Activity會摧毀重構(gòu),我們在特殊場景需要做特殊處理,

例如:播放器,正播放時,打入電話,我們需要在onstop方法保存播放進(jìn)度,然后再onstart方法內(nèi)讀取進(jìn)度,繼續(xù)播放。

游戲,固定橫豎屏。

簡單介紹onPostResume() 和 OnPostCreate

Activity被系統(tǒng)回收時,需要做的一些操作:重寫onSaveInstanceState

打開多個Activity,如何安全退出Application

8. service是否在main thread中執(zhí)行, service里面是否能執(zhí)行耗時的操作?

默認(rèn)情況,如果沒有顯示的指定service所運(yùn)行的進(jìn)程, Service和activity是運(yùn)行在當(dāng)前app所在進(jìn)程的main thread(UI主線程)里面

service里面不能執(zhí)行耗時的操作(網(wǎng)絡(luò)請求,拷貝數(shù)據(jù)庫,大文件 )

在子線程中執(zhí)行 new Thread(){}.start();

特殊情況,可以在清單文件配置 service 執(zhí)行所在的進(jìn)程 ,

讓service在另外的進(jìn)程中執(zhí)行

"cn.itcast.xxx">

9.兩個Activity之間怎么傳遞數(shù)據(jù)?

通過Intent傳遞數(shù)據(jù):

基本數(shù)據(jù)類型可以通過Intent 傳遞數(shù)據(jù)

extras.putDouble(key,value)

intent.putExtra(name, value)

傳遞Bundle對象

Bundle bundle = newBundle();

bundle.putShort(key, value);

intent.putExtras(bundle);

獲取數(shù)據(jù)

獲取到激活他的Intent:

Intent intent = getIntent();

Bundlebundle= intent.getExtras();

Bundle類似map的集合 ,存放鍵值對

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

通過Application傳遞數(shù)據(jù)

自己去實(shí)現(xiàn)自己的application的這個類,基礎(chǔ)系統(tǒng)的application ,每個activity都可以取到

利用這點(diǎn),我們可以在Application 定義全局變量 ,然后通過這個變量來存儲數(shù)據(jù)。

讓對象實(shí)現(xiàn) implementsSerializable接口把對象存放到文件上.

讓類實(shí)現(xiàn)Serializable接口,然后可以通過ObjectOutputStream//對象輸出流

File file =newFile("c:\\1.obj");

FileOutputStream fos=newFileOutputStream(file);

ObjectOutputStream oos =newObjectOutputStream(fos);

Student stu =newStudent();

stu.setId("10001");

stu.setName("zs");

oos.writeObject(stu);

FileInputStream fis =newFileInputStream(file);

ObjectInputStream ois =newObjectInputStream(fis);

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

System.out.println(stu1.getName());

Parcelable和Serializable

谷歌工程師認(rèn)為,將文件通過Serializable序列化到文件,然后再讀取文件內(nèi)容加載到內(nèi)存,太浪費(fèi)資源,就重寫了Serializable,搞了一個Parcelable

Parcelable把對象序列化到android操作系統(tǒng)的一塊公用的內(nèi)存空間,直接操作內(nèi)存,所以效率會比較高。

Intent傳遞數(shù)據(jù)的引用 (大資源文件,都是通過uri方式傳遞)

intent.setData(Uri)

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

contentResolver.getInputStream(uri);//獲取uri對應(yīng)的流

10.怎么讓在啟動一個Activity是就啟動一個service?

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

11.同一個程序,但不同的Activity是否可以放在不同的Task任務(wù)棧中?

比方說在激活一個新的activity時候, 給intent設(shè)置flag

Intent的flag添加FLAG_ACTIVITY_NEW_TASK單獨(dú)的任務(wù)棧

這個被激活的activity就會在新的task棧里面…

也可以通過配置文件:android:launchMode="singleInstance"

Intent intent = new Intent(A.this,B.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

service、broadCastReceiver開啟Activity,因?yàn)樗麄兡J(rèn)沒有任務(wù)棧,所以需要設(shè)置flag。設(shè)置這個Flag之后,在開啟Activity時,會判斷當(dāng)前有木有存在任務(wù)棧,如果有則直接用,沒有則創(chuàng)建。

12. Activity怎么和service綁定,怎么在activity中啟動自己對應(yīng)的service?

startService() 一旦被創(chuàng)建就與調(diào)用著無關(guān) ,沒法使用service里面的方法

bindService () 把service 與調(diào)用者綁定 ,如果調(diào)用者被銷毀, service會銷毀

bindService() 我們可以使用service 里面的方法

bindService().讓activity能夠訪問到 service里面的方法

綁定service的步驟:

構(gòu)建一個intent對象,

Intent service = new Intent(this,MyService.class);

通過bindService的方法去啟動一個服務(wù),

bindService(intent, new MyConn(), BIND_AUTO_CREATE);

(MyConn)ServiceConnection 對象(重寫onServiceConnected和OnServiceDisconnected方法)

BIND_AUTO_CREATE.:如果這個服務(wù)沒有開啟過,則自動開啟

代碼:

private class myconn implements ServiceConnection

{

//這個方法是異步操作,可能花費(fèi)幾秒的時間,所以執(zhí)行完bindService是需要花費(fèi)一定時間才能獲取服務(wù)。

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有哪些啟動方法,有什么區(qū)別,怎樣停用Service?

在Service的生命周期中,被回調(diào)的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind。

通常有兩種方式啟動一個Service,他們對Service生命周期的影響是不一樣的。

1 、通過startService

Service會經(jīng)歷 onCreate 到onStart,然后處于運(yùn)行狀態(tài),stopService的時候調(diào)用onDestroy方法。

如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運(yùn)行。

2、 通過bindService

Service會運(yùn)行onCreate,然后是調(diào)用onBind, 這個時候調(diào)用者和Service綁定在一起。調(diào)用者退出了,Srevice就會調(diào)用onUnbind->onDestroyed方法。

所謂綁定在一起就共存亡了。調(diào)用者也可以通過調(diào)用unbindService方法來停止服務(wù),這時候Srevice就會調(diào)用onUnbind->onDestroyed方法。

需要注意的是如果這幾個方法交織在一起的話,會出現(xiàn)什么情況呢?

如果我們業(yè)務(wù)邏輯比較復(fù)雜,那么有可能需要讓服務(wù)長期在后臺運(yùn)行,并且還需要調(diào)用service的方法,那么就需要既開啟服務(wù),又綁定服務(wù)。

那么有一個原則是Service的onCreate的方法只會被調(diào)用一次,就是你無論多少次的startService又bindService,Service只被創(chuàng)建一次。

如果先是bind了,那么start的時候就直接運(yùn)行Service的onStart方法,如果先是start,那么bind的時候就直接運(yùn)行onBind方法。

如果service運(yùn)行期間調(diào)用了bindService,這時候再調(diào)用stopService的話,service是不會調(diào)用onDestroy方法的,service就stop不掉了,只能調(diào)用UnbindService, service就會被銷毀

如果一個service通過startService 被start之后,多次調(diào)用startService 的話,service會多次調(diào)用onStart方法。多次調(diào)用stopService的話,service只會調(diào)用一次onDestroyed方法。

如果一個service通過bindService被start之后,多次調(diào)用bindService的話,service只會調(diào)用一次onBind方法。

多次調(diào)用unbindService的話會拋出異常。

15.不用service,B頁面為音樂播放,從A跳轉(zhuǎn)到B,再返回,如何使音樂繼續(xù)播放?

這個問題問的很山寨.默認(rèn)不做任何處理,B里面的音樂都能播放.

遇到問題, 可以隨機(jī)應(yīng)變,靈活發(fā)揮,多考慮些細(xì)節(jié),比如說這個題就可以這樣說,說說你對startActivityForResult的理解()

A開啟B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態(tài)信息返回給A ,A繼續(xù)播放音樂.

不能通過onSaveInstanceStates來實(shí)現(xiàn),因?yàn)樗莂ctivity被移除任務(wù)棧才執(zhí)行的。

16.什么是IntentService?有何優(yōu)點(diǎn)?

IntentService繼承Service

普通的service ,默認(rèn)運(yùn)行在ui main 主線程

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

異步處理的方法OnHandleIntent(),默認(rèn)運(yùn)行在子線程中,可以處理耗時的操作

17.什么時候使用Service

官方文檔告訴我們,Android系統(tǒng)會盡量保持擁有service的進(jìn)程運(yùn)行,只要在該service已經(jīng)被啟動(start)或者客戶端連接(bindService)到它。當(dāng)內(nèi)存不足時,需要保持,擁有service的進(jìn)程具有較高的優(yōu)先級。

1. 如果service正在調(diào)用onCreate,onStartCommand或者onDestory方法,那么用于當(dāng)前service的進(jìn)程相當(dāng)于前臺進(jìn)程以避免被killed。

2. 如果當(dāng)前service已經(jīng)被啟動(start),擁有它的進(jìn)程則比那些用戶可見的進(jìn)程優(yōu)先級低一些,但是比那些不可見的進(jìn)程更重要,這就意味著service一般不會被killed.

3. 如果客戶端已經(jīng)連接到service (bindService),那么擁有Service的進(jìn)程則擁有最高的優(yōu)先級,可以認(rèn)為service是可見的。

4. 如果service可以使用setForeground(true)方法來將service設(shè)置為前臺狀態(tài),那么系統(tǒng)就認(rèn)為是對用戶可見的,并不會在內(nèi)存不足時killed。

如果有其他的應(yīng)用組件作為Service,Activity等運(yùn)行在相同的進(jìn)程中,那么將會增加該進(jìn)程的重要性。

1.Service的特點(diǎn)可以讓他在后臺一直運(yùn)行,可以在service里面創(chuàng)建線程去完成耗時的操作. 天氣預(yù)報(bào) widget TimerTask Timer 定期執(zhí)行timertask

2.Broadcast receiver捕獲到一個事件之后,可以啟動一個service來完成一個耗時的操作.

Broadcast receiver生命周期 和 響應(yīng)時間很短(10s)

3.遠(yuǎn)程的service如果被啟動起來,可以被多次bind, 但不會重新create.索愛手機(jī)X10i的人臉識別的service可以被圖庫使用,可以被攝像機(jī),照相機(jī)等程序使用.

18.請描述一下IntentIntent Filter。

Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。對于一個 Intent 對象,消息“目的地”是必須的,而內(nèi)容則是可選項(xiàng)。

通過Intent 可以實(shí)現(xiàn)各種系統(tǒng)組件的調(diào)用與激活.

Intent filter:可以理解為郵局或者是一個信箋的分揀系統(tǒng),定義一些匹配條件

這個分揀系統(tǒng)通過3個參數(shù)來識別

Action: 動作Intent.ation_view

Data: 數(shù)據(jù)uriurimime

Category : 而外的附加信息

Action 匹配

Action 是一個用戶定義的字符串,用于描述一個 Android 應(yīng)用程序組件,一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時可以在其 節(jié)點(diǎn)指定一個 Action 列表用于標(biāo)示 Activity 所能接受的“動作”,例如:

……

如果我們在啟動一個 Activity 時使用這樣的 Intent 對象:

Intent intent =new Intent();

intent.setAction("cn.itcast.action");

那么所有的 Action 列表中包含了“cn.itcast”的 Activity 都將會匹配成功。

Android 預(yù)定義了一系列的 Action 分別表示特定的系統(tǒng)動作。這些 Action 通過常量的方式定義在 android.content.Intent中,以“ACTION_”開頭。我們可以在 Android 提供的文檔中找到它們的詳細(xì)說明。

URI數(shù)據(jù)匹配

一個 Intent 可以通過 URI 攜帶外部數(shù)據(jù)給目標(biāo)組件。在 節(jié)點(diǎn)中,通過 節(jié)點(diǎn)匹配外部數(shù)據(jù)。

mimeType 屬性指定攜帶外部數(shù)據(jù)的數(shù)據(jù)類型,scheme 指定協(xié)議,host、port、path 指定數(shù)據(jù)的位置、端口、和路徑。如下:

android:host="host" android:port="port" android:path="path"/>

電話的uritel: 12345

http://www.baidu.com

自己定義的uriitcast://cn.itcast/person/10

如果在 Intent Filter 中指定了這些屬性,那么只有所有的屬性都匹配成功時 URI 數(shù)據(jù)匹配才會成功。

Category類別匹配

節(jié)點(diǎn)中可以為組件定義一個 Category 類別列表,當(dāng) Intent 中包含這個列表的所有項(xiàng)目時 Category 類別匹配才會成功。

默認(rèn)是DEFAULT

19. Intent傳遞數(shù)據(jù)時,可以傳遞哪些類型數(shù)據(jù)?

1.一般的基本數(shù)據(jù)類型Intent .putextra()intent.getStringextra();

2. 數(shù)據(jù)的uri, intent.setData()intent.getData();

20.說說Activity,IntentService是什么關(guān)系 。筆試常問

這種問題沒什么水準(zhǔn),相當(dāng)于麥當(dāng)勞和麥當(dāng)娜的關(guān)系是什么關(guān)系?

他們默認(rèn)情況下是沒有什么關(guān)系的。

這種問題,就講下對activity, service,intent的理解。

再說一下 activity、service可以通過intent去激活組件,傳遞數(shù)據(jù).

說自己項(xiàng)目中有這樣一個網(wǎng)絡(luò)更新的功能,顯示界面就用的activity, 后臺有個service每隔半小時都去訪問下服務(wù)器獲取更新的數(shù)據(jù)…

開啟服務(wù)用的是intent來開啟

注意所有的筆試,都要盡量說一下自己的項(xiàng)目的一些內(nèi)容。

21.請描述一下Broadcast Receiver

廣播是Android系統(tǒng)的一個事件,如果

有很多廣播接收者 ,系統(tǒng)已經(jīng)實(shí)現(xiàn)了.

廣播分兩種

有序廣播:同步,優(yōu)先級高的廣播,會先接收到廣播。

無序廣播:異步

優(yōu)先級使用:如果優(yōu)先級一樣,app的uid越低越先接收到廣播(先安裝的應(yīng)用程序的uid會低一點(diǎn)。)

onReceive() 方法.

abortBroadcast();

有序廣播有一個特例:指定接收者的廣播 .是不可以被攔截掉的

sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras);

resultReceiver廣播接受者 如果我們顯示的指定了廣播接收者

無論如何 都會接受廣播 事件abortBroadcast(); 的方法不會終止廣播事件

除非:SetResultData(null);將數(shù)據(jù)置為null,接收者一看數(shù)據(jù)是null,就不會執(zhí)行方法。

Sticky:粘性開發(fā)很少用到,但是面試有可能會問到:

sendStickyBroadcast(intent)//陰魂不散的廣播 (粘性的廣播)

粘性廣播,會一直等待intent指定的事件處理完畢,才會消失。

Wifi設(shè)置:發(fā)送wifi狀態(tài)改變的廣播,系統(tǒng)就是通過sendStickyBroadcast來實(shí)現(xiàn)的,因?yàn)楂@取wifi狀態(tài)改變是一個很耗時的操作,如果用一般發(fā)送廣播方式,還沒等wifi狀態(tài)獲取完,廣播就結(jié)束了。用于接收系統(tǒng)的廣播通知, 系統(tǒng)會有很多sd卡掛載,手機(jī)重啟,廣播通知,低電量,來短信等,一個apk的安裝成功…

手機(jī)衛(wèi)士中自定義一個broadcast receiver

sms_received

來獲取短信到來的廣播, 根據(jù)黑名單來判斷是否攔截該短信.

畫畫板生成圖片后,發(fā)送一個sd掛載的通知,通知系統(tǒng)的gallery去獲取到新的圖片.

Intent intent =newIntent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));

sendBroadcast(intent);

廣播接收者注冊:

清單文件注冊:一旦APK裝到手機(jī)上,這個廣播接收者就生效

代碼注冊:只有當(dāng)代碼執(zhí)行時,才會生效

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

設(shè)置廣播接收者的優(yōu)先級,設(shè)置廣播接受者的action名字 等…

詳細(xì)見工程代碼.

代碼中注冊,如果代碼沒有執(zhí)行,就接受不到廣播事件

registerReceiver(receiver,filter);

23.請介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。

ContentProvider是系統(tǒng)的一個服務(wù),我們要實(shí)現(xiàn)數(shù)據(jù)共享需要重寫ContentProvider

把自己的數(shù)據(jù)通過uri的形式共享出去

android系統(tǒng)下 不同程序 數(shù)據(jù)默認(rèn)是不能共享訪問

需要去實(shí)現(xiàn)一個類去繼承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

使用系統(tǒng)Provider

技巧: 1.看urlmarcher.

2. 根據(jù)匹配碼 查看增刪改查的具體實(shí)現(xiàn)

24.請介紹下Android的數(shù)據(jù)存儲方式。

文件可以存到手機(jī)的內(nèi)存,和sdcard中

手機(jī)內(nèi)存文件存放位置: /data/data/包名/files

可以通過context.openFileInput(name)默認(rèn)是私有的訪問權(quán)限 ,只能讀

Sdcard,讀不需要權(quán)限,寫需要權(quán)限。

數(shù)據(jù)庫 sqlite:data/data/包名/database/xxx.db

SharedPreference//包名/shared_prepsContext.modeprivate

網(wǎng)絡(luò)存放

socket 方式

httpHttpUrlConnection方式

HttpClient方式HttpPost HttpGet

ftp的網(wǎng)絡(luò)file transport protocol

25.為什么要用ContentProvider?它和sql的實(shí)現(xiàn)上有什么差別?

可以根據(jù)自己的業(yè)務(wù)邏輯暴露相應(yīng)操作,屏蔽數(shù)據(jù)存儲的細(xì)節(jié),對用戶透明,用戶只需要關(guān)心操作數(shù)據(jù)的uri和對應(yīng)的參數(shù),就可以了。

不同app之間共享,操作數(shù)據(jù)

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

網(wǎng)絡(luò)數(shù)據(jù)讀取更改 (這種操作不多)

Sql也有增刪改查的方法.

26.請介紹下Android中常用的五種布局。

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

FrameLayout

從屏幕的左上角開始布局,疊加顯示,

實(shí)際應(yīng)用 播放器的暫停按鈕.

獲取數(shù)據(jù)時設(shè)置進(jìn)度條的對話框

LinearLayout

線性布局,這個東西,從外框上可以理解為一個div,他首先是一個一個從上往下羅列在屏幕上。每一個LinearLayout里面又可分為垂直布局

(android:orientation="vertical")和水平布局(android:orientation="horizontal"

)。當(dāng)垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。

AbsoluteLayout

絕對布局猶如div指定了absolute屬性,用X,Y坐標(biāo)來指定元素的位置android:layout_x="20px"

android:layout_y="12px"

qq斗地主 qq游戲大廳 800*480 800*480.apkfwvga854*480320*240

許多游戲還在使用絕對布局,因?yàn)榻^對布局可以精準(zhǔn)的知道組件的位置,可以做相應(yīng)的點(diǎn)擊事件。

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里面可以具體定義每一個元素,設(shè)定他的對齊方式 android:gravity="" 。

每一個布局都有自己適合的方式,另外,這五個布局元素可以相互嵌套應(yīng)用,做出美觀的界面。

oa自動化 生成報(bào)表 ,圖標(biāo) 表示

css div

webview

有關(guān)布局的問題:平板的開發(fā)與手機(jī)的開發(fā)有什么樣的區(qū)別:

區(qū)別主要區(qū)別在UI上。

平板任務(wù)管理器的界面布局用 gridview

手機(jī) 任務(wù)管理 listview

27.談?wù)?/b>UI中,PaddingMargin有什么區(qū)別?

Padding 文字對邊框, margin是控件與控件之間的距離

28. widget相對位置的完成在activity的哪個生命周期階段實(shí)現(xiàn)。

這個題沒看懂…

widget可以理解成桌面小控件,

onReceive方法,廣播接收者?

也可以理解成 某個button, imageview這樣的控件…

onMeasure() // 計(jì)算 控件在屏幕上的位子

onDraw 顯示到界面上的

29.請解釋下在單線程模型中MessageHandler、Message QueueLooper之間的關(guān)系。

Activity的主線程被創(chuàng)建時,系統(tǒng)默認(rèn)會幫創(chuàng)建Looper,然后會自動調(diào)用looper的parepare方法,讓輪詢器待命。

主線程中還有一個Message Queue的arrayList集合

因?yàn)橹挥兄骶€程才可以更新UI,所以子線程A、子線程B要想更新UI,必須通過Handler去發(fā)送消息。發(fā)送的消息被放到Message Queue隊(duì)列中,然后這個Looper輪詢器,會不停的輪詢Message Queue隊(duì)列中的消息,如果發(fā)現(xiàn)有需要處理的消息,就會調(diào)用Message的handleMessage方法。

如何在子線程里面 顯示土司?

手工調(diào)用:Looper.parepare();

顯示Toast

手工輪詢一次,發(fā)送消息:Looper.loop();

子線程中如果使用Looper,就不能再使用handler去發(fā)送消息,因?yàn)長ooper會將消息發(fā)送給主線程。

30. AIDL的全稱是什么?如何工作?**

Android interface definition language (android接口定義語言) ,

用來跨進(jìn)程的訪問方法,

訪問遠(yuǎn)程的服務(wù)的方法. 如何工作 手機(jī)衛(wèi)士程序鎖

.endcall();

手機(jī)衛(wèi)士 Itelephony 接口掛斷電話.

31.請解釋下Android程序運(yùn)行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。

Android程序執(zhí)行需要讀取到安全敏感項(xiàng)必需在androidmanifest.xml中聲明相關(guān)權(quán)限請求, 打電話,訪問網(wǎng)絡(luò),獲取坐標(biāo),寫sd卡,讀寫聯(lián)系人等..安裝的時候會提示用戶…

文件系統(tǒng)的權(quán)限是linux系統(tǒng)的文件權(quán)限.

-rw------ 私有權(quán)限

-rw-rw-rw- 全局可讀可寫

比如說sharedpreference里面的Context.Mode_private

Context.Mode.world_read_ableContext.Mode_world_writeable

777最大權(quán)限,全局可讀可寫可執(zhí)行

32.系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?

需要找到對應(yīng)的瀏覽器的意圖,傳遞數(shù)據(jù)URI , 激活這個意圖

Intent .setAction(VIEW)

setData("http://")

激活系統(tǒng)的瀏覽器:

Intent intent =newIntent();

// com.android.browser/.BrowserActivity

intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");

Intent.setdata(uri);

推廣自己產(chǎn)品的操作,先查找手機(jī)里是否符合這個action的activity,如果沒有就提示用戶是否下載自己的產(chǎn)品:

queryIntentActivity();

33.android主線程的運(yùn)用和理解

四大組件都是維護(hù)在主線程里

系統(tǒng)事件:低電量廣播,sd卡掛載廣播也是主線程來維護(hù)的。

主ui線程不能執(zhí)行耗時的操作,不然會報(bào)anr異常

34.android虛擬機(jī)的理解,包括內(nèi)存管理機(jī)制垃圾回收機(jī)制。

Android虛擬機(jī)很小,空間很小,談?wù)勔苿釉O(shè)備的虛擬機(jī)的大小限制 默認(rèn) 16M

由于每個應(yīng)用所能使用的默認(rèn)內(nèi)存大小是16M,所有可以談?wù)劶虞d圖片的時候怎么處理大圖片的?

使用BitMap來對圖片進(jìn)行縮放。如何做***

垃圾回收,沒有引用的對象(對象=null),或者是離開作用空間(局部變量),在某個時刻會被系統(tǒng)gc掉.

System.gc(); 顯示通知系統(tǒng)是回收垃圾,不是立刻去執(zhí)行垃圾回收.

手機(jī)電視項(xiàng)目

獲取300個頻道圖片( 30K)將圖片給gallery ,由于圖片過多,有的頻道界面圖片是白板.

需要在gallery 顯示圖標(biāo)的activity的ondestory中調(diào)用gc();回收圖片資源

35.Framework工作方式及原理,Activity是如何生成一個view的,機(jī)制是什么。

反射 , 配置文件 (所有框架都是這倆結(jié)合,框架工作原理,讀取配置文件,實(shí)例化對象,調(diào)用對象中的方法)

普通的情況:

Activity創(chuàng)建一個view是通過 ondraw 畫出來的, 畫這個view之前呢,還會調(diào)用onmeasure方法來計(jì)算顯示的大小.

復(fù)雜情況:

Surfaceview直接操作硬件子類:opengl .GLSurfaceView

他會將顯卡緩存里的內(nèi)容顯示到界面上。

這樣速度會比較快,游戲開發(fā)經(jīng)常用到。

MediaPlayer、OpenGL,直接將數(shù)據(jù)寫到顯存里,顯卡獲取顯存內(nèi)容進(jìn)行顯示。

36. android本身的一些限制,比如apk包大小限制,讀取大文件時的時間限。

這個問題問的有問題, apk包大小限制不好說,這個是根據(jù)手機(jī)硬件而定的。

極品飛車有100M 還是能裝到手機(jī)上,

// apk 資源文件素材.

世面上的大程序主程序 很小 5~10M

素材存放在服務(wù)器上(也可以下載到sdcard上).如游戲程序.

讀大文件的時間限制應(yīng)該是main線程里面的時間限制5秒.

Service阻塞時間不要超過 20m

Broadcast 10m

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

遍歷sdcard所有的mp3信息會比較慢,

Mp3 作者信息 專輯 圖片 歌詞信息

Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統(tǒng)的數(shù)據(jù)庫表中,我們可以通過content provider獲取音樂信息

如何改善效率(界面顯示),是個常見問題, 可以從以下幾個方面作答,

分批加載數(shù)據(jù), 延時加載數(shù)據(jù), 合理使用緩存等...

Java虛擬機(jī),目標(biāo),加快java程序執(zhí)行速度

預(yù)先加載一些 都會的使用的大的class的字節(jié)碼, 提前加載.

時間換時間

空間換時間

38. ListView如何提高其效率?

復(fù)用convertview , 歷史的view對象

異步加載數(shù)據(jù),分頁加載數(shù)據(jù), onscollLinster();

使用Static class ViewHolder

使用靜態(tài)的view對象 避免創(chuàng)建過多的view.

也可以把下載后的數(shù)據(jù)緩存到數(shù)據(jù)庫里

通過客戶端和服務(wù)器 協(xié)同 作戰(zhàn) 來實(shí)現(xiàn)優(yōu)化。

圖片緩存,檢測圖片是否失效

通過Http 請求

If-modify-since : 檢查數(shù)據(jù)是否更新如果是302 拿緩存

39.啟動應(yīng)用后,改變系統(tǒng)語言,應(yīng)用的語言會改變么?

會,老版本sdk不會,新版本會

40.啟動一個程序,可以主界面點(diǎn)擊圖標(biāo)進(jìn)入,也可以從一個程序中跳轉(zhuǎn)過去,二者有什么區(qū)別?

如果在主界面點(diǎn)擊圖片進(jìn)入應(yīng)用程序,則會根據(jù)activity在manifest里面的配置,這個activity可能會放在不同的task棧里面

而通過intent跳轉(zhuǎn):則根據(jù)intent的設(shè)置來判斷是否放在新的任務(wù)棧里,如果flag為flag_new_task ,就會放在新的任務(wù)棧里。

Receiver、service沒有任務(wù)棧,要是想啟動一個activity,就需要指定flag

41. Android程序與Java程序的區(qū)別?

Android程序用android sdk開發(fā),java程序用javasdk開發(fā).

Android SDK引用了大部分的Java SDK,少數(shù)部分被Android SDK拋棄,比如說界面部分,java.awtswing除了java.awt.font被引用外,其他都被拋棄,在Android平臺開發(fā)中不能使用。

android sdk 還添加了開源工程: httpclient , pullopenGL

將Java 游戲或者j2me程序移植到Android平臺的過程中,

AndroidSDK 與Java SDK的區(qū)別是很需要注意的地方。

所有的界面的內(nèi)容,都需要重寫,只能保留業(yè)務(wù)邏輯相關(guān)的內(nèi)容。

1.6的 不支持httpClient的last-modified信息的處理

42.AndroidTask任務(wù)棧的分配。

假如有三個Activity A B C,A跳到B,然后B跳到C,現(xiàn)在需要從C跳到A如何傳遞數(shù)據(jù)而且使效率最高呢?

首先我們來看下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實(shí)際上是一個Activity棧,通常用戶感受的一個Application就是一個Task。從這個定義來看,Task跟Service或者其他Components是沒有任何聯(lián)系的,它只是針對Activity而言的。

Activity有不同的啟動模式, 可以影響到task的分配

Task,簡單的說,就是一組以棧的模式聚集在一起的Activity組件集合。它們有潛在的前后驅(qū)關(guān)聯(lián),新加入的Activity組件,位于棧頂,并僅有在棧頂?shù)腁ctivity,才會有機(jī)會與用戶進(jìn)行交互。而當(dāng)棧頂?shù)腁ctivity完成使命退出的時候,Task會將其退棧,并讓下一個將跑到棧頂?shù)腁ctivity來于用戶面對面,直至棧中再無更多Activity,Task結(jié)束。

如上表所示,是一個實(shí)例。從用戶從進(jìn)入郵箱開始,到回復(fù)完成,退出應(yīng)用整個過程的Task棧變化。這是一個標(biāo)準(zhǔn)的棧模式,對于大部分的狀況,這樣的Task模型,足以應(yīng)付,但是,涉及到實(shí)際的性能、開銷等問題,就會變得殘酷許多。

比如,啟動一個瀏覽器,在Android中是一個比較沉重的過程,它需要做很多初始化的工作,并且會有不小的內(nèi)存開銷。但與此同時,用瀏覽器打開一些內(nèi)容,又是一般應(yīng)用都會有的一個需求。設(shè)想一下,如果同時有十個運(yùn)行著的應(yīng)用(就會對應(yīng)著是多個Task),都需要啟動瀏覽器,這將是一個多么殘酷的場面,十個Task棧都堆積著很雷同的瀏覽器Activity,

是多么華麗的一種浪費(fèi)啊。

于是你會有這樣一種設(shè)想,瀏覽器Activity,可不可以作為一個單獨(dú)的Task而存在,不管是來自那個Task的請求,瀏覽器的Task,都不會歸并過去。這樣,雖然瀏覽器Activity本身需要維系的狀態(tài)更多了,但整體的開銷將大大的減少,這種舍小家為大家的行為,還是很值得歌頌的

standard", "singleTop", "singleTask", "singleInstance"。

standard模式, 是默認(rèn)的也是標(biāo)準(zhǔn)的Task模式,在沒有其他因素的影響下,使用此模式的Activity,會構(gòu)造一個Activity的實(shí)例,加入到調(diào)用者的Task棧中去,對于使用頻度一般開銷一般什么都一般的Activity而言,standard模式無疑是最合適的,因?yàn)樗壿嫼唵螚l理清晰,所以是默認(rèn)的選擇。

而singleTop模式,基本上于standard一致,僅在請求的Activity正好位于棧頂時,有所區(qū)別。此時,配置成singleTop的Activity,不再會構(gòu)造新的實(shí)例加入到Task棧中,而是將新來的Intent發(fā)送到棧頂Activity中,棧頂?shù)腁ctivity可以通過重載onNewIntent來處理新的Intent(當(dāng)然,也可以無視...)。這個模式,降低了位于棧頂時的一些重復(fù)開銷,更避免了一些奇異的行為(想象一下,如果在棧頂連續(xù)幾個都是同樣的Activity,再一級級退出的時候,這是怎么樣的用戶體驗(yàn)...),很適合一些會有更新的列表Activity展示。一個活生生的實(shí)例是,在Android默認(rèn)提供的應(yīng)用中,瀏覽器(Browser)的書簽Activity(BrowserBookmarkPage),就用的是singleTop。

singleTask,和singleInstance,則都采取的另辟Task的蹊徑。

標(biāo)志為singleTask的Activity,最多僅有一個實(shí)例存在,并且,位于以它為根的Task中。所有對該Activity的請求,都會跳到該Activity的Task中展開進(jìn)行。singleTask,很象概念中的單件模式,所有的修改都是基于一個實(shí)例,這通常用在構(gòu)造成本很大,但切換成本較小的Activity中。最典型的例子,還是瀏覽器應(yīng)用的主Activity(名為Browser...),它是展示當(dāng)前tab,當(dāng)前頁面內(nèi)容的窗口。它的構(gòu)造成本大,但頁面的切換還是較快的,于singleTask相配,還是挺天作之合的。

singleInstance顯得更為極端一些。在大部分時候singleInstance與singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在棧中僅有的一個Activity,如果涉及到的其他Activity,都移交到其他Task中進(jìn)行。這使得singleInstance的Activity,像一座孤島,徹底的黑盒,它不關(guān)注請求來自何方,也不計(jì)較后續(xù)由誰執(zhí)行。在Android默認(rèn)的各個應(yīng)用中,很少有這樣的Activity,在我個人的工程實(shí)踐中,曾嘗試在有道詞典的快速取詞Activity中采用過,

是因?yàn)槲矣X得快速取詞入口足夠方便(從notification中點(diǎn)選進(jìn)入),并且會在各個場合使用,應(yīng)該做得完全獨(dú)立。

大的apk 拆成 很多小的apk (按照功能拆分,然后搞一個主界面,調(diào)用每個功能,然后每個功能的apk的activity都需要在相同的任務(wù)棧內(nèi)運(yùn)行,這時就需要用到姻緣關(guān)系。)

●Activity的android:taskAffinity=""屬性 姻緣關(guān)系A(chǔ)ffinity

1.配置后 當(dāng)啟動這個activity時就先去找有沒有activity的親和力屬性相同 有就加入這個activity所在的任務(wù)中沒有就新開任務(wù)

2.affinity起作用需要的條件 必須具備以下任意一個:

1.intent包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記

2.activity元素啟用了allowTaskReparenting屬性. True(允許任務(wù)棧 重定父級)

43.Android中,怎么節(jié)省內(nèi)存的使用,怎么主動回收內(nèi)存?

盡量多使用內(nèi)部類 提高程序效率

Bean的字段可以不用 private,直接使用public

回收已經(jīng)使用的資源,

合理的使用緩存

合理設(shè)置變量的作用范圍

主動回收:未來的某一段時間執(zhí)行

System.gc();

44.不同工程中的方法是否可以相互調(diào)用?

可以,列舉aidl訪問遠(yuǎn)程服務(wù)的例子.***

45.Android中是如何實(shí)現(xiàn)判斷區(qū)分電話的狀態(tài),去電,來電、未接來電?

Day8 showAddressService.java***

未接來電:是有raning狀態(tài)直接到idle狀態(tài),我們可以記錄這倆狀態(tài)的時間,如果時間間隔過短,就說明是未接。

46. dvm的進(jìn)程和Linux的進(jìn)程,應(yīng)用程序的進(jìn)程是否為同一個概念

Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個android程序都運(yùn)行在自己的進(jìn)程里面,

每個android程序系統(tǒng)都會給他分配一個單獨(dú)的liunxuid(user id),

每個dvm都是linux里面的一個進(jìn)程.所以說這兩個進(jìn)程是一個進(jìn)程.

47. sim卡的EF文件有何作用 (百度)

Sim卡相關(guān)的東西,沒接觸過

文件規(guī)范.

遇到新的知識點(diǎn),沒接觸過,不過空著。

我們可以答,通過閱讀EF相關(guān)文檔,可以有所了解。

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

配置文件中有sd卡的權(quán)限, 通過environment的靜態(tài)方法,

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

49.嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種, 各有何特性。

內(nèi)存管理:頁式,段式,段頁式。

將內(nèi)存以不同方式,劃分成若干份,這樣方便管理。

斷式分隔,有一塊總的匯總索引表,先查找索引,在查找具體哪一塊。每一塊內(nèi)存有可能大小不一致。

段需要記錄內(nèi)存空間的引用。消耗了一定空間

頁通過計(jì)算的方式,去定位特定的內(nèi)存空間。

50.什么是嵌入式實(shí)時操作系統(tǒng), Android操作系統(tǒng)屬于實(shí)時操作系統(tǒng)嗎?

實(shí)時操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。主要用于工業(yè)控制、軍事設(shè)備、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時間有苛刻的要求,這就需要使用實(shí)時系統(tǒng)。又可分為軟實(shí)時和硬實(shí)時兩種,而android是基于linux內(nèi)核的,因此屬于軟實(shí)時。

實(shí)時操作系統(tǒng):能夠快速響應(yīng)操作的系統(tǒng),windows、linux都是。

實(shí)時操作系統(tǒng)的原理:

硬實(shí)時. 軍工系統(tǒng),火星探測車( Vxworks操作系統(tǒng)) (一旦有一個事件產(chǎn)生,我立馬放下所有的事情去執(zhí)行事件)

軟實(shí)時.調(diào)度算法(當(dāng)一個事件產(chǎn)生時,根據(jù)算法來判斷要隔多長時間執(zhí)行),我們用的一般的系統(tǒng)都是軟實(shí)時的。

51.一條最長的短信息約占多少byte?

一般情況下是中文70字符(包括標(biāo)點(diǎn)),英文160個字節(jié)

但是根據(jù)手機(jī)制式運(yùn)營商的不同,短信長度也不同

做實(shí)驗(yàn),看divideMessage方法的源碼

他會判斷,手機(jī)網(wǎng)絡(luò)制式去做限制。

52. Linux中跨進(jìn)程通信的幾種方式 。**

linux編程:先了解幾個概念。

# 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

# 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。

# 信號量( semophore ) : 信號量是一個計(jì)數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

# 消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識符標(biāo)識。消息隊(duì)列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

# 信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。

# 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。

# 套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。

53.談?wù)剬?/b>Android NDK的理解。

NDK:native develop kit只是一個交叉編譯的工具,調(diào)用C代碼。

1.什么時候用ndk,實(shí)時性要求高,游戲,圖形渲染

opencv (人臉識別) , ffmpeg , rmvbmp5 avi 高清解碼. ffmpeg, opencore.

2.為什么用ndk,ndk的優(yōu)點(diǎn) ,缺點(diǎn),

優(yōu)點(diǎn):效率比較高,復(fù)用c代碼

缺點(diǎn):代碼編寫比較麻煩,問題不好解決

再介紹我們項(xiàng)目中那些地方用到了ndk, c opengl?**

54.談?wù)?/b>Android的優(yōu)點(diǎn)和不足之處。不懂技術(shù)的人會問。

1、開放性,開源ophone阿里云( 完全兼容android) 樂os

2、掙脫運(yùn)營商束縛

3、豐富的硬件選擇 mtk android

4、不受任何限制的開發(fā)商

5、無縫結(jié)合的Google應(yīng)用

缺點(diǎn)也有5處:

1、安全問題、隱私問題

2、賣手機(jī)的不是最大運(yùn)營商

3、運(yùn)營商對Android手機(jī)仍然有影響

4、山寨化嚴(yán)重

5、過分依賴開發(fā)商,缺乏標(biāo)準(zhǔn)配置 版本過多

55. Android系統(tǒng)中GC什么情況下會出現(xiàn)內(nèi)存泄露呢?視頻編解碼/內(nèi)存泄露檢測內(nèi)存泄露工具

導(dǎo)致內(nèi)存泄漏主要的原因是,先前申請了內(nèi)存空間而忘記了釋放。如果程序中存在對無用對象的引用,那么這些對象就會駐留內(nèi)存,消耗內(nèi)存,因?yàn)闊o法讓垃圾回收器GC驗(yàn)證這些對象是否不再需要。如果存在對象的引用,這個對象就被定義為"有效的活動",同時不會被釋放。要確定對象所占內(nèi)存將被回收,我們就要務(wù)必確認(rèn)該對象不再會被使用。典型的做法就是把對象數(shù)據(jù)成員設(shè)為null或者從集合中移除該對象。但當(dāng)局部變量不需要時,不需明顯的設(shè)為null,因?yàn)橐粋€方法執(zhí)行完畢時,這些引用會自動被清理。

Java帶垃圾回收的機(jī)制,為什么還會內(nèi)存泄露呢?

Vector v = new Vector(10);

for (int i = 1; i < 100; i++){

Object o = new Object();

v.add(o);

o = null;

}//此時,所有的Object對象都沒有被釋放,因?yàn)樽兞縱引用這些對象。

Java 內(nèi)存泄露的根本原因就是保存了不可能再被訪問的變量類型的引用

Jni開發(fā),可能出現(xiàn)內(nèi)存泄露:

C代碼申請內(nèi)存,但是沒有釋放。

公司里 有可能使用內(nèi)存檢測工具:讀取源代碼,看是否有=null的對象

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

在主線程中拿到view調(diào)用Invalidate()方法,查看畫畫板里面更新imageview的方法

在子線程里面可以通過postInvalidate ()方法;

iv.invalidate();

newThread(){

publicvoidrun(){

iv.postInvalidate();

}

}.start();

57.簡單描述下Android數(shù)字簽名。

Android 數(shù)字簽名:私有簽名**

在Android系統(tǒng)中,所有安裝到系統(tǒng)的應(yīng)用程序都必有一個數(shù)字證書,此數(shù)字證書用于標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系

Android系統(tǒng)要求每一個安裝進(jìn)系統(tǒng)的應(yīng)用程序都是經(jīng)過數(shù)字證書簽名的,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中。Android將數(shù)字證書用來標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。

這個數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機(jī)構(gòu)認(rèn)證(CA),它只是用來讓應(yīng)用程序包自我認(rèn)證的。

同一個開發(fā)者的多個程序盡可能使用同一個數(shù)字證書,這可以帶來以下好處。

(1)有利于程序升級,當(dāng)新版程序和舊版程序的數(shù)字證書相同時,Android系統(tǒng)才會認(rèn)為這兩個程序是同一個程序的不同版本。如果新版程序和舊版程序的數(shù)字證書不相同,則Android系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會要求新程序更改包名。

(2)有利于程序的模塊化設(shè)計(jì)和開發(fā)。Android系統(tǒng)允許擁有同一個數(shù)字簽名的程序運(yùn)行在一個進(jìn)程中,Android程序會將他們視為同一個程序。所以開發(fā)者可以將自己的程序分模塊開發(fā),而用戶只需要在需要的時候下載適當(dāng)?shù)哪K。

在簽名時,需要考慮數(shù)字證書的有效期:

(1)數(shù)字證書的有效期要包含程序的預(yù)計(jì)生命周期,一旦數(shù)字證書失效,持有改數(shù)字證書的程序?qū)⒉荒苷I墶?/p>

(2)如果多個程序使用同一個數(shù)字證書,則該數(shù)字證書的有效期要包含所有程序的預(yù)計(jì)生命周期。

(3)Android Market強(qiáng)制要求所有應(yīng)用程序數(shù)字證書的有效期要持續(xù)到2033年10月22日以后。

Android數(shù)字證書包含以下幾個要點(diǎn):

(1)所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會安裝一個沒有數(shù)字證書的應(yīng)用程序

(2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證

(3)如果要正式發(fā)布一個Android ,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。

(4)數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會影響程序的正常功能。

58.什么是ANR如何避免它?

在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續(xù)運(yùn)行,但是,他們在使用你的應(yīng)用程序時,并不希望每次都要處理這個對話框。因此,在程序里對響應(yīng)性能的設(shè)計(jì)很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

Activity 5秒broadcast10秒

耗時的操作 worker thread里面完成,

處理方式:handler message…AsynsTask , intentservice.等…

59. android中的動畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?

兩種,一種是Tween動畫、還有一種是Frame動畫。

Tween動畫,這種實(shí)現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;

可以通過布局文件,可以通過代碼

1、控制View的動畫

a)alpha(AlphaAnimation)

漸變透明

b)scale(ScaleAnimation)

漸變尺寸伸縮

c)translate(TranslateAnimation)

畫面轉(zhuǎn)換、位置移動

d)rotate(RotateAnimation)

畫面轉(zhuǎn)移,旋轉(zhuǎn)動畫

2、控制一個Layout里面子View的動畫效果**

a)layoutAnimation(LayoutAnimationController)

b)gridAnimation(GridLayoutAnimationController)

另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。

62.說說mvc模式的原理,它在android中的運(yùn)用。

MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。

Android中的界面也采用了當(dāng)前比較流行的MVC框架,在Android中M就是應(yīng)用程序中二進(jìn)制的數(shù)據(jù),V就是用戶的界面。Android的界面直接采用XML文件保存的,界面開發(fā)變的很方便。在Android中C也是很簡單的,一個Activity可以有多個界面,只需要將視圖的ID傳遞到setContentView(),就指定了以哪個視圖模型顯示數(shù)據(jù)。

在Android SDK中的數(shù)據(jù)綁定,也都是采用了與MVC框架類似的方法來顯示數(shù)據(jù)。在控制層上將數(shù)據(jù)按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實(shí)現(xiàn)了數(shù)據(jù)綁定。比如顯示Cursor中所有數(shù)據(jù)的ListActivity,其視圖層就是一個ListView,將數(shù)據(jù)封裝為ListAdapter,并傳遞給ListView,數(shù)據(jù)就在ListView中顯示。

63.通過點(diǎn)擊一個網(wǎng)頁上的url就可以完成程序的自動安裝,描述下原理

Android基礎(chǔ):Day11AddJavascriptInterface**

通過javascript調(diào)用java代碼

64.ServiceActivity在同一個線程嗎

默認(rèn)情況同一線程 main主線程 ui線程

65.java中的soft reference是個什么東西

StrongReference 是 Java 的默認(rèn)引用實(shí)現(xiàn), 它會盡可能長時間的存活于 JVM 內(nèi), 當(dāng)沒有任何對象指向它時 GC 執(zhí)行后將會被回收

SoftReference 會盡可能長的保留引用直到 JVM 內(nèi)存不足時才會被回收(虛擬機(jī)保證), 這一特性使得 SoftReference 非常適合內(nèi)存緩存

66.udp連接和TCP的不同之處

Tcp:就像打電話,滑動窗口協(xié)議. 擁塞控制.

udp 不關(guān)心數(shù)據(jù)是否達(dá)到,以數(shù)據(jù)包的形式傳遞。是否阻塞

qq視頻:

畫面優(yōu)先. tcp

流暢優(yōu)先udp

qq發(fā)信息:udp,但是有時候會出現(xiàn) 某信息 未送達(dá)的提示,這是qq發(fā)信息的同時,會等待回執(zhí)信息(udp發(fā)送),如果接受到這個信息,就說明發(fā)送成功。

如果沒有接受到,就說明發(fā)送失敗,但有時候?qū)Ψ绞盏搅耍瑓s提示自己發(fā)送失敗,原因是這個回執(zhí)信息在發(fā)送過程中丟失了。

67. android開發(fā)中怎么去調(diào)試bug

邏輯錯誤

1.斷點(diǎn) debug

2. logcat

界面布局錯誤,使用 hierarchyviewer.bat ,顯示布局層級的工具

我們可以使用這個工具,去分析別人的界面,然后借鑒

68.service里面可以彈土司么

可以

69.10個簡單的linux命令

cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig

startup dhcp

chmod

70 .JNI調(diào)用常用的兩個參數(shù)

JNIEnv *env, jobject javaThis記住即可

71.書寫出android工程的目錄結(jié)構(gòu)

記住即可:

src

android.jar

asset

res

gen

manifest

72. ddmstraceview的區(qū)別.

daivilk debug manager system

查看進(jìn)程、查看文件、模擬電話、短信,gps定位等等。

traceview 分析程序執(zhí)行時間和效率代碼優(yōu)化時使用

使用步驟:

1.在應(yīng)用的主activity的onCreate方法中加入Debug.startMethodTracing("xxx.trace");

2.同樣在主activity的onStop方法中加入Debug.stopMethodTracing();

3.同時要在AndroidManifest.xml文件中配置權(quán)限

3.重新編譯,安裝,啟動服務(wù),測試完成取對應(yīng)的traceview文件(adb pull /sdcard/xxxx.trace)。

4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應(yīng)的應(yīng)用即可。

在這個文件中,可以分析出所有代碼執(zhí)行過程中,cpu的消耗情況,占用時間。

公司常用素語:

KPI : key performance information : 關(guān)鍵性能指標(biāo):

指標(biāo):如splash界面不能超過5秒

從splash 界面加載mainactivity 不能超過0.7秒

73.同步異步的理解,什么是同步,什么是異步,多次調(diào)用異步方法會出現(xiàn)什么問題.

同步就是你叫我去吃飯,我聽到了就和你去吃飯;如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。

異步就是你叫我,然后自己去吃飯,我得到消息后可能立即走,也可能等到下班才去吃飯。

所以,要我請你吃飯就用同步的方法,要請我吃飯就用異步的方法,這樣你可以省錢。

多次調(diào)用異步方法:未來一段時間內(nèi),得到多次響應(yīng)

圖片亂跳:**就是這個

以通訊為例

同步:發(fā)送一個請求,等待返回,然后再發(fā)送下一個請求

異步:發(fā)送一個請求,不等待返回,隨時可以再發(fā)送下一個請求

并發(fā):同時發(fā)送多個請求

74.利用mvc的模式重構(gòu)代碼

1)重構(gòu)前的代碼Bmi.java:

packagecom.demo.android.bmi;

importjava.text.DecimalFormat;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.TextView;

publicclassBmiextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// Listen for button clicks

Button button = (Button) findViewById(R.id.submit);

button.setOnClickListener(calcBMI);

}

privateOnClickListenercalcBMI=newOnClickListener() {

@Override

publicvoidonClick(View v) {

DecimalFormat nf =newDecimalFormat("0.00");

EditText fieldheight = (EditText) findViewById(R.id.height);

EditText fieldweight = (EditText) findViewById(R.id.weight);

doubleheight = Double.parseDouble(fieldheight.getText().toString()) / 100;

doubleweight = Double.parseDouble(fieldweight.getText().toString());

doubleBMI = 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);

}elseif(BMI < 20) {

fieldsuggest.setText(R.string.advice_light);

}else{

fieldsuggest.setText(R.string.advice_average);

}

}

};

}

Step1抽取所有界面元件的聲明和定義,整合到單獨(dú)一個函數(shù)findViews()中;

//聲明view

privateButtonbutton_calc;

privateEditTextfield_height;

privateEditTextfield_weight;

privateTextViewview_result;

privateTextViewview_suggest;

//定義

privatevoidfindViews() {

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抽取程序的邏輯(即界面元件的處理邏輯),整合到函數(shù)setListensers()中;

//Listen for button clicks

privatevoidsetListensers() {

button_calc.setOnClickListener(calcBMI);

}

此部分即是MVC中的C:Controller控制器。

接著,onCreate()就顯得非常簡潔、明了了:

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

findViews();

setListensers();

}

Step3修改按鈕監(jiān)聽器calcBMI中相應(yīng)的部分(主要是變量已經(jīng)在視圖部分定義了);

privateOnClickListenercalcBMI=newOnClickListener() {

@Override

publicvoidonClick(View v) {

DecimalFormat nf =newDecimalFormat("0.00");

doubleheight = Double.parseDouble(field_height.getText().toString()) / 100;

doubleweight = Double.parseDouble(field_weight.getText().toString());

doubleBMI = 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);

}elseif(BMI < 20) {

view_suggest.setText(R.string.advice_light);

}else{

view_suggest.setText(R.string.advice_average);

}

}

};

總之,此重構(gòu)的目的無非是使程序的脈絡(luò)更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應(yīng)該寫在哪里,程序邏輯(Controller)應(yīng)該寫在哪里,最終使維護(hù)和擴(kuò)展代碼變得更加容易!

其實(shí),重構(gòu)很簡單,通讀代碼,感覺哪邊不太爽,就改那邊吧!(我目前的感受)

一個良好的代碼應(yīng)該是能讓人感到舒服的!

總結(jié):

關(guān)于項(xiàng)目

在就是你項(xiàng)目經(jīng)驗(yàn),一定要突出你遇到什么難點(diǎn),然后是怎么解決的!把問題引導(dǎo)到你熟悉的領(lǐng)域,或者知識點(diǎn)上,盡量將每個技術(shù)點(diǎn)細(xì)節(jié)凸顯出來,

心態(tài):

什么樣的面試官都有,去面試的時候要做好一切心理準(zhǔn)備,不管是技術(shù)還是基礎(chǔ)都得扎實(shí)。一個人的交談能力也很重要,總之不是非常標(biāo)準(zhǔn)的普通話, 最起碼你說的得讓別人聽得懂,而且得把面試官講得非常徹底,這樣你獲得offer的機(jī)會更大,談工資也有優(yōu)勢~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評論 25 708
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    左神話閱讀 5,157評論 7 59
  • Chloehome 經(jīng)營范圍:摩登廚房、時尚家居、妖嬈主婦、小物件、少女心爆棚 風(fēng)格:北歐、簡約現(xiàn)代、美式鄉(xiāng)村、田...
    周樂樂_閱讀 4,102評論 3 55
  • 3組第一次9.3匯總 共11人,完成9人,有3人超過時間,2人李春華、翁前華末交 金云飛90天的目標(biāo) 1.瘦掉10...
    大金姐閱讀 551評論 0 0
  • shell的三種運(yùn)行方式 1.#sh filename (子進(jìn)程運(yùn)行,結(jié)束后變量名失效) 2. #./filena...
    glassyw閱讀 399評論 0 0

友情鏈接更多精彩內(nèi)容