1.什么是Activity?問的不太多访雪,說點有深度的
四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activity
setContentView() ,// 要顯示的布局
, activity 是Context的子類,同時實現(xiàn)了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.
button.setOnclickLinstener{
}
我開發(fā)常用的的有ListActivity, PreferenceActivity ,TabAcitivty等…
PreferenceActivity與設(shè)置有關(guān)的activity
TabActivity就是有一個Tabhost
如果界面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.
界面的初始化详瑞,進度對話框的顯示與銷毀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
其實這些方法都是兩兩對應(yīng)的:
onCreate創(chuàng)建與onDestroy銷毀;
onStart可見與onStop不可見精置;
onResume可編輯(即焦點)與onPause计寇;
對話框是activity的一部分.
所以對話框的彈出,指定上下文必須是 Activity.this
所以彈出對話框(對話框獲取焦點)不會調(diào)用任何生命周期方法
這6個方法是相對應(yīng)的,那么就只剩下一個onRestart方法了,這個方法在什么時候調(diào)用呢番宁?
答案就是:在Activity被onStop后元莫,但是沒有被onDestroy,在再次啟動此Activity時就調(diào)用onRestart(而不再調(diào)用onCreate)方法蝶押;
如果被onDestroy了踱蠢,則是調(diào)用onCreate方法。
最后講自己項目中的經(jīng)驗,比如說豆瓣客戶端每次進入某個界面的時候都要看到最新的數(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 ,當在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時,切屏會重新調(diào)用各個生命周期
默認首先銷毀當前activity,然后重新加載
onpause onstop ondestory oncreate onstart onresume
2招刨、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期哀军,只會執(zhí)行onConfigurationChanged方法
Api13以上還需要給configChanges配置screensize一個值
游戲開發(fā)中, 屏幕的朝向都是寫死的. 因為如果可以切換橫豎屏沉眶,那么用戶體驗不好,而且還要保持游戲相關(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)回收之前保存當前狀態(tài)?
除了在棧頂?shù)腶ctivity,其他的activity都有可能在內(nèi)存不足的時候被系統(tǒng)回收,一個activity越處于棧底,被回收的可能性越大.
當activity被系統(tǒng)異郴辔澹回收時調(diào)用onSaveInstanceState方法
protectedvoidonSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
publicvoidonCreate(Bundle savedInstanceState) {
//判斷 savedInstanceState是不是空.
//如果不為空就取出來
super.onCreate(savedInstanceState);
}
7.如何退出Activity孽查?如何安全退出已調(diào)用多個Activity的Application?
應(yīng)用場景坦喘,例如UC瀏覽器盲再,你打開了100個頁面,然后通常做法是點擊返回瓣铣,點擊100次才能正常退出Application答朋。這樣用戶體驗太差,UC瀏覽器的菜單提供了退出按鈕棠笑,點擊退出即可安全退出應(yīng)用梦碗。
退出activity 直接調(diào)用 finish () 方法 . //用戶點擊back鍵 就是退出一個activity
退出activity 會執(zhí)行 onDestroy()方法 .
做法:
1、拋異常強制退出:測試沒通過?
該方法通過拋異常,使程序Force Close叉弦。 Force close欺殿,系統(tǒng)會清空我們的任務(wù)棧渔彰,清空所有打開的界面。
驗證可以,但是渣淳,需要解決的問題是,如何使程序結(jié)束掉寝凌,而不彈出Force Close的窗口畔濒。
//安全結(jié)束進程android.os.Process.killProcess(android.os.Process.myPid());
2、記錄打開的Activity:
思路:
每打開一個Activity晶乔,通過就記錄下來珍坊。手動退出時,就移除集合正罢。點擊退出按鈕時阵漏,循環(huán)關(guān)閉集合中的Activity。
步驟:
定義MyApp 繼承Application翻具,然后再清單文件中給Application節(jié)點指定name為MyApp履怯。
定義成員變量List lists ;
在生命周期方法onCreate方法中初始化:lists = new ArrayList();
每一個activity在執(zhí)行onCreate()方法的時候 lists.add(this);
Ondestory() lists.remove(this);
當點擊退出按鈕時,循環(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()方法 把當前的activity finish()掉
4、遞歸退出(不推薦)
在打開新的Activity時使用startActivityForResult闻葵,然后自己加標志民泵,在onActivityResult中處理,遞歸關(guān)閉槽畔。
404 退出程序
OnActivityResult();
*講一講你對activity的理解 (有些公司會出一些這種題目洪灯,對xxx的理解)
把自己的心得寫出來即可。
Activity用于與用戶交互竟痰。
在講一講Activity的生命周期签钩,可以利用這些生命周期方法做初始化,
例如:進入某個界面的時候都要看到最新的數(shù)據(jù)坏快,就要在onstart方法內(nèi)填充數(shù)據(jù)铅檩。
還有處理橫豎屏時,Activity會摧毀重構(gòu)莽鸿,我們在特殊場景需要做特殊處理昧旨,
例如:播放器拾给,正播放時,打入電話兔沃,我們需要在onstop方法保存播放進度蒋得,然后再onstart方法內(nèi)讀取進度,繼續(xù)播放乒疏。
游戲额衙,固定橫豎屏。
簡單介紹onPostResume() 和 OnPostCreate
Activity被系統(tǒng)回收時怕吴,需要做的一些操作:重寫onSaveInstanceState
打開多個Activity窍侧,如何安全退出Application
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();
特殊情況,可以在清單文件配置 service 執(zhí)行所在的進程 ,
讓service在另外的進程中執(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ù)
自己去實現(xiàn)自己的application的這個類,基礎(chǔ)系統(tǒng)的application ,每個activity都可以取到
利用這點伟件,我們可以在Application 定義全局變量 ,然后通過這個變量來存儲數(shù)據(jù)。
讓對象實現(xiàn) implementsSerializable接口把對象存放到文件上.
讓類實現(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
谷歌工程師認為议经,將文件通過Serializable序列化到文件斧账,然后再讀取文件內(nèi)容加載到內(nè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單獨的任務(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,因為他們默認沒有任務(wù)棧篮幢,所以需要設(shè)置flag大刊。設(shè)置這個Flag之后,在開啟Activity時三椿,會判斷當前有木有存在任務(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
{
//這個方法是異步操作剂陡,可能花費幾秒的時間,所以執(zhí)行完bindService是需要花費一定時間才能獲取服務(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公荧,然后處于運行狀態(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)什么情況呢见转?
如果我們業(yè)務(wù)邏輯比較復(fù)雜,那么有可能需要讓服務(wù)長期在后臺運行蒜哀,并且還需要調(diào)用service的方法斩箫,那么就需要既開啟服務(wù),又綁定服務(wù)撵儿。
那么有一個原則是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ù)播放音樂.
不能通過onSaveInstanceStates來實現(xiàn)逾条,因為他是activity被移除任務(wù)棧才執(zhí)行的。
16.什么是IntentService投剥?有何優(yōu)點师脂?
IntentService繼承Service
普通的service ,默認運行在ui main 主線程
Sdk給我們提供的方便的,帶有異步處理的service類,
異步處理的方法OnHandleIntent(),默認運行在子線程中江锨,可以處理耗時的操作
17.什么時候使用Service吃警?
官方文檔告訴我們,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可以使用setForeground(true)方法來將service設(shè)置為前臺狀態(tài)饰迹,那么系統(tǒng)就認為是對用戶可見的芳誓,并不會在內(nèi)存不足時killed。
如果有其他的應(yīng)用組件作為Service,Activity等運行在相同的進程中啊鸭,那么將會增加該進程的重要性锹淌。
1.Service的特點可以讓他在后臺一直運行,可以在service里面創(chuàng)建線程去完成耗時的操作. 天氣預(yù)報 widget TimerTask Timer 定期執(zhí)行timertask
2.Broadcast receiver捕獲到一個事件之后,可以啟動一個service來完成一個耗時的操作.
Broadcast receiver生命周期 和 響應(yīng)時間很短(10s)
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: 動作Intent.ation_view
Data: 數(shù)據(jù)uriurimime
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"/>
電話的uritel: 12345
http://www.baidu.com
自己定義的uriitcast://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.getStringextra();
2. 數(shù)據(jù)的uri, intent.setData()intent.getData();
20.說說Activity赊堪,Intent,Service是什么關(guān)系 竖哩。筆試常問
這種問題沒什么水準雹食,相當于麥當勞和麥當娜的關(guān)系是什么關(guān)系?
他們默認情況下是沒有什么關(guān)系的。
這種問題,就講下對activity, service,intent的理解期丰。
再說一下 activity群叶、service可以通過intent去激活組件,傳遞數(shù)據(jù).
說自己項目中有這樣一個網(wǎng)絡(luò)更新的功能,顯示界面就用的activity, 后臺有個service每隔半小時都去訪問下服務(wù)器獲取更新的數(shù)據(jù)…
開啟服務(wù)用的是intent來開啟
注意所有的筆試,都要盡量說一下自己的項目的一些內(nèi)容钝荡。
21.請描述一下Broadcast Receiver街立。
廣播是Android系統(tǒng)的一個事件,如果
有很多廣播接收者 ,系統(tǒng)已經(jīng)實現(xiàn)了.
廣播分兩種
有序廣播:同步埠通,優(yōu)先級高的廣播赎离,會先接收到廣播。
無序廣播:異步
優(yōu)先級使用:如果優(yōu)先級一樣端辱,app的uid越低越先接收到廣播(先安裝的應(yīng)用程序的uid會低一點梁剔。)
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來實現(xiàn)的颊亮,因為獲取wifi狀態(tài)改變是一個很耗時的操作,如果用一般發(fā)送廣播方式陨溅,還沒等wifi狀態(tài)獲取完终惑,廣播就結(jié)束了。用于接收系統(tǒng)的廣播通知, 系統(tǒng)會有很多sd卡掛載,手機重啟,廣播通知,低電量,來短信等,一個apk的安裝成功…
手機衛(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裝到手機上门扇,這個廣播接收者就生效
代碼注冊:只有當代碼執(zhí)行時雹有,才會生效
22.在manifest和代碼中如何注冊和使 用broadcast receiver。
設(shè)置廣播接收者的優(yōu)先級,設(shè)置廣播接受者的action名字 等…
詳細見工程代碼.
代碼中注冊,如果代碼沒有執(zhí)行,就接受不到廣播事件
registerReceiver(receiver,filter);
23.請介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的悯嗓。
ContentProvider是系統(tǒng)的一個服務(wù)件舵,我們要實現(xiàn)數(shù)據(jù)共享需要重寫ContentProvider
把自己的數(shù)據(jù)通過uri的形式共享出去
android系統(tǒng)下 不同程序 數(shù)據(jù)默認是不能共享訪問
需要去實現(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ù)匹配碼 查看增刪改查的具體實現(xiàn)
24.請介紹下Android的數(shù)據(jù)存儲方式卸察。
文件可以存到手機的內(nèi)存脯厨,和sdcard中
手機內(nèi)存文件存放位置: /data/data/包名/files
可以通過context.openFileInput(name)默認是私有的訪問權(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的實現(xiàn)上有什么差別稼跳?
可以根據(jù)自己的業(yè)務(wù)邏輯暴露相應(yīng)操作盟庞,屏蔽數(shù)據(jù)存儲的細節(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
從屏幕的左上角開始布局,疊加顯示,
實際應(yīng)用 播放器的暫停按鈕.
獲取數(shù)據(jù)時設(shè)置進度條的對話框
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.apkfwvga854*480320*240
許多游戲還在使用絕對布局竹揍,因為絕對布局可以精準的知道組件的位置敬飒,可以做相應(yīng)的點擊事件。
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
有關(guān)布局的問題:平板的開發(fā)與手機的開發(fā)有什么樣的區(qū)別:
區(qū)別主要區(qū)別在UI上闪金。
平板任務(wù)管理器的界面布局用 gridview
手機 任務(wù)管理 listview
27.談?wù)?/b>UI中,Padding和Margin有什么區(qū)別?
Padding 文字對邊框, margin是控件與控件之間的距離
28. widget相對位置的完成在activity的哪個生命周期階段實現(xiàn)哎垦。
這個題沒看懂…
widget可以理解成桌面小控件,
onReceive方法囱嫩,廣播接收者?
也可以理解成 某個button, imageview這樣的控件…
onMeasure() // 計算 控件在屏幕上的位子
onDraw 顯示到界面上的
29.請解釋下在單線程模型中Message漏设、Handler墨闲、Message Queue、Looper之間的關(guān)系郑口。
Activity的主線程被創(chuàng)建時鸳碧,系統(tǒng)默認會幫創(chuàng)建Looper,然后會自動調(diào)用looper的parepare方法犬性,讓輪詢器待命杆兵。
主線程中還有一個Message Queue的arrayList集合
因為只有主線程才可以更新UI,所以子線程A仔夺、子線程B要想更新UI见间,必須通過Handler去發(fā)送消息礼饱。發(fā)送的消息被放到Message Queue隊列中继蜡,然后這個Looper輪詢器溺健,會不停的輪詢Message Queue隊列中的消息,如果發(fā)現(xiàn)有需要處理的消息惰蜜,就會調(diào)用Message的handleMessage方法昂拂。
如何在子線程里面 顯示土司?
手工調(diào)用:Looper.parepare();
顯示Toast
手工輪詢一次抛猖,發(fā)送消息:Looper.loop();
子線程中如果使用Looper格侯,就不能再使用handler去發(fā)送消息,因為Looper會將消息發(fā)送給主線程财著。
30. AIDL的全稱是什么联四?如何工作?**
Android interface definition language (android接口定義語言) ,
用來跨進程的訪問方法,
訪問遠程的服務(wù)的方法. 如何工作 手機衛(wèi)士程序鎖
.endcall();
手機衛(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)系人等..安裝的時候會提示用戶…
文件系統(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)品的操作收苏,先查找手機里是否符合這個action的activity,如果沒有就提示用戶是否下載自己的產(chǎn)品:
queryIntentActivity();
33.對android主線程的運用和理解
四大組件都是維護在主線程里
系統(tǒng)事件:低電量廣播愤兵,sd卡掛載廣播也是主線程來維護的鹿霸。
主ui線程不能執(zhí)行耗時的操作,不然會報anr異常
34.對android虛擬機的理解,包括內(nèi)存管理機制垃圾回收機制秆乳。
Android虛擬機很小,空間很小,談?wù)勔苿釉O(shè)備的虛擬機的大小限制 默認 16M
由于每個應(yīng)用所能使用的默認內(nèi)存大小是16M懦鼠,所有可以談?wù)劶虞d圖片的時候怎么處理大圖片的?
使用BitMap來對圖片進行縮放。如何做***
垃圾回收,沒有引用的對象(對象=null),或者是離開作用空間(局部變量)葛闷,在某個時刻會被系統(tǒng)gc掉.
System.gc(); 顯示通知系統(tǒng)是回收垃圾憋槐,不是立刻去執(zhí)行垃圾回收.
手機電視項目
獲取300個頻道圖片( 30K)將圖片給gallery 双藕,由于圖片過多淑趾,有的頻道界面圖片是白板.
需要在gallery 顯示圖標的activity的ondestory中調(diào)用gc();回收圖片資源
35.Framework工作方式及原理,Activity是如何生成一個view的忧陪,機制是什么扣泊。
反射 , 配置文件 (所有框架都是這倆結(jié)合,框架工作原理嘶摊,讀取配置文件延蟹,實例化對象,調(diào)用對象中的方法)
普通的情況:
Activity創(chuàng)建一個view是通過 ondraw 畫出來的, 畫這個view之前呢,還會調(diào)用onmeasure方法來計算顯示的大小.
復(fù)雜情況:
Surfaceview直接操作硬件子類:opengl .GLSurfaceView
他會將顯卡緩存里的內(nèi)容顯示到界面上叶堆。
這樣速度會比較快阱飘,游戲開發(fā)經(jīng)常用到。
MediaPlayer虱颗、OpenGL沥匈,直接將數(shù)據(jù)寫到顯存里,顯卡獲取顯存內(nèi)容進行顯示忘渔。
36. android本身的一些限制高帖,比如apk包大小限制,讀取大文件時的時間限畦粮。
這個問題問的有問題, apk包大小限制不好說,這個是根據(jù)手機硬件而定的散址。
極品飛車有100M 還是能裝到手機上,
// 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虛擬機,目標,加快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) 來實現(xiàn)優(yōu)化儒将。
圖片緩存师崎,檢測圖片是否失效
通過Http 請求
If-modify-since : 檢查數(shù)據(jù)是否更新如果是302 拿緩存
39.啟動應(yīng)用后,改變系統(tǒng)語言椅棺,應(yīng)用的語言會改變么犁罩?
會两疚,老版本sdk不會递胧,新版本會
40.啟動一個程序辙纬,可以主界面點擊圖標進入沟使,也可以從一個程序中跳轉(zhuǎn)過去客们,二者有什么區(qū)別?
如果在主界面點擊圖片進入應(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.Android中Task任務(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實際上是一個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é)束休弃。
如上表所示吞歼,是一個實例。從用戶從進入郵箱開始塔猾,到回復(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 (按照功能拆分,然后搞一個主界面沼填,調(diào)用每個功能桅咆,然后每個功能的apk的activity都需要在相同的任務(wù)棧內(nèi)運行,這時就需要用到姻緣關(guān)系坞笙。)
●Activity的android:taskAffinity=""屬性 姻緣關(guān)系A(chǔ)ffinity
1.配置后 當啟動這個activity時就先去找有沒有activity的親和力屬性相同 有就加入這個activity所在的任務(wù)中沒有就新開任務(wù)
2.affinity起作用需要的條件 必須具備以下任意一個:
1.intent包含F(xiàn)LAG_ACTIVITY_NEW_TASK標記
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訪問遠程服務(wù)的例子.***
45.在Android中是如何實現(xiàn)判斷區(qū)分電話的狀態(tài),去電寞冯,來電渴析、未接來電?
Day8 showAddressService.java***
未接來電:是有raning狀態(tài)直接到idle狀態(tài)吮龄,我們可以記錄這倆狀態(tài)的時間俭茧,如果時間間隔過短,就說明是未接漓帚。
46. dvm的進程和Linux的進程,應(yīng)用程序的進程是否為同一個概念
Dvm的進程是dalivk虛擬機進程,每個android程序都運行在自己的進程里面,
每個android程序系統(tǒng)都會給他分配一個單獨的liunxuid(user id),
每個dvm都是linux里面的一個進程.所以說這兩個進程是一個進程.
47. sim卡的EF文件有何作用 (百度)
Sim卡相關(guān)的東西,沒接觸過
文件規(guī)范.
遇到新的知識點母债,沒接觸過,不過空著尝抖。
我們可以答毡们,通過閱讀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)存空間的引用悔据。消耗了一定空間
頁通過計算的方式,去定位特定的內(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)核的早歇,因此屬于軟實時倾芝。
實時操作系統(tǒng):能夠快速響應(yīng)操作的系統(tǒng),windows箭跳、linux都是蛀醉。
實時操作系統(tǒng)的原理:
硬實時. 軍工系統(tǒng),火星探測車( Vxworks操作系統(tǒng)) (一旦有一個事件產(chǎn)生衅码,我立馬放下所有的事情去執(zhí)行事件)
軟實時.調(diào)度算法(當一個事件產(chǎn)生時拯刁,根據(jù)算法來判斷要隔多長時間執(zhí)行),我們用的一般的系統(tǒng)都是軟實時的逝段。
51.一條最長的短信息約占多少byte?
一般情況下是中文70字符(包括標點)垛玻,英文160個字節(jié)
但是根據(jù)手機制式運營商的不同,短信長度也不同
做實驗,看divideMessage方法的源碼
他會判斷奶躯,手機網(wǎng)絡(luò)制式去做限制帚桩。
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ù)剬?/b>Android NDK的理解袄秩。
NDK:native develop kit只是一個交叉編譯的工具,調(diào)用C代碼逢并。
1.什么時候用ndk,實時性要求高,游戲,圖形渲染
opencv (人臉識別) , ffmpeg , rmvbmp5 avi 高清解碼. ffmpeg, opencore.
2.為什么用ndk,ndk的優(yōu)點 ,缺點,
優(yōu)點:效率比較高之剧,復(fù)用c代碼
缺點:代碼編寫比較麻煩,問題不好解決
再介紹我們項目中那些地方用到了ndk, c opengl砍聊?**
54.談?wù)?/b>Android的優(yōu)點和不足之處背稼。不懂技術(shù)的人會問。
1玻蝌、開放性,開源ophone阿里云( 完全兼容android) 樂os
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)存泄露工具
導致內(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)存泄露的根本原因就是保存了不可能再被訪問的變量類型的引用
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ù)字證書用于標識應(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…AsynsTask , 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)非洲,類似電影鸭限。
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就可以完成程序的自動安裝,描述下原理
Android基礎(chǔ):Day11AddJavascriptInterface**
通過javascript調(diào)用java代碼
64.Service和Activity在同一個線程嗎
默認情況同一線程 main主線程 ui線程
65.java中的soft reference是個什么東西
StrongReference 是 Java 的默認引用實現(xiàn), 它會盡可能長時間的存活于 JVM 內(nèi), 當沒有任何對象指向它時 GC 執(zhí)行后將會被回收
SoftReference 會盡可能長的保留引用直到 JVM 內(nèi)存不足時才會被回收(虛擬機保證), 這一特性使得 SoftReference 非常適合內(nèi)存緩存
66.udp連接和TCP的不同之處
Tcp:就像打電話冶伞,滑動窗口協(xié)議. 擁塞控制.
udp 不關(guān)心數(shù)據(jù)是否達到,以數(shù)據(jù)包的形式傳遞新症。是否阻塞
qq視頻:
畫面優(yōu)先. tcp
流暢優(yōu)先udp
qq發(fā)信息:udp,但是有時候會出現(xiàn) 某信息 未送達的提示响禽,這是qq發(fā)信息的同時徒爹,會等待回執(zhí)信息(udp發(fā)送),如果接受到這個信息芋类,就說明發(fā)送成功隆嗅。
如果沒有接受到,就說明發(fā)送失敗侯繁,但有時候?qū)Ψ绞盏搅伺衷瑓s提示自己發(fā)送失敗,原因是這個回執(zhí)信息在發(fā)送過程中丟失了贮竟。
67. android開發(fā)中怎么去調(diào)試bug
邏輯錯誤
1.斷點 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. ddms和traceview的區(qū)別.
daivilk debug manager system
查看進程粹懒、查看文件重付、模擬電話、短信凫乖,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)鍵性能指標:
指標:如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:抽取所有界面元件的聲明和定義,整合到單獨一個函數(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)該寫在哪里,最終使維護和擴展代碼變得更加容易赘那!
其實刑桑,重構(gòu)很簡單,通讀代碼募舟,感覺哪邊不太爽祠斧,就改那邊吧!(我目前的感受)
一個良好的代碼應(yīng)該是能讓人感到舒服的拱礁!
總結(jié):
關(guān)于項目
在就是你項目經(jīng)驗琢锋,一定要突出你遇到什么難點,然后是怎么解決的呢灶!把問題引導到你熟悉的領(lǐng)域,或者知識點上,盡量將每個技術(shù)點細節(jié)凸顯出來吴超,
心態(tài):
什么樣的面試官都有,去面試的時候要做好一切心理準備填抬,不管是技術(shù)還是基礎(chǔ)都得扎實烛芬。一個人的交談能力也很重要,總之不是非常標準的普通話飒责, 最起碼你說的得讓別人聽得懂赘娄,而且得把面試官講得非常徹底,這樣你獲得offer的機會更大宏蛉,談工資也有優(yōu)勢~~