常見面試題整理--安卓篇

轉(zhuǎn)自

1. 什么是Activity?

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

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

button.setOnclickLinstener{

}

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

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

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

進度對話框的顯示與銷毀

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

其實這些方法都是兩兩對應(yīng)的糠悯,onCreate創(chuàng)建與onDestroy銷毀;

onStart可見與onStop不可見欲主;onResume可編輯(即焦點)與onPause芍锚;

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

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

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

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

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

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

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

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

一般情況比如說有兩個activity,分別叫A,B,當在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)用各個生命周期

默認首先銷毀當前activity,然后重新加載

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

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

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

可以自定義一個activity的樣式

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

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

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

protectedvoidonSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

outState.putLong("id",1234567890);

}

publicvoidonCreate(Bundle savedInstanceState) {

//判斷savedInstanceState是不是空.

//如果不為空就取出來

super.onCreate(savedInstanceState);

}

7. 如何退出Activity迷捧?如何安全退出已調(diào)用多個Activity的Application织咧?

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

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

1胀葱、拋異常強制退出:

該方法通過拋異常,使程序Force Close笙蒙。

驗證可以抵屿,但是,需要解決的問題是手趣,如何使程序結(jié)束掉晌该,而不彈出Force Close的窗口。

100/0

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

2绿渣、記錄打開的Activity:

每打開一個Activity朝群,就記錄下來。在需要退出時中符,關(guān)閉每一個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)用時淀散,發(fā)送一個特定的廣播右莱,每個Activity收到廣播后,關(guān)閉即可档插。

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

registerReceiver(receiver,filter)

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

4慢蜓、遞歸退出

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

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

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

講一講你對activity的理解

把上面的幾點用自己的心得寫出來

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

默認情況,如果沒有顯示的指定service所運行的進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)里面

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

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

Thread.currentThread().getName();

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

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

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

extras.putDouble(key,value)

intent.putExtra(name,value)

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

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

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

Bundlebundle = new? Bundle();

bumdle.putShort(key,value);

intent.putExtras(bumdle);

intent.putExtras(bundle)

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

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

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

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

FileOutputStreamfos? = new FileOutputStream(file);

ObjectOutputStreamoos = new ObjectOutputStream(fos);

Studentstu = new Student();

oos.writeObject(stu);

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

ObjectInputStreamois = new ObjectInputStream(arg0);

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

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

intent.setData(Uri)

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

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

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

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

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

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

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

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

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

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里面的方法

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

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

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

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

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

privateclass myconn implements ServiceConnection

{

publicvoid onServiceConnected(ComponentName name, IBinder service) {

//TODO Auto-generated method stub

//可以通過IBinder的對象 去使用service里面的方法

}

publicvoid 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,然后處于運行狀態(tài)鞍盗,stopService的時候調(diào)用onDestroy方法需了。

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

2通過bindService

Service會運行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)什么情況呢蛉拙?

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

如果先是bind了吮廉,那么start的時候就直接運行Service的onStart方法,如果先是start畸肆,那么bind的時候就直接運行onBind方法宦芦。

如果service運行期間調(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ù)播放?

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

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

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

16. 什么是IntentService强重?有何優(yōu)點绞呈?

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

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

OnHandleIntent()處理耗時的操作

17. 什么時候使用Service贸人?

startForeground(id,notification)

messenger

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

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

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

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

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

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

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

1.Service的特點可以讓他在后臺一直運行,可以在service里面創(chuàng)建線程去完成耗時的操作.

2.Broadcastreceiver捕獲到一個事件之后,可以起一個service來完成一個耗時的操作.

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

18. 請描述一下Intent 和 Intent Filter直撤。

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

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

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

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

Action:動作??? view

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

Category :而外的附加信息

Action匹配

Action是一個用戶定義的字符串,用于描述一個 Android應(yīng)用程序組件袍暴,一個 Intent Filter 可以包含多個 Action些侍。在 AndroidManifest.xml 的 Activity 定義時可以在其 節(jié)點指定一個 Action 列表用于標示 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提供的文檔中找到它們的詳細說明耗式。

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

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

mimeType屬性指定攜帶外部數(shù)據(jù)的數(shù)據(jù)類型措嵌,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中指定了這些屬性,那么只有所有的屬性都匹配成功時 URI 數(shù)據(jù)匹配才會成功探孝。

Category類別匹配

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

默認是DEFAULT

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

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

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

20. 說說Activity,Intent粱腻,Service是什么關(guān)系 庇配。

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

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

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

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

21. 請描述一下Broadcast Receiver。

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

廣播分兩種 有序廣播

無序廣播

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

abortBroadcast();

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

手機衛(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);

22. 在manifest和代碼中如何注冊和使 用 broadcastreceiver 绍些。

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

詳細見工程代碼.

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

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

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

需要去實現(xiàn)一個類去繼承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. 請介紹下Android的數(shù)據(jù)存儲方式。

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

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

SharedPreference? //shared_preps

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

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

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

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

Sql也有增刪改查的方法.

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

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

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

FrameLayout(幀布局)氮帐,LinearLayout(線性布局)嗅虏,AbsoluteLayout(絕對布局),RelativeLayout(相對布局)上沐,TableLayout(表格布局)

FrameLayout

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

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

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

指定機型的平板游戲開發(fā)機頂盒開發(fā)归斤。. 2.3 3.0

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

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

lephone

lepad

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自動化 生成報表 ,圖標 表示

css div

webview

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

Padding文字對邊框, margin是控件對父窗體.

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

這個題沒看懂…

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

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

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

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

29. 請解釋下在單線程模型中Message返奉、Handler贝搁、Message Queue、Looper之間的關(guān)系衡瓶。

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

Android interface definition language (android接口定義語言) ,用來跨進程的訪問方法,

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

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

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

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

drwx

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

777自己 同組 其他

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

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

Intent intent =newIntent();

intent.setClassName(packageName,className);

intent.seturi()

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

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

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

虛擬機很小,空間很小,談?wù)勔苿釉O(shè)備的虛擬機的大小限制 16M ,

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

垃圾回收,沒有引用的對象,在某個時刻會被系統(tǒng)gc掉.

35. Framework工作方式及原理蛮放,Activity是如何生成一個view的缩抡,機制是什么。

反射 , 配置文件

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

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

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

這個問題問的有問題, apk包大小限制不好說,

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

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

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

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

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

Activity不要超過5秒.

Service不要超過20秒

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

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

顯示出來,改善效率,是個常見問題, 可以從以下幾個方面作答,

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

38. ListView如何提高其效率?

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

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

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

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

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

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

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

intent設(shè)置的flag? flag_new_task

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

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

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

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

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

sampledataadpter()

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

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

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

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

事件

Task棧(粗體為棧頂組件)

點開Email應(yīng)用,進入收件箱(Activity A)

A

選中一封郵件随闪,點擊查看詳情(Activity B)

AB

點擊回復(fù)阳似,開始寫新郵件(Activity C)

ABC

寫了幾行字,點擊選擇聯(lián)系人蕴掏,進入選擇聯(lián)系人界面(Activity D)

ABCD

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

ABC

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

AB

點擊返回挽荡,回到收件箱

A

退出Email程序

null

如上表所示,是一個實例即供。從用戶從進入郵箱開始定拟,到回復(fù)完成,退出應(yīng)用整個過程的Task棧變化逗嫡。這是一個標準的棧模式青自,對于大部分的狀況,這樣的Task模型驱证,足以應(yīng)付延窜,但是,涉及到實際的性能抹锄、開銷等問題逆瑞,就會變得殘酷許多。

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

是多么華麗的一種浪費啊梢为。

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

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

standard模式汰具, 是默認的也是標準的Task模式卓鹿,在沒有其他因素的影響下,使用此模式的Activity留荔,會構(gòu)造一個Activity的實例吟孙,加入到調(diào)用者的Task棧中去,對于使用頻度一般開銷一般什么都一般的Activity而言聚蝶,standard模式無疑是最合適的杰妓,因為它邏輯簡單條理清晰,所以是默認的選擇碘勉。

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

singleTask土浸,和singleInstance,則都采取的另辟Task的蹊徑彭羹。

標志為singleTask的Activity黄伊,最多僅有一個實例存在,并且派殷,位于以它為根的Task中还最。所有對該Activity的請求墓阀,都會跳到該Activity的Task中展開進行。singleTask拓轻,很象概念中的單件模式岂津,所有的修改都是基于一個實例,這通常用在構(gòu)造成本很大悦即,但切換成本較小的Activity中。最典型的例子橱乱,還是瀏覽器應(yīng)用的主Activity(名為Browser...)辜梳,它是展示當前tab,當前頁面內(nèi)容的窗口泳叠。它的構(gòu)造成本大作瞄,但頁面的切換還是較快的,于singleTask相配危纫,還是挺天作之合的宗挥。

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

是因為我覺得快速取詞入口足夠方便(從notification中點選進入)寝姿,并且會在各個場合使用移稳,應(yīng)該做得完全獨立。

大的apk拆成 很多小的apk

●Activity的android:affinity屬性

1.配置后當啟動這個activity時就先去找有沒有activity的親和力屬性相同有就加入這個

activity所在的任務(wù)中沒有就新開任務(wù)

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

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

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

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

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

合理的使用緩存

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

//未來的某一段時間執(zhí)行

System.gc();

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

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

45. 在Android中是如何實現(xiàn)判斷區(qū)分電話的狀態(tài)都许,去電稻薇,來電、未接來電胶征?

Day8 showAddressService.java

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

Dvm的進程是dalivk虛擬機進程,每個android程序都運行在自己的進程里面,

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

每個dvm都是linux里面的一個進程.所以說這兩個進程是一個進程.

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

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

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

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

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

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

頁式案狠,段式,段頁钱雷,等 …

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

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

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

中文70(包括標點)骨坑,英文160信夫,160個字節(jié) 這個說法不準確,

要跟手機制式運營商等信息有關(guān).

做實驗,看源碼

ArrayList msgs =sms.divideMessage(message);

for (String msg : msgs) {

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

}

52. Linux中跨進程通信的幾種方式 。

linux編程

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

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

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

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

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

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

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

53. 談?wù)剬ndroid NDK的理解耍贾。

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

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

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

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

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

1路幸、開放性,開源ophone? 阿里云( 完全兼容android)

2荐开、掙脫運營商束縛

3、豐富的硬件選擇 mtk android

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

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

缺點也有5處:

1、安全問題砰识、隱私問題

2能扒、賣手機的不是最大運營商

3、運營商對Android手機仍然有影響

4辫狼、山寨化嚴重

5初斑、過分依賴開發(fā)商,缺乏標準配置

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

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

mat

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

ample.testmat.hprof

導(dǎo)致內(nèi)存泄漏主要的原因是见秤,先前申請了內(nèi)存空間而忘記了釋放。如果程序中存在對無用對象的引用真椿,那么這些對象就會駐留內(nèi)存鹃答,消耗內(nèi)存,因為無法讓垃圾回收器GC驗證這些對象是否不再需要突硝。如果存在對象的引用测摔,這個對象就被定義為"有效的活動",同時不會被釋放解恰。要確定對象所占內(nèi)存將被回收避咆,我們就要務(wù)必確認該對象不再會被使用舟肉。典型的做法就是把對象數(shù)據(jù)成員設(shè)為null或者從集合中移除該對象。但當局部變量不需要時查库,不需明顯的設(shè)為null路媚,因為一個方法執(zhí)行完畢時,這些引用會自動被清理樊销。

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

Vector v = new Vector(10);

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

Object o = new Object();

v.add(o);

o = null;

}//此時整慎,所有的Object對象都沒有被釋放,因為變量v引用這些對象围苫。

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

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

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

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

View view;

view.invalidate();//主線程

view.postInvalidate();//子線程

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

Android數(shù)字簽名

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

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

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

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

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

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

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

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

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

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

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

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

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

(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īng)用程序時糠惫,并不希望每次都要處理這個對話框。因此苦始,在程序里對響應(yīng)性能的設(shè)計很重要寞钥,這樣慌申,系統(tǒng)不會顯示ANR給用戶陌选。

Activity 5秒? broadcast10秒

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

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

兩種咨油,一種是Tween動畫、還有一種是Frame動畫柒爵。

Tween動畫役电,這種實現(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)的動畫方法酥夭,通過順序的播放排列好的圖片來實現(xiàn),類似電影。

屬性動畫 ObjectAnimator

62. 說說mvc模式的原理熬北,它在android中的運用疙描。

MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入讶隐、處理起胰、輸出流程按照Model、View整份、Controller的方式進行分離待错,這樣一個應(yīng)用被分成三個層——模型層、視圖層烈评、控制層火俄。

Android中界面部分也采用了當前比較流行的MVC框架,在Android中M就是應(yīng)用程序中二進制的數(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)封裝就可以直接在視圖模型上顯示了敬尺,從而實現(xiàn)了數(shù)據(jù)綁定。比如顯示Cursor中所有數(shù)據(jù)的ListActivity贴浙,其視圖層就是一個ListView砂吞,將數(shù)據(jù)封裝為ListAdapter,并傳遞給ListView崎溃,數(shù)據(jù)就在ListView中顯示蜻直。

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

Day11 AddJavascriptInterface

new Object{

callphone();

installapk();

}

64,Service和Activity在同一個線程嗎

默認情況同一線程 main主線程 ui線程

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

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

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

應(yīng)用詳細見客戶端圖片的緩存

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

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

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

畫面優(yōu)先. tcp

流暢優(yōu)先? udp

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

邏輯錯誤

1.斷點 debug

2. logcat , traceview

界面布局,顯示 hierarchyviewer.bat

68.service里面可以彈土司么

可以

69.寫10個簡單的linux命令

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

startup dhcp

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

JNIEnv *env,jobject javaThis

71. 書寫出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.同時要在AndroidManifest.xml文件中配置權(quán)限

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

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

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

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

splash界面不能超過5秒

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

對于Android 1.5及以下的版本:不支持乡范。

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

對于Android 2.2上(含2.2)的版本:全支持渠脉。可以不用SD卡瓶佳,不用在程序中加代碼芋膘,直接自己用DDMS就可以進程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:抽取所有界面元件的聲明和定義霸饲,整合到單獨一個函數(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) {

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

其實蟋滴,重構(gòu)很簡單染厅,通讀代碼,感覺哪邊不太爽脓杉,就改那邊吧T忝亍(我目前的感受)

一個良好的代碼應(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)容合作請聯(lián)系作者
  • 序言:七十年代末球散,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子散庶,更是在濱河造成了極大的恐慌蕉堰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悲龟,死亡現(xiàn)場離奇詭異屋讶,居然都是意外死亡,警方通過查閱死者的電腦和手機须教,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門皿渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩芭,“玉大人,你說我怎么就攤上這事乐疆』裕” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵挤土,是天一觀的道長琴庵。 經(jīng)常有香客問我,道長仰美,這世上最難降的妖魔是什么迷殿? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮咖杂,結(jié)果婚禮上庆寺,老公的妹妹穿的比我還像新娘。我一直安慰自己诉字,他們只是感情好止邮,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏窑,像睡著了一般导披。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埃唯,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天撩匕,我揣著相機與錄音,去河邊找鬼墨叛。 笑死止毕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的漠趁。 我是一名探鬼主播扁凛,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闯传!你這毒婦竟也來了谨朝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤甥绿,失蹤者是張志新(化名)和其女友劉穎字币,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體共缕,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡洗出,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了图谷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩活。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡阱洪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菠镇,到底是詐尸還是另有隱情澄峰,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布辟犀,位于F島的核電站俏竞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堂竟。R本人自食惡果不足惜魂毁,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望出嘹。 院中可真熱鬧席楚,春花似錦、人聲如沸税稼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郎仆。三九已至只祠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扰肌,已是汗流浹背抛寝。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曙旭,地道東北人盗舰。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像桂躏,于是被迫代替她去往敵國和親钻趋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    仇諾伊閱讀 4,535評論 7 59
  • 昨天開家長會土至,小孩非要跟著购对,她同意了猾昆。開家長會的過程中,小孩在教室里骡苞。把一些小東西小玩具弄得有點兒想垂蜗。她非常擔(dān)心老...
    劉姥姥2017閱讀 1,586評論 0 0
  • if 條件選擇楷扬,選擇執(zhí)行,可嵌套 逐條件進行判斷贴见,第一次遇為“真”條件時烘苹,執(zhí)行其分支,而后結(jié)束整個if語句 例子:...
    素瑾汐閱讀 343評論 0 1
  • 自從在那小得不起眼片部,也許老石浦人都未必知道的文化館中借來了汪曾祺的<<人間滋味>>以后镣衡,每天早飯前后都會拿出來讀幾...
    艾字閱讀 945評論 7 49