android的動(dòng)畫有哪幾種?他們的特點(diǎn)和區(qū)別是什么?
答:兩種,一種是tween動(dòng)畫,一種是frame動(dòng)畫。tween動(dòng)畫,這種實(shí)現(xiàn)方式可以使視圖組件移動(dòng),放大或縮小以及產(chǎn)生透明度的變化。frame動(dòng)畫,傳統(tǒng)的動(dòng)畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。
handler進(jìn)制的原理:
答:android提供了handler和looper來滿足線程間的通信。Handler先進(jìn)先出原則。looper用來管理特定線程內(nèi)對(duì)象之間的消息交換(message Exchange).
1)looper:一個(gè)線程可以產(chǎn)生一個(gè)looper對(duì)象,由它來管理此線程里的message queue(消息隊(duì)列)
2)handler:你可以構(gòu)造一個(gè)handler對(duì)象來與looper溝通,以便push新消息到messagequeue里;或者接收looper(從messagequeue里取出)所送來的消息。
3)messagequeue:用來存放線程放入的消息。
4)線程:UI thread 通常就是main thread,而android啟動(dòng)程序時(shí)會(huì)為它建立一個(gè)message queue.
Activity的生命周期:
答:onCreate: 在這里創(chuàng)建界面,做一些數(shù)據(jù) 的初始化工作
onStart: 到這一步變成用戶可見不可交互的
onResume:變成和用戶可交互 的,(在activity 棧系統(tǒng)通過棧的方式管理這些個(gè)Activity的最上面,運(yùn)行完彈出棧,則回到上一個(gè)Activity)
onPause: 到這一步是可見但不可交互的,系統(tǒng)會(huì)停止動(dòng)畫 等消耗CPU 的事情從上文的描述已經(jīng)知道,應(yīng)該在這里保存你的一些數(shù)據(jù),因?yàn)檫@個(gè)時(shí)候你的程序的優(yōu)先級(jí)降低,有可能被系統(tǒng)收回。在這里保存的數(shù)據(jù),應(yīng)該在
onstop: 變得不可見,被下一個(gè)activity覆蓋了
onDestroy: 這是activity被干掉前最后一個(gè)被調(diào)用方法了,可能是外面類調(diào)用finish方法或者是系統(tǒng)為了節(jié)省空間將它暫時(shí)性的干掉
o設(shè)備橫豎屏切換的時(shí)候,接下來會(huì)發(fā)生什么?
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges=”orientation”時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges=”orientation|keyboardHidden”時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
Android啟動(dòng)Service的兩種方式是什么?
startService:生命周期與調(diào)用者不同。啟動(dòng)后若調(diào)用者未調(diào)用stopService而直接退出,Service仍會(huì)運(yùn)行
bindService:生命周期與調(diào)用者綁定,調(diào)用者一旦退出,Service就會(huì)調(diào)用unBind->onDestroy
談?wù)勀銓?duì)Android中Context的理解?
Context:包含上下文信息(外部值) 的一個(gè)參數(shù). Android 中的 Context 分三種,Application Context ,Activity Context ,Service Context.
它描述的是一個(gè)應(yīng)用程序環(huán)境的信息,通過它我們可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級(jí)別操作,例如:啟動(dòng)一個(gè)Activity,發(fā)送廣播,接受Intent信息等
.請介紹下AsyncTask的內(nèi)部實(shí)現(xiàn),適用的場景是?
AsyncTask內(nèi)部也是Handler機(jī)制來完成的,只不過Android提供了執(zhí)行框架來提供線程池來執(zhí)行相應(yīng)地任務(wù),因?yàn)榫€程池的大小問題,所以AsyncTask只應(yīng)該用來執(zhí)行耗時(shí)時(shí)間較短的任務(wù),比如HTTP請求,大規(guī)模的下載和數(shù)據(jù)庫的更改不適用于AsyncTask,因?yàn)闀?huì)導(dǎo)致線程池堵塞,沒有線程來執(zhí)行其他的任務(wù),導(dǎo)致的情形是會(huì)發(fā)生AsyncTask根本執(zhí)行不了的問題。
談?wù)勀銓?duì)binder機(jī)制的理解?
binder是一種IPC機(jī)制,進(jìn)程間通訊的一種工具. Java層可以利用aidl工具來實(shí)現(xiàn)相應(yīng)的接口.
11.Android中進(jìn)程間通信有哪些實(shí)現(xiàn)方式? Intent,Binder(AIDL),Messenger,BroadcastReceiver
介紹下實(shí)現(xiàn)一個(gè)自定義view的基本流程
1、自定義View的屬性 編寫attr.xml文件
2、在layout布局文件中引用,同時(shí)引用命名空間
3、在View的構(gòu)造方法中獲得我們自定義的屬性 ,在自定義控件中進(jìn)行讀取(構(gòu)造方法拿到attr.xml文件值)
4、重寫onMesure
5、重寫onDraw
Android多線程的實(shí)現(xiàn)方式有哪些?
Thread & AsyncTask
Thread 可以與Loop 和 Handler 共用建立消息處理隊(duì)列
AsyncTask 可以作為線程池并行處理多任務(wù)
android 中線程與線程,進(jìn)程與進(jìn)程之間如何通信
1 、一個(gè) Android 程序開始運(yùn)行時(shí),會(huì)單獨(dú)啟動(dòng)一個(gè) Process 。
默認(rèn)情況下,所有這個(gè)程序中的 Activity 或者 Service 都會(huì)跑在這個(gè) Process 。
默認(rèn)情況下,一個(gè) Android 程序也只有一個(gè) Process ,但一個(gè) Process 下卻可以有許多個(gè) Thread。
ndroid中五種數(shù)據(jù)存儲(chǔ)方式分別是什么?他們的特點(diǎn)?
Android提供了五種存取數(shù)據(jù)的方式
(1)SharedPreference,存放較少的五種類型的數(shù)據(jù),只能在同一個(gè)包內(nèi)使 用,生成XML的格式存放在設(shè)備中
2) SQLite數(shù)據(jù)庫,存放各種數(shù)據(jù),是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫
(3) File文件,通過讀取寫入方式生成文件存放數(shù)據(jù)
4) ContentProvider,主要用于讓其他應(yīng)用程序使用保存的數(shù)據(jù)
(5)通過網(wǎng)絡(luò)獲取數(shù)據(jù)和寫入數(shù)據(jù)到網(wǎng)絡(luò)存儲(chǔ)空間
請介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。
創(chuàng)建一個(gè)屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content provider中前提是有相同數(shù)據(jù)類型并且有寫入Content provider的權(quán)限。
注冊廣播有幾種方式,這些方式有何優(yōu)缺點(diǎn)?
ndroid廣播機(jī)制(兩種注冊方法)
一種是代碼動(dòng)態(tài)注冊
一種是在AndroidManifest.xml中配置廣播
兩種注冊類型的區(qū)別是:
1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
2)第二種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會(huì)被系統(tǒng)調(diào)用自動(dòng)運(yùn)行。
請解釋下Android程序運(yùn)行時(shí)權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。
運(yùn)行時(shí)權(quán)限D(zhuǎn)alvik( android授權(quán))
文件系統(tǒng) linux 內(nèi)核授權(quán)
系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?
請說明原由。通過直接發(fā)送Uri把參數(shù)帶過去,或者通過manifest里的intentfilter里的data屬性
Android事件分發(fā)機(jī)制
Android中與事件分發(fā)相關(guān)的方法主要包括dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三個(gè)方法,而事件分發(fā)一般會(huì)經(jīng)過三種容器,分別為Activity、ViewGroup、View。下表對(duì)這三種容器分別擁有的事件分發(fā)相關(guān)方法進(jìn)行了整理。
* 分發(fā): dispatchTouchEvent如果返回true,則表示在當(dāng)前View或者其子View(子子...View)中,找到了處理事件的View;反之,則表示沒有尋找到
* 攔截: onInterceptTouchEvent如果返回true,則表示這個(gè)事件由當(dāng)前View進(jìn)行處理,不管處理結(jié)果如何,都不會(huì)再向子View傳遞這個(gè)事件;反之,則表示當(dāng)前View不主動(dòng)處理這個(gè)事件,除非他的子View返回的事件分發(fā)結(jié)果為false
* 消費(fèi): onTouchEvent如果返回true,則表示當(dāng)前View就是事件傳遞的終點(diǎn);反之,則表示當(dāng)前View不是事件傳遞的終點(diǎn)
深入淺出反射
什么是反射?
??反射是一種能夠在程序運(yùn)行時(shí)動(dòng)態(tài)訪問、修改某個(gè)類中任意屬性(狀態(tài))和方法(行為)的機(jī)制(包括private實(shí)例和方法),java反射機(jī)制提供了以下幾個(gè)功能:
* 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;
* 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;
* 在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;
* 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法。
??反射涉及到四個(gè)核心類:
* java.lang.Class.java:類對(duì)象
* java.lang.reflect.Constructor.java:類的構(gòu)造器對(duì)象;
* java.lang.reflect.Method.java:類的方法對(duì)象;
* java.lang.reflect.Field.java:類的屬性對(duì)象;
反射有什么用?
* 操作因訪問權(quán)限限制的屬性和方法;
* 實(shí)現(xiàn)自定義注解;
* 動(dòng)態(tài)加載第三方j(luò)ar包,解決android開發(fā)中方法數(shù)不能超過65536個(gè)的問題;
* 按需加載類,節(jié)省編譯和初始化APK的時(shí)間;
反射工作原理
??當(dāng)我們編寫完一個(gè)Java項(xiàng)目之后,每個(gè)java文件都會(huì)被編譯成一個(gè).class文件,這些Class對(duì)象承載了這個(gè)類的所有信息,包括父類、接口、構(gòu)造函數(shù)、方法、屬性等,這些class文件在程序運(yùn)行時(shí)會(huì)被ClassLoader加載到虛擬機(jī)中。當(dāng)一個(gè)類被加載以后,Java虛擬機(jī)就會(huì)在內(nèi)存中自動(dòng)產(chǎn)生一個(gè)Class對(duì)象。我們通過new的形式創(chuàng)建對(duì)象實(shí)際上就是通過這些Class來創(chuàng)建,只是這個(gè)過程對(duì)于我們是不透明的而已。
??反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java這四個(gè)類在程序運(yùn)行時(shí)動(dòng)態(tài)訪問和修改任何類的行為和狀態(tài)。
Java有幾種基本數(shù)據(jù)類型?
a) byte,short,int,long,char,boolean,float,double
史上最精煉android四大組件基礎(chǔ)總結(jié)(忘記了的可以過一遍)
Android基礎(chǔ)知識(shí)總結(jié)
四大組件之一活動(dòng)
活動(dòng)狀態(tài)
運(yùn)行狀態(tài):活動(dòng)處于棧頂
暫停狀態(tài):活動(dòng)不處于棧頂,但仍然可見
停止?fàn)顟B(tài):完全不可見
銷毀狀態(tài):離開返回棧
生存期
onCreate()
onStart():不可見到可見調(diào)用
onResume():與用戶進(jìn)行交互,處于棧頂運(yùn)行態(tài)
onPause():準(zhǔn)備啟動(dòng)或者恢復(fù)另一活動(dòng),
onStop():完全不可見的時(shí)候調(diào)用
onDestory():被銷毀之前調(diào)用,之后變?yōu)殇N毀狀態(tài)
onRestart():這個(gè)方法由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用,也就是活動(dòng)重新啟動(dòng)了
活動(dòng)的啟動(dòng)模式
在配置文件Activity中配置launchMode屬性
standard 默認(rèn)每次啟動(dòng)一個(gè)新活動(dòng),它就會(huì)在返回棧中入棧,并處于棧頂位置。如果我們在一個(gè)Activity中跳轉(zhuǎn)自己。點(diǎn)擊兩次創(chuàng)建之后,我們需連按三次Back建才能退出程序。
singleTop
解決了默認(rèn)情況下,在棧頂還要?jiǎng)?chuàng)建不合理。也就是如果Activity處于棧頂不創(chuàng)建,不處于棧頂就會(huì)重新創(chuàng)建。
singleTask
解決一個(gè)棧中有多個(gè)Activity實(shí)例,也就是如果發(fā)現(xiàn)已經(jīng)存在棧中就把這活動(dòng)之上的統(tǒng)統(tǒng)出棧,沒有則創(chuàng)建
singleInstance
指定為該模式的活動(dòng)會(huì)啟動(dòng)一個(gè)新的返回棧來管理這個(gè)活動(dòng)。
四大組件之二廣播
標(biāo)準(zhǔn)廣播:異步執(zhí)行的廣播
有序廣播:同步執(zhí)行的廣播(對(duì)于廣播接收器是有先后順序)
接收系統(tǒng)廣播
動(dòng)態(tài)注冊監(jiān)聽網(wǎng)絡(luò)變化
在代碼中注冊為動(dòng)態(tài)注冊
在AndroidManifest.xml文件中注冊時(shí)靜態(tài)注冊
四大組件之三服務(wù)
onCreate():在服務(wù)創(chuàng)建的時(shí)候調(diào)用
onStartCommand()方法會(huì)在每次服務(wù)啟動(dòng)的時(shí)候調(diào)用
onDestory()方法會(huì)在服務(wù)銷毀的時(shí)候調(diào)用(回收不再使用的資源)
需要在AndroidManifest.xml文件中注冊才能生效
啟動(dòng)和停止服務(wù)
主要也是借助Intent來實(shí)現(xiàn)的
啟動(dòng)服務(wù)
?startService(new Intent(this,MyService.class))
停止服務(wù)
?stopService(new Intent(this,MyService.class))
服務(wù)的生命周期
onCreate() 服務(wù)之前沒有創(chuàng)建過就會(huì)先執(zhí)行
onStartCommand()方法執(zhí)行每次調(diào)用startService()就會(huì)執(zhí)行。但是還是只存在一個(gè)實(shí)例
onBind():在Context的bindService()調(diào)用時(shí)就會(huì)執(zhí)行該方法
onDestory(): 調(diào)用startService后再調(diào)用stopService()時(shí)就會(huì)執(zhí)行,調(diào)用bindService 后又調(diào)用unbindService()也會(huì)執(zhí)行
當(dāng)調(diào)用了startService()又調(diào)用bindService()此時(shí)只有當(dāng)兩個(gè)同時(shí)調(diào)用stopService和unbindService().onDestory()才會(huì)執(zhí)行。
內(nèi)容提供器Content Provider
內(nèi)容提供器簡介
為了在應(yīng)用程序之間交換數(shù)據(jù),Android提供了ContentProvider,
ContentProvider是不同應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換的標(biāo)準(zhǔn)API,
當(dāng)一個(gè)應(yīng)用程序需要把自己的數(shù)據(jù)暴露給其他程序使用時(shí),
該應(yīng)用程序就可通過提供ContentProvider來實(shí)現(xiàn),其他應(yīng)用程序可通過ContentResolver
來操作ContentProvider暴露的數(shù)據(jù),
包括增加數(shù)據(jù)
刪除數(shù)據(jù)
修改數(shù)據(jù)
查詢數(shù)據(jù)等。
ContentProvider也是Android應(yīng)用的四大組件之一,
需要在AndroidManifest.xml文件中進(jìn)行配置.
在A應(yīng)用編寫ContentProvider,
在B應(yīng)用
調(diào)用getContentResolver,獲取resolver對(duì)象
調(diào)用insert(),delete(),update(),query(),傳入U(xiǎn)RI實(shí)現(xiàn)數(shù)據(jù)訪問