想自學(xué)一下android開發(fā)?
android現(xiàn)在主流還是java開發(fā),既然學(xué)會(huì)了java的話,上手android不難。
android主要是界面UI交互,xml布局。
需要準(zhǔn)備一臺(tái)真機(jī)、開發(fā)者IDE下載Androidstudio:
https://developer.android.google.cn/
主要內(nèi)容掌握四大組件:service服務(wù)、activity、廣播接收器、內(nèi)容提供者。
1.活動(dòng)(activity)(1)定義:Activity是Android的四大組件之一。是用戶操作的可視化界面;它為用戶提供了一個(gè)完成操作指令的窗口。當(dāng)我們創(chuàng)建完畢Activity之后,需要調(diào)用方法來完成界面的顯示;以此來為用戶提供交互的入口。在Android App 中只要能看見的幾乎都要依托于Activity,所以Activity是在開發(fā)中使用最頻繁的一種組件。
(2)一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕(窗口)。
(3)Activity之間通過Intent進(jìn)行通信。
(4)android應(yīng)用中每一個(gè)Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統(tǒng)將不識(shí)別也不執(zhí)行該Activity。在android stdio會(huì)自動(dòng)生成,但eclipse需要自己手動(dòng)添加
(5)Activity的生命周期 在Android中會(huì)維持一個(gè)Activity Stack(Activity棧),當(dāng)一個(gè)新的Activity創(chuàng)建時(shí),它就會(huì)放到棧頂,這個(gè)Activity就處于運(yùn)行狀態(tài)。當(dāng)再有一個(gè)新的Activity被創(chuàng)建后,會(huì)重新壓人棧頂,而之前的Activity則會(huì)在這個(gè)新的Activity底下,就像槍梭壓入子彈一樣。而且之前的Activity就會(huì)進(jìn)入后臺(tái)。一個(gè)Activity實(shí)質(zhì)上有四種狀態(tài):a.運(yùn)行中(Running/Active):這時(shí)Activity位于棧頂,是可見的,并且可以用戶交互。b.暫停(Paused):當(dāng)Activity失去焦點(diǎn),不能跟用戶交互了,但依然可見,就處于暫停狀態(tài)。當(dāng)一個(gè)新的非全屏的Activity或者一個(gè)透明的Activity放置在棧頂,Activity就處于暫停狀態(tài);這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著;只有在系統(tǒng)內(nèi)存在極低的狀態(tài)下,系統(tǒng)才會(huì)自動(dòng)的去銷毀Activity。c.停止(Stoped):當(dāng)一個(gè)Activity被另一個(gè)Activity完全覆蓋,或者點(diǎn)擊HOME鍵退入了后臺(tái),這時(shí)候Activity處于停止?fàn)顟B(tài)。這里有些是跟暫停狀態(tài)相似的:這個(gè)時(shí)候Activity的各種數(shù)據(jù)還被保持著;當(dāng)系統(tǒng)的別的地方需要用到內(nèi)容時(shí),系統(tǒng)會(huì)自動(dòng)的去銷毀Activity。d.銷毀(Detroyed):當(dāng)我們點(diǎn)擊返回鍵或者系統(tǒng)在內(nèi)存不夠用的情況下就會(huì)把Activity從棧里移除銷毀,被系統(tǒng)回收,這時(shí)候,Activity處于銷毀狀態(tài)。
2.服務(wù)(Service)service(服務(wù))是安卓中的四大組件之一,它通常用作在后臺(tái)處理耗時(shí)的邏輯,與Activity一樣,它存在自己的生命周期,也需要在AndroidManifest.xml配置相關(guān)信息。
服務(wù)(Service)是Android中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案,它非常適合去執(zhí)行那些不需要和用戶交互而且還要求長期運(yùn)行的任務(wù)。服務(wù)的運(yùn)行不依賴于任何用戶界面,即使程序被切換到后臺(tái),或者用戶打開了另外一個(gè)應(yīng)用程序,服務(wù)仍然能夠保持正常運(yùn)行。
不過需要注意的是,服務(wù)并不是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程當(dāng)中的,而是依賴于創(chuàng)建服務(wù)時(shí)所在的應(yīng)用程序進(jìn)程。與某個(gè)應(yīng)用程序進(jìn)程被殺掉時(shí),所有依賴于該進(jìn)程的服務(wù)也會(huì)停止運(yùn)行。另外.也不要被服務(wù)的后臺(tái)概念所迷惑,實(shí)際上服務(wù)并不會(huì)自動(dòng)開啟線程,所有的代碼都是默認(rèn)運(yùn)行在主線程當(dāng)中的。也就是說,我們需要在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線程,并在這里執(zhí)行具體的任務(wù),否則就有可能出現(xiàn)主線程被阻塞住的情況。
(1)service用于在后臺(tái)完成用戶指定的操作。service分為兩種:(a)started(啟動(dòng)):當(dāng)應(yīng)用程序組件(如activity)調(diào)用startService()方法啟動(dòng)服務(wù)時(shí),服務(wù)處于started狀態(tài)。(b)bound(綁定):當(dāng)應(yīng)用程序組件調(diào)用bindService()方法綁定到服務(wù)時(shí),服務(wù)處于bound狀態(tài)。(2)startService()與bindService()區(qū)別:(a)started service(啟動(dòng)服務(wù))是由其他組件調(diào)用startService()方法啟動(dòng)的,這導(dǎo)致服務(wù)的onStartCommand()方法被調(diào)用。當(dāng)服務(wù)是started狀態(tài)時(shí),其生命周期與啟動(dòng)它的組件無關(guān),并且可以在后臺(tái)無限期運(yùn)行,即使啟動(dòng)服務(wù)的組件已經(jīng)被銷毀。因此,服務(wù)需要在完成任務(wù)后調(diào)用stopSelf()方法停止,或者由其他組件調(diào)用stopService()方法停止。(b)使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止,大有“不求同時(shí)生,必須同時(shí)死”的特點(diǎn)。(3)開發(fā)人員需要在應(yīng)用程序配置文件中聲明全部的service,使用<service></service>標(biāo)簽。
(4)Service通常位于后臺(tái)運(yùn)行,它一般不需要與用戶交互,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類。Service組件通常用于為其他組件提供后臺(tái)服務(wù)或監(jiān)控其他組件的運(yùn)行狀態(tài)。
定義
Service是一個(gè)專門在后臺(tái)處理長時(shí)間任務(wù)的Android組件,它沒有UI。它有兩種啟動(dòng)方式,startService和bindService。
這兩種啟動(dòng)方式的區(qū)別:startService只是啟動(dòng)Service,啟動(dòng)它的組件(如Activity)和Service并沒有關(guān)聯(lián),只有當(dāng)Service調(diào)用stopSelf或者其他組件調(diào)用stopService服務(wù)才會(huì)終止。bindService方法啟動(dòng)Service,其他組件可以通過回調(diào)獲取Service的代理對象和Service交互,而這兩方也進(jìn)行了綁定,當(dāng)啟動(dòng)方銷毀時(shí),Service也會(huì)自動(dòng)進(jìn)行unBind操作,當(dāng)發(fā)現(xiàn)所有綁定都進(jìn)行了unBind時(shí)才會(huì)銷毀Service。
Service的onCreate回調(diào)函數(shù)可以做耗時(shí)的操作嗎?不可以,Service的onCreate是在主線程(ActivityThread)中調(diào)用的,耗時(shí)操作會(huì)阻塞UI如果需要做耗時(shí)的操作,你會(huì)怎么做?線程和Handler方式是否知道IntentService,在什么場景下使用IntentService?
IntentService相比父類Service而言,最大特點(diǎn)是其回調(diào)函數(shù)onHandleIntent中可以直接進(jìn)行耗時(shí)操作,不必再開線程。其原理是IntentService的成員變量 Handler在初始化時(shí)已屬于工作線程,之后handleMessage,包括onHandleIntent等函數(shù)都運(yùn)行在工作線程中。如果對IntentService的了解僅限于此,會(huì)有種IntentService很雞肋的觀點(diǎn),因?yàn)樵赟ervice中開線程進(jìn)行耗時(shí)操作也不麻煩。我當(dāng)初也是這個(gè)觀點(diǎn),所以很少用IntentService。
但是IntentService還有一個(gè)特點(diǎn),就是多次調(diào)用onHandleIntent函數(shù)(也就是有多個(gè)耗時(shí)任務(wù)要執(zhí)行),多個(gè)耗時(shí)任務(wù)會(huì)按順序依次執(zhí)行。原理是其內(nèi)置的Handler關(guān)聯(lián)了任務(wù)隊(duì)列,Handler通過looper取任務(wù)執(zhí)行是順序執(zhí)行的。
這個(gè)特點(diǎn)就能解決多個(gè)耗時(shí)任務(wù)需要順序依次執(zhí)行的問題。而如果僅用service,開多個(gè)線程去執(zhí)行耗時(shí)操作,就很難管理。
https://blog.csdn.net/zhengyin_tmac/article/details/524466963.廣播接受者(Broadcast Receive)在Android中,廣播是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而廣播接收器是對發(fā)送出來的廣播進(jìn)行過濾接受并響應(yīng)的一類組件。可以使用廣播接收器來讓應(yīng)用對一個(gè)外部時(shí)間做出響應(yīng)。例如,當(dāng)電話呼入這個(gè)外部事件到來時(shí),可以利用廣播接收器進(jìn)行處理。當(dāng)下載一個(gè)程序成功完成時(shí),仍然可以利用廣播接收器進(jìn)行處理。廣播接收器不NotificationManager來通知用戶這些事情發(fā)生了。廣播接收器既可以在AndroidManifest.xml中注冊,也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceive()進(jìn)行注冊。只要是注冊了,當(dāng)事件來臨時(shí),即使程序沒有啟動(dòng),系統(tǒng)也在需要的時(shí)候啟動(dòng)程序。各種應(yīng)用還可以通過使用Context.sendBroadcast()將它們自己的Intent廣播給其他應(yīng)用程序。
(1)你的應(yīng)用可以使用它對外部事件進(jìn)行過濾,只對感興趣的外部事件(如當(dāng)電話呼入時(shí),或者數(shù)據(jù)網(wǎng)絡(luò)可用時(shí))進(jìn)行接收并做出響應(yīng)。廣播接收器沒有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity或serice來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力,例如閃動(dòng)背燈、震動(dòng)、播放聲音等。一般來說是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息。
(2)廣播接收者的注冊有兩種方法,分別是程序動(dòng)態(tài)注冊(在運(yùn)行時(shí)的代碼中使用Context.registerReceive()進(jìn)行注冊)和AndroidManifest文件中進(jìn)行靜態(tài)注冊。
(3)動(dòng)態(tài)注冊廣播接收器特點(diǎn)是當(dāng)用來注冊的Activity關(guān)掉后,廣播也就失效了。靜態(tài)注冊無需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開啟狀態(tài),廣播接收器也是打開著的。也就是說哪怕app本身未啟動(dòng),該app訂閱的廣播在觸發(fā)時(shí)也會(huì)對它起作用。
4.內(nèi)容提供者(Content Provider)(1)android平臺(tái)提供了Content Provider使一個(gè)應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。其他應(yīng)用可以通過ContentResolver類從該內(nèi)容提供者中獲取或存入數(shù)據(jù)。(2)只有需要在多個(gè)應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者。例如,通訊錄數(shù)據(jù)被多個(gè)應(yīng)用程序使用,且必須存儲(chǔ)在一個(gè)內(nèi)容提供者中。它的好處是統(tǒng)一數(shù)據(jù)訪問方式。(3)ContentProvider實(shí)現(xiàn)數(shù)據(jù)共享。ContentProvider用于保存和獲取數(shù)據(jù),并使其對所有應(yīng)用程序可見。這是不同應(yīng)用程序間共享數(shù)據(jù)的唯一方式,因?yàn)閍ndroid沒有提供所有應(yīng)用共同訪問的公共存儲(chǔ)區(qū)。(4)開發(fā)人員不會(huì)直接使用ContentProvider類的對象,大多數(shù)是通過ContentResolver對象實(shí)現(xiàn)對ContentProvider的操作。
(5)ContentProvider使用URI來唯一標(biāo)識(shí)其數(shù)據(jù)集,這里的URI以content://作為前綴,表示該數(shù)據(jù)由ContentProvider來管理