常見(jiàn)面試題整理--安卓篇

轉(zhuǎn)自

1. 什么是Activity?

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

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

button.setOnclickLinstener{

}

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

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

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

進(jìn)度對(duì)話框的顯示與銷(xiāo)毀

2. 請(qǐng)描述一下Activity 生命周期。

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

在這個(gè)過(guò)程中 會(huì)針對(duì)不同的生命階段會(huì)調(diào)用不同的方法

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

其實(shí)這些方法都是兩兩對(duì)應(yīng)的,onCreate創(chuàng)建與onDestroy銷(xiāo)毀;

onStart可見(jiàn)與onStop不可見(jiàn);onResume可編輯(即焦點(diǎn))與onPause;

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

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

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

最后講自己項(xiàng)目中的經(jīng)驗(yàn),比如說(shuō)手機(jī)衛(wèi)士每次進(jìn)入某個(gè)界面的時(shí)候都要看到最新的數(shù)據(jù),這個(gè)刷新列表的操作 就放在onStart()的方法里面.這樣保證每次用戶(hù)看到的數(shù)據(jù)都是最新的.

多媒體播放,播放來(lái)電話. onStop() 視頻, 視頻聲音設(shè)置為0 , 記錄視頻播放的位置 mediaplayer.pause();

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

在讀文檔的時(shí)候 還發(fā)現(xiàn) activity還有兩個(gè)方法onPostResume() 和 OnPostCreate()這兩個(gè)生命周期的方法,不過(guò)開(kāi)發(fā)的時(shí)候沒(méi)有用到過(guò).

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

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

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

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

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

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

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

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

游戲開(kāi)發(fā)中,屏幕的朝向都是寫(xiě)死的.

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

可以自定義一個(gè)activity的樣式

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

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

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

protectedvoidonSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putLong("id",1234567890);

}

publicvoidonCreate(Bundle savedInstanceState) {

//判斷savedInstanceState是不是空.

//如果不為空就取出來(lái)

super.onCreate(savedInstanceState);

}

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

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

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

1、拋異常強(qiáng)制退出:

該方法通過(guò)拋異常,使程序Force Close。

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

100/0

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

2、記錄打開(kāi)的Activity:

每打開(kāi)一個(gè)Activity,就記錄下來(lái)。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。

Listlists ;在application全集的環(huán)境里面

lists =new ArrayList();

lists.add(this);

for(Activity activity: lists)

{

activity.finish();

}

ondestory

lists.remove(this);

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

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

//給某個(gè)activity注冊(cè)接受接受廣播的意圖

registerReceiver(receiver,filter)

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

4、遞歸退出

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

上面是網(wǎng)上的一些做法.

其實(shí) 可以通過(guò) intent的flag 來(lái)實(shí)現(xiàn).. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一個(gè)新的activity,然后在新的activity的oncreate方法里面 finish掉.

講一講你對(duì)activity的理解

把上面的幾點(diǎn)用自己的心得寫(xiě)出來(lái)

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

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

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

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

Thread.currentThread().getName();

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

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

基本數(shù)據(jù)類(lèi)型可以通過(guò).?Intent傳遞數(shù)據(jù)

extras.putDouble(key,value)

intent.putExtra(name,value)

//通過(guò)intentputExtra方法基本數(shù)據(jù)類(lèi)型都傳遞

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

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

Bundlebundle = new? Bundle();

bumdle.putShort(key,value);

intent.putExtras(bumdle);

intent.putExtras(bundle)

Application全局里面存放 對(duì)象 ,自己去實(shí)現(xiàn)自己的application的這個(gè)類(lèi),基礎(chǔ)系統(tǒng)的application , 每個(gè)activity都可以取到

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

讓類(lèi)實(shí)現(xiàn)Serializable接口,然后可以通過(guò)ObjectOutputStream ???? ?//對(duì)象輸出流

Filefile = new File("c:\1.obj");

FileOutputStreamfos? = new FileOutputStream(file);

ObjectOutputStreamoos = new ObjectOutputStream(fos);

Studentstu = new Student();

oos.writeObject(stu);

//從文件中把對(duì)象讀出來(lái)

ObjectInputStreamois = new ObjectInputStream(arg0);

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

文件/網(wǎng)絡(luò)

intent.setData(Uri)

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

10. 怎么讓在啟動(dòng)一個(gè)Activity是就啟動(dòng)一個(gè)service?

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

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

Singleinstance? 運(yùn)行在另外的單獨(dú)的任務(wù)棧里面

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

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

這個(gè)被激活的activity就會(huì)在新的task棧里面…

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

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

startService()一旦被創(chuàng)建調(diào)用著無(wú)關(guān)?? 沒(méi)法使用service里面的方法

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

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

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

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

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

通過(guò)bindService的方法去啟動(dòng)一個(gè)服務(wù),

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

ServiceConnection對(duì)象(重寫(xiě)onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

privateclass myconn implements ServiceConnection

{

publicvoid onServiceConnected(ComponentName name, IBinder service) {

//TODO Auto-generated method stub

//可以通過(guò)IBinder的對(duì)象 去使用service里面的方法

}

publicvoid onServiceDisconnected(ComponentName name) {

//TODO Auto-generated method stub

}

}

13. 14 .什么是Service以及描述下它的生命周期。Service有哪些啟動(dòng)方法,有什么區(qū)別,怎樣停用Service?

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

onBind和onUnbind。

通常有兩種方式啟動(dòng)一個(gè)Service,他們對(duì)Service生命周期的影響是不一樣的。

1通過(guò)startService

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

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

2通過(guò)bindService

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sdk給我們提供的方便的,帶有異步處理的service類(lèi),

OnHandleIntent()處理耗時(shí)的操作

17. 什么時(shí)候使用Service?

startForeground(id,notification)

messenger

擁有service的進(jìn)程具有較高的優(yōu)先級(jí)

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

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

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

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

4. 如果service可以使用startForeground(int, Notification)方法來(lái)將service設(shè)置為前臺(tái)狀態(tài),那么系統(tǒng)就認(rèn)為是對(duì)用戶(hù)可見(jiàn)的,并不會(huì)在內(nèi)存不足時(shí)killed。

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

1.Service的特點(diǎn)可以讓他在后臺(tái)一直運(yùn)行,可以在service里面創(chuàng)建線程去完成耗時(shí)的操作.

2.Broadcastreceiver捕獲到一個(gè)事件之后,可以起一個(gè)service來(lái)完成一個(gè)耗時(shí)的操作.

3.遠(yuǎn)程的service如果被啟動(dòng)起來(lái),可以被多次bind,但不會(huì)重新create.? 索愛(ài)手機(jī)X10i的人臉識(shí)別的service可以被圖庫(kù)使用,可以被攝像機(jī),照相機(jī)等程序使用.

18. 請(qǐng)描述一下Intent 和 Intent Filter。

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

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

Intent filter:可以理解為郵局或者是一個(gè)信箋的分揀系統(tǒng)…

這個(gè)分揀系統(tǒng)通過(guò)3個(gè)參數(shù)來(lái)識(shí)別

Action:動(dòng)作??? view

Data:數(shù)據(jù)uri?? uri

Category :而外的附加信息

Action匹配

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

……

如果我們?cè)趩?dòng)一個(gè)Activity時(shí)使用這樣的Intent對(duì)象:

Intent intent =new Intent();

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

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

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

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

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

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

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

電話的uri??tel: 12345

http://www.baidu.com

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

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

Category類(lèi)別匹配

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

默認(rèn)是DEFAULT

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

1.一般的基本數(shù)據(jù)類(lèi)型? Intent .putextra()intent.getextra();

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

20. 說(shuō)說(shuō)Activity,Intent,Service是什么關(guān)系 。

麥當(dāng)勞和麥當(dāng)娜的關(guān)系是什么關(guān)系?

這種問(wèn)題,就講下activity,講一下service,說(shuō)一下通過(guò)intent去激活組件,傳遞數(shù)據(jù).

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

開(kāi)啟服務(wù)用的是intent來(lái)開(kāi)啟

21. 請(qǐng)描述一下Broadcast Receiver。

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

廣播分兩種 有序廣播

無(wú)序廣播

指定接收者的廣播 .是不可以被攔截掉的

abortBroadcast();

用于接收系統(tǒng)的廣播通知,系統(tǒng)會(huì)有很多sd卡掛載,手機(jī)重啟,廣播通知,低電量,來(lái)電,來(lái)短信等….

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

sms_received ?

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

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

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

sendBroadcast(intent);

22. 在manifest和代碼中如何注冊(cè)和使 用 broadcastreceiver 。

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

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

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

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

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

需要去實(shí)現(xiàn)一個(gè)類(lèi)去繼承ContentProvider

publicclass PersonContentProvider extends ContentProvider{

publicboolean onCreate(){

//..

}

query(Uri, String[], String, String[], String)

insert(Uri, ContentValues)

update(Uri, ContentValues, String, String[])

delete(Uri, String, String[])

}

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

文件訪問(wèn)權(quán)限.? sdcard /

數(shù)據(jù)庫(kù) sqlite

SharedPreference? //shared_preps

網(wǎng)絡(luò)? socket tcp udp , http httpurlconnection

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

屏蔽數(shù)據(jù)存儲(chǔ)的細(xì)節(jié),對(duì)用戶(hù)透明,用戶(hù)只需要關(guān)心操作數(shù)據(jù)的uri就可以了

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

Sql也有增刪改查的方法.

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

網(wǎng)絡(luò)數(shù)據(jù)讀取更改

26. 請(qǐng)介紹下Android中常用的五種布局。

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

FrameLayout

從屏幕的左上角開(kāi)始布局,疊加顯示, 實(shí)際應(yīng)用 播放器的暫停按鈕.

LinearLayout

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

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

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

AbsoluteLayout

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

android:layout_y="12px"

qq斗地主 qq游戲大廳800*480 800*480.apk? fwvga? 854*480

指定平板機(jī)型的游戲開(kāi)發(fā)中經(jīng)常用到絕對(duì)布局? widget絕對(duì)布局

指定機(jī)型的平板游戲開(kāi)發(fā)機(jī)頂盒開(kāi)發(fā)。. 2.3 3.0

1.界面布局任務(wù)管理器 gridview

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

lephone

lepad

RelativeLayout

相對(duì)布局可以理解為某一個(gè)元素為參照物,來(lái)定位的布局方式。主要屬性有:

相對(duì)于某一個(gè)元素

android:layout_below="@id/aaa"該元素在 id為aaa的下面

android:layout_toLeftOf="@id/bbb"改元素的左邊是bbb

相對(duì)于父元素的地方

android:layout_alignParentLeft="true"在父元素左對(duì)齊

android:layout_alignParentRight="true"在父元素右對(duì)齊

TableLayout

表格布局類(lèi)似Html里面的Table。每一個(gè)TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個(gè)元素,設(shè)定他的對(duì)齊方式android:gravity="" 。

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

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

css div

webview

27. 談?wù)刄I中, Padding和Margin有什么區(qū)別?

Padding文字對(duì)邊框, margin是控件對(duì)父窗體.

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

這個(gè)題沒(méi)看懂…

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

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

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

某個(gè)view要顯示在界面? ondraw 被顯示到界面上的 .

29. 請(qǐng)解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關(guān)系。

30. AIDL的全稱(chēng)是什么?如何工作?

Android interface definition language (android接口定義語(yǔ)言) ,用來(lái)跨進(jìn)程的訪問(wèn)方法,

訪問(wèn)遠(yuǎn)程的服務(wù)的方法.如何工作 day7queryStudent .

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

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

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

drwx

文件系統(tǒng)的權(quán)限是linux權(quán)限. 比如說(shuō)sharedpreference里面的Context.Mode.private? Context.Mode.world_read_able?? Context.Mode_world_writeable

777自己 同組 其他

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

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

Intent intent =newIntent();

intent.setClassName(packageName,className);

intent.seturi()

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

主ui線程不能執(zhí)行耗時(shí)的操作,

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

虛擬機(jī)很小,空間很小,談?wù)勔苿?dòng)設(shè)備的虛擬機(jī)的大小限制 16M ,

談?wù)劶虞d圖片的時(shí)候怎么處理大圖片的,d

垃圾回收,沒(méi)有引用的對(duì)象,在某個(gè)時(shí)刻會(huì)被系統(tǒng)gc掉.

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

反射 , 配置文件

可以講下activity的源碼,比如說(shuō) 每個(gè)activity里面都有window.callback和keyevent.callback,一些回調(diào)的接口或者函數(shù)吧. 框架把a(bǔ)ctivity創(chuàng)建出來(lái)就會(huì)調(diào)用里面的這些回調(diào)方法,會(huì)調(diào)用activity生命周期相關(guān)的方法.

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

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

這個(gè)問(wèn)題問(wèn)的有問(wèn)題, apk包大小限制不好說(shuō),

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

世面google market上大程序? 主程序 很小 5~10M??? 下載sdcard

15分鐘之內(nèi) 申請(qǐng)退款

apk包,精簡(jiǎn)包, 素材存放在服務(wù)器. 游戲程序.

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

Activity不要超過(guò)5秒.

Service不要超過(guò)20秒

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

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

顯示出來(lái),改善效率,是個(gè)常見(jiàn)問(wèn)題, 可以從以下幾個(gè)方面作答,

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

38. ListView如何提高其效率?

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

減少子孩子查詢(xún)的次數(shù) viewholder

異步加載數(shù)據(jù),分頁(yè)加載數(shù)據(jù),

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

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

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

區(qū)別是根據(jù)activity在manifest里面的配置,這個(gè)activity可能會(huì)放在不同的task棧里面

intent設(shè)置的flag? flag_new_task

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

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

Android SDK引用了大部分的Java SDK,少數(shù)部分被Android SDK拋棄,比如說(shuō)界面部分,java.awt? swing?package除了java.awt.font被引用外,其他都被拋棄,在Android平臺(tái)開(kāi)發(fā)中不能使用。 android sdk 添加工具jar httpclient , pull? opengl

將Java游戲或者j2me程序移植到Android平臺(tái)的過(guò)程中,

Android? SDK與JavaSDK的區(qū)別是很需要注意的地方。

sampledataadpter()

42. Android中Task任務(wù)棧的分配。

首先我們來(lái)看下Task的定義,Google是這樣定義Task的:a task is what the user experiences asan "application." It's a group of related activities, arranged in astack. A task is a stack of activities, not a class or an element in themanifest file. 這意思就是說(shuō)Task實(shí)際上是一個(gè)Activity棧,通常用戶(hù)感受的一個(gè)Application就是一個(gè)Task。從這個(gè)定義來(lái)看,Task跟Service或者其他Components是沒(méi)有任何聯(lián)系的,它只是針對(duì)Activity而言的。

Activity有不同的啟動(dòng)模式,可以影響到task的分配

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

事件

Task棧(粗體為棧頂組件)

點(diǎn)開(kāi)Email應(yīng)用,進(jìn)入收件箱(Activity A)

A

選中一封郵件,點(diǎn)擊查看詳情(Activity B)

AB

點(diǎn)擊回復(fù),開(kāi)始寫(xiě)新郵件(Activity C)

ABC

寫(xiě)了幾行字,點(diǎn)擊選擇聯(lián)系人,進(jìn)入選擇聯(lián)系人界面(Activity D)

ABCD

選擇好了聯(lián)系人,繼續(xù)寫(xiě)郵件

ABC

寫(xiě)好郵件,發(fā)送完成,回到原始郵件

AB

點(diǎn)擊返回,回到收件箱

A

退出Email程序

null

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

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

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

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

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

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

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

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

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

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

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

大的apk拆成 很多小的apk

●Activity的android:affinity屬性

1.配置后當(dāng)啟動(dòng)這個(gè)activity時(shí)就先去找有沒(méi)有activity的親和力屬性相同有就加入這個(gè)

activity所在的任務(wù)中沒(méi)有就新開(kāi)任務(wù)

2.affinity起作用需要的條件二者具備一個(gè):

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

2.activity元素啟用了allowTaskReparenting屬性.

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

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

合理的使用緩存

合理設(shè)置變量的作用范圍…? application對(duì)象

//未來(lái)的某一段時(shí)間執(zhí)行

System.gc();

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

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

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

Day8 showAddressService.java

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

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

每個(gè)android程序系統(tǒng)都會(huì)給他分配一個(gè)單獨(dú)的liunx? uid(user id),

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

47. sim卡的EF 文件有何作用

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

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

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

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

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

頁(yè)式,段式,段頁(yè),等 …

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

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

51. 一條最長(zhǎng)的短信息約占多少byte?

中文70(包括標(biāo)點(diǎn)),英文160,160個(gè)字節(jié) 這個(gè)說(shuō)法不準(zhǔn)確,

要跟手機(jī)制式運(yùn)營(yíng)商等信息有關(guān).

做實(shí)驗(yàn),看源碼

ArrayList msgs =sms.divideMessage(message);

for (String msg : msgs) {

sms.sendTextMessage(phoneNumber, null, msg, pi, null);

}

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

linux編程

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

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

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

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

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

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

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

53. 談?wù)剬?duì)Android NDK的理解。

native develop kit?? 只是一個(gè)交叉編譯的工具? .so

1.什么時(shí)候用ndk,實(shí)時(shí)性要求高,游戲,圖形渲染,?opencv (人臉識(shí)別) , ffmpeg , rmvb? mp5 avi 高清解碼. ffmpeg,opencore.

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

我們項(xiàng)目中那些地方用到了ndk,

54. 談?wù)凙ndroid的優(yōu)點(diǎn)和不足之處。

1、開(kāi)放性,開(kāi)源ophone? 阿里云( 完全兼容android)

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

3、豐富的硬件選擇 mtk android

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

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

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

1、安全問(wèn)題、隱私問(wèn)題

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

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

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

5、過(guò)分依賴(lài)開(kāi)發(fā)商,缺乏標(biāo)準(zhǔn)配置

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

檢測(cè)內(nèi)存泄露?? 工具

mat

C:\Users\lenovo\Desktop\prof>hprof-convcom.example.testmat.hprof convert-com.ex

ample.testmat.hprof

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

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

Vector v = new Vector(10);

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

Object o = new Object();

v.add(o);

o = null;

}//此時(shí),所有的Object對(duì)象都沒(méi)有被釋放,因?yàn)樽兞縱引用這些對(duì)象。

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

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

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

在子線程里面可以通過(guò)postInvalide()方法;

View view;

view.invalidate();//主線程

view.postInvalidate();//子線程

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

Android數(shù)字簽名

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Activity 5秒? broadcast10秒

耗時(shí)的操作 worker thread里面完成,handler message…AsynTask , intentservice.等…

59. android中的動(dòng)畫(huà)有哪幾類(lèi),它們的特點(diǎn)和區(qū)別是什么?

兩種,一種是Tween動(dòng)畫(huà)、還有一種是Frame動(dòng)畫(huà)。

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

可以通過(guò)布局文件,可以通過(guò)代碼

1、控制View的動(dòng)畫(huà)

a)? alpha(AlphaAnimation)

漸變透明

b)? scale(ScaleAnimation)

漸變尺寸伸縮

c)? translate(TranslateAnimation)

畫(huà)面轉(zhuǎn)換、位置移動(dòng)

d)? rotate(RotateAnimation)

畫(huà)面轉(zhuǎn)移,旋轉(zhuǎn)動(dòng)畫(huà)

2、控制一個(gè)Layout里面子View的動(dòng)畫(huà)效果

a)? layoutAnimation(LayoutAnimationController)

b)? gridAnimation(GridLayoutAnimationController)

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

屬性動(dòng)畫(huà) ObjectAnimator

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

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

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

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

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

Day11 AddJavascriptInterface

new Object{

callphone();

installapk();

}

64,Service和Activity在同一個(gè)線程嗎

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

65,java中的soft reference是個(gè)什么東西

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

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

應(yīng)用詳細(xì)見(jiàn)客戶(hù)端圖片的緩存

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

tcp/滑動(dòng)窗口協(xié)議. 擁塞控制.?? 面向連接 流

udp 不關(guān)心數(shù)據(jù)是否達(dá)到,是否阻塞?? 面向無(wú)連接

畫(huà)面優(yōu)先. tcp

流暢優(yōu)先? udp

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

邏輯錯(cuò)誤

1.斷點(diǎn) debug

2. logcat , traceview

界面布局,顯示 hierarchyviewer.bat

68.service里面可以彈土司么

可以

69.寫(xiě)10個(gè)簡(jiǎn)單的linux命令

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

startup dhcp

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

JNIEnv *env,jobject javaThis

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

src

android. jar

asset

res

gen

manifest

72. ddms 和traceview的區(qū)別.

daivilk debug managersystem

1.在應(yīng)用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");

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

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

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

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

traceview 分析程序執(zhí)行時(shí)間和效率

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

splash界面不能超過(guò)5秒

從splash 界面加載mainactivity不能超過(guò)0.7秒

對(duì)于Android 1.5及以下的版本:不支持。

對(duì)于Android 1.5以上2.1下(含2.1)的版本:受限支持。trace文件只能生成到SD卡,且必須在程序中加入代碼。

對(duì)于Android 2.2上(含2.2)的版本:全支持??梢圆挥肧D卡,不用在程序中加代碼,直接自己用DDMS就可以進(jìn)程Traceview。

73. 利用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 firstcreated. */

@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) {

DecimalFormatnf =newDecimalFormat("0.00");

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

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

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

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

doubleBMI = weight / (height * height);

TextViewresult = (TextView) findViewById(R.id.result);

result.setText("Your BMI is "+ nf.format(BMI));

// Give health advice

TextViewfieldsuggest = (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ú)一個(gè)函數(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()就顯得非常簡(jiǎn)潔、明了了:

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

findViews();

setListensers();

}

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

privateOnClickListenercalcBMI=newOnClickListener() {

@Override

publicvoidonClick(View v) {

DecimalFormatnf =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)的目的無(wú)非是使程序的脈絡(luò)更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應(yīng)該寫(xiě)在哪里,程序邏輯(Controller)應(yīng)該寫(xiě)在哪里,最終使維護(hù)和擴(kuò)展代碼變得更加容易!

其實(shí),重構(gòu)很簡(jiǎn)單,通讀代碼,感覺(jué)哪邊不太爽,就改那邊吧?。ㄎ夷壳暗母惺埽?/p>

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

2)???? 重構(gòu)后的代碼Bmi.java:

packagecom.demo.android.bmi;

importjava.text.DecimalFormat;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.TextView;

publicclassBmiextendsActivity {

privateButtonbutton_calc;

privateEditTextfield_height;

privateEditTextfield_weight;

privateTextViewview_result;

privateTextViewview_suggest;

/** Called when the activity is firstcreated. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

findViews();

setListensers();

}

//定義

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

}

// Listen for button clicks

privatevoidsetListeners() {

calcbutton.setOnClickListener(calcBMI);

}

privateButton.OnClickListenercalcBMI=newButton.OnClickListener() {

publicvoidonClick(View v) {

DecimalFormatnf =newDecimalFormat("0.0");

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

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

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

}elseif(BMI < 20) {

view_suggest.setText(R.string.advice_light);

}else{

view_suggest.setText(R.string.advice_average);

}

}

};

}

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

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,326評(píng)論 25 708
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個(gè)即將畢業(yè)的Android程序媛,開(kāi)始面臨找工作了,...
    左神話閱讀 5,158評(píng)論 7 59
  • 昨天開(kāi)家長(zhǎng)會(huì),小孩非要跟著,她同意了。開(kāi)家長(zhǎng)會(huì)的過(guò)程中,小孩在教室里。把一些小東西小玩具弄得有點(diǎn)兒想。她非常擔(dān)心老...
    劉姥姥2017閱讀 1,752評(píng)論 0 0
  • if 條件選擇,選擇執(zhí)行,可嵌套 逐條件進(jìn)行判斷,第一次遇為“真”條件時(shí),執(zhí)行其分支,而后結(jié)束整個(gè)if語(yǔ)句 例子:...
    素瑾汐閱讀 399評(píng)論 0 1
  • 自從在那小得不起眼,也許老石浦人都未必知道的文化館中借來(lái)了汪曾祺的<<人間滋味>>以后,每天早飯前后都會(huì)拿出來(lái)讀幾...
    艾字閱讀 1,023評(píng)論 7 49

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