Android 中數(shù)據(jù)存儲方式有哪些岸霹?
xml、sharedpreferences裁蚁、SQLiteDataBase、ContentProvider继准、文件存儲枉证,網(wǎng)絡(luò)存儲
Android 的安全機(jī)制
1、Android 是基于Linux 內(nèi)核的移必,因此Linux 對文件權(quán)限的控制同樣適用于Android
在Android 中每個應(yīng)用都有自己的/data/data/包名文件夾室谚,該文件夾只能該應(yīng)用訪問,而其他應(yīng)用則無權(quán)訪問崔泵。
2秒赤、Android 的權(quán)限機(jī)制保護(hù)了用戶的合法權(quán)益
如果我們的代碼想撥打電話、發(fā)送短信憎瘸、訪問通信錄入篮、定位、訪問sdcard 等所有可能侵犯用于權(quán)益的行為都是必須要在AndroidManifest.xml 中進(jìn)行聲明的幌甘,這樣就給了用戶一個知情權(quán)潮售。
3、Android 的代碼混淆保護(hù)了開發(fā)者的勞動成果
Android 的四大組件都需要在清單文件中注冊嗎锅风?
Activity 酥诽、Service 、ContentProvider 如果要使用則必須在AndroidManifest.xml 中進(jìn)行注冊皱埠, 而
BroadcastReceiver 則有兩種注冊方式肮帐,靜態(tài)注冊和動態(tài)注冊。其中靜態(tài)注冊就是指在AndroidManifest.xml 中進(jìn)行注冊边器,而動態(tài)注冊時通過代碼注冊
Android 中進(jìn)程的級別有哪些训枢?
Foreground process、Visible process饰抒、Service process、Background process诀黍、Empty process
Activity 的狀態(tài)都有哪些袋坑?
Foreground Activity、Visible Activity、Background process枣宫、Empty process
Activity 生命周期?here
如何保存Activity 的狀態(tài)婆誓?
Activity 的狀態(tài)通常情況下系統(tǒng)會自動保存的,只有當(dāng)我們需要保存額外的數(shù)據(jù)時才需要使用到這樣的功能也颤。
一般來說, 調(diào)用onPause()和onStop()方法后的activity 實(shí)例仍然存在于內(nèi)存中, activity 的所有信息和狀態(tài)數(shù)據(jù)不會消失, 當(dāng)activity 重新回到前臺之后, 所有的改變都會得到保留洋幻。
但是當(dāng)系統(tǒng)內(nèi)存不足時, 調(diào)用onPause()和onStop()方法后的activity 可能會被系統(tǒng)摧毀, 此時內(nèi)存中就不會存有該activity 的實(shí)例對象了。如果之后這個activity 重新回到前臺, 之前所作的改變就會消失翅娶。為了避免此種情況的發(fā)生文留,我們可以覆寫onSaveInstanceState()方法。onSaveInstanceState()方法接受一個Bundle 類型的參數(shù), 開發(fā)者可以將狀態(tài)數(shù)據(jù)存儲到這個Bundle 對象中, 這樣即使activity 被系統(tǒng)摧毀, 當(dāng)用戶重新啟動這個activity 而調(diào)用它的onCreate()方法時, 上述的Bundle 對象會作為實(shí)參傳遞給onCreate()方法, 開發(fā)者可以從Bundle 對象中取出保存的數(shù)據(jù), 然后利用這些數(shù)據(jù)將activity 恢復(fù)到被摧毀之前的狀態(tài)竭沫。
需要注意的是, onSaveInstanceState()方法并不是一定會被調(diào)用的, 因?yàn)橛行﹫鼍笆遣恍枰4鏍顟B(tài)數(shù)據(jù)的. 比如用戶按下BACK 鍵退出activity 時, 用戶顯然想要關(guān)閉這個activity, 此時是沒有必要保存數(shù)據(jù)以供下次恢復(fù)的, 也就是onSaveInstanceState()方法不會被調(diào)用. 如果調(diào)onSaveInstanceState()方法, 調(diào)用將發(fā)生在onPause()或onStop()方法之前燥翅。
橫豎屏切換時Activity 的生命周期
不設(shè)置Activity 的android:configChanges,切屏?xí)匦抡{(diào)用各個生命周期蜕提。默認(rèn)先銷毀然后重新加載森书。
設(shè)置Activity 的android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會重新調(diào)用各個生命周期谎势,只會執(zhí)行onConfigurationChanged 方法
將一個Activity 設(shè)置成窗口的樣式
Activity 配置屬性凛膏。android:theme="@android:style/Theme.Dialog"
如何退出Activity?如何安全退出已調(diào)用多個Activity 的Application脏榆?
1猖毫、記錄打開的activity,遍歷數(shù)組去finish
2姐霍、發(fā)送特定廣播
Activity四種啟動模式
1鄙麦、standard:進(jìn)出棧,沒有特別的
2镊折、singleTop:如果在棧頂胯府,就不會new對象
3、singleTask:在此Activity頂部的會出棧
4恨胚、singleInstance:獨(dú)占一個棧
在AndroidManifest.xml里面有局限性骂因,一般是在intent.setFlags里設(shè)置FLAG_ACTIVITY_CLEAR_TOP and FLAG_ACTIVITY_SINGLE_TOP使用,可以更加靈活的達(dá)到singleTask和singleTop的效果赃泡。
Service 的生命周期?here
什么是IntentService寒波??here
Service 里面可以彈吐司么?
可以升熊。有一個Context 就行
Activity 調(diào)用Service 中的方法?here
Activity 如何給Service 發(fā)送Message俄烁?
Service 如何給Activity 發(fā)送Message??activity和service通信
描述BroadcastReceiver
無序廣播:完全異步级野,邏輯上可以被任何廣播接收者接收到页屠。優(yōu)點(diǎn)是效率較高。缺點(diǎn)是一個接收者不能將處理結(jié)果傳遞給下一個接收者,并無法終止廣播intent 的傳播辰企。
有序廣播:按照被接收者的優(yōu)先級順序风纠,在被接收者中依次傳播。比如有三個廣播接收者A牢贸,B竹观,C,優(yōu)先級是A >B > C潜索。那這個消息先傳給A臭增,再傳給B,最后傳給C帮辟。每個接收者有權(quán)終止廣播速址,比如B 終止廣播,C 就無法接收到由驹。
本地廣播:
全局廣播:
此外A 接收到廣播后可以對結(jié)果對象進(jìn)行操作芍锚,當(dāng)廣播傳給B 時,B 可以從結(jié)果對象中取得A 存入的數(shù)據(jù)
Android常用布局
FrameLayout蔓榄、RelativeLayout并炮、LinearLayout、AbsoluteLayout甥郑、TableLayout逃魄、GrideLayout(Android 4.0 推出)
Android 中布局的優(yōu)化措施都有哪些?
1澜搅、盡可能減少布局的嵌套層級:
可以使用sdk 提供的hierarchyviewer 工具分析視圖樹伍俘,幫助我們發(fā)現(xiàn)沒有用到的布局。
2勉躺、不用設(shè)置不必要的背景癌瘾,避免過度繪制:
比如父控件設(shè)置了背景色,子控件完全將父控件給覆蓋的情況下饵溅,那么父控件就沒有必要設(shè)置背景妨退。
3、使用標(biāo)簽復(fù)用相同的布局代碼:
4蜕企、使用標(biāo)簽減少視圖層次結(jié)構(gòu):
5咬荷、通過實(shí)現(xiàn)View 的延遲加載:
ListView 如何提高其效率?
1轻掩、復(fù)用ConvertView
2幸乒、自定義靜態(tài)類ViewHolder
3、分頁加載
4唇牧、使用WeakReference引用ImageView
更新ListView
使用adapter的notifyDataSetChanged()罕扎,使listView重新繪制
ListView 可以顯示多種類型的條目嗎基茵?
這個當(dāng)然可以的,ListView 顯示的每個條目都是通過baseAdapter 的getView(int position, View convertView,ViewGroup parent)來展示的壳影,理論上我們完全可以讓每個條目都是不同類型的view,除此之外adapter 還提供了getViewTypeCount()和getItemViewType(int position)兩個方法弥臼。在getView 方法中我們可以根據(jù)不同的viewtype 加載不同的布局文件宴咧。
ListView 如何定位到指定位置
list.setSelection(position);
如何在ScrollView 中如何嵌入ListView
通常情況下我們不會在ScrollView 中嵌套ListView,但是如果面試官非讓我嵌套的話也是可以的径缅。
在ScrollView 添加一個ListView 會導(dǎo)致listview 控件顯示不全掺栅,通常只會顯示一條,這是因?yàn)閮蓚€控件的滾動事件沖突導(dǎo)致纳猪。所以需要通過listview 中的item 數(shù)量去計算listview 的顯示高度氧卧,從而使其完整展示。
ListView 中如何優(yōu)化圖片
1氏堤、處理圖片的方式:
如果ListView 中自定義的Item 中有涉及到大量圖片的沙绝,一定要對圖片進(jìn)行細(xì)心的處理,因?yàn)閳D片占的內(nèi)存是ListView 項(xiàng)中最頭疼的鼠锈,處理圖片的方法大致有以下幾種:
①闪檬、不要直接拿路徑就去循環(huán)BitmapFactory.decodeFile;使用Options 保存圖片大小、不要加載圖片到內(nèi)存去购笆。
②粗悯、對圖片一定要經(jīng)過邊界壓縮尤其是比較大的圖片,如果你的圖片是后臺服務(wù)器處理好的那就不需要了
③同欠、在ListView 中取圖片時也不要直接拿個路徑去取圖片样傍,而是以WeakReference(使用WeakReference 代替強(qiáng)引用。比如可以使用WeakReference mContextRef)铺遂、SoftReference衫哥、WeakHashMap 等的來存儲圖片信息。
④娃循、在getView 中做圖片轉(zhuǎn)換時炕檩,產(chǎn)生的中間變量一定及時釋放
2、異步加載圖片基本思想:
1)捌斧、先從內(nèi)存緩存中獲取圖片顯示(內(nèi)存緩沖)
2)笛质、獲取不到的話從SD 卡里獲取(SD 卡緩沖)
3)捞蚂、都獲取不到的話從網(wǎng)絡(luò)下載圖片并保存到SD 卡同時加入內(nèi)存并顯示(視情況看是否要顯示)
原理:
優(yōu)化一:先從內(nèi)存中加載妇押,沒有則開啟線程從SD 卡或網(wǎng)絡(luò)中獲取,這里注意從SD 卡獲取圖片是放在子線程里執(zhí)
行的姓迅,否則快速滑屏的話會不夠流暢敲霍。
優(yōu)化二:于此同時俊马,在adapter 里有個busy 變量,表示listview 是否處于滑動狀態(tài)肩杈,如果是滑動狀態(tài)則僅從內(nèi)存中獲取圖片柴我,沒有的話無需再開啟線程去外存或網(wǎng)絡(luò)獲取圖片。
優(yōu)化三:ImageLoader 里的線程使用了線程池扩然,從而避免了過多線程頻繁創(chuàng)建和銷毀艘儒,如果每次總是new 一個線程去執(zhí)行這是非常不可取的,好一點(diǎn)的用的AsyncTask 類夫偶,其實(shí)內(nèi)部也是用到了線程池界睁。在從網(wǎng)絡(luò)獲取圖片時,先是將其保存到sd 卡兵拢,然后再加載到內(nèi)存翻斟,這么做的好處是在加載到內(nèi)存時可以做個壓縮處理,以減少圖片所占內(nèi)存说铃。
ListView 中圖片錯位的問題是如何產(chǎn)生的?here
scrollView 嵌套listview 方式除了測量還有什么方法访惜?
Android 中如何調(diào)用C 語言
當(dāng)我們的Java 需要調(diào)用C 語言的時候可以通過JNI 的方式,Java Native Interface腻扇。Android 提供了對JNI 的支持疾牲,因此我們在Android 中可以使用JNI 調(diào)用C 語言。在Android 開發(fā)目錄的libs 目錄下添加xxx.so 文件衙解,不過xxx.so文件需要放在對應(yīng)的CPU 架構(gòu)名目錄下阳柔,比如armeabi,x86 等蚓峦。
在Java 代碼需要通過System.loadLibrary(libName);加載so 文件舌剂。同時C 語言中的方法在java 中必須以native 關(guān)鍵字來聲明。普通Java 方法調(diào)用這個native 方法接口暑椰,虛擬機(jī)內(nèi)部自動調(diào)用so 文件中對應(yīng)的方法霍转。
播放網(wǎng)絡(luò)視頻
除了使用Android 提供的MediaPlayer 和VideoView 外通常還可以使用第三方開源萬能播放器,ijkplayer一汽,VitamioPlayer等
Serializable 和Parcelable 的區(qū)別?here?and?here
Intent 和Intentfilter?here