計算機本科生,已經學完Java,想自學一下android開發,兩者差別多大,求詳解?

cyyaizyh


android現在主流還是java開發,既然學會了java的話,上手android不難。

android主要是界面UI交互,xml佈局。

需要準備一臺真機、開發者IDE下載Androidstudio:

https://developer.android.google.cn/


主要內容掌握四大組件:service服務、activity、廣播接收器、內容提供者。


1.活動(activity)

(1)定義:Activity是Android的四大組件之一。是用戶操作的可視化界面;它為用戶提供了一個完成操作指令的窗口。當我們創建完畢Activity之後,需要調用方法來完成界面的顯示;以此來為用戶提供交互的入口。在Android App 中只要能看見的幾乎都要依託於Activity,所以Activity是在開發中使用最頻繁的一種組件。

(2)一個Activity通常就是一個單獨的屏幕(窗口)。

(3)Activity之間通過Intent進行通信。

(4)android應用中每一個Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統將不識別也不執行該Activity。在android stdio會自動生成,但eclipse需要自己手動添加

(5)Activity的生命週期 在Android中會維持一個Activity Stack(Activity棧),當一個新的Activity創建時,它就會放到棧頂,這個Activity就處於運行狀態。當再有一個新的Activity被創建後,會重新壓人棧頂,而之前的Activity則會在這個新的Activity底下,就像槍梭壓入子彈一樣。而且之前的Activity就會進入後臺。一個Activity實質上有四種狀態:a.運行中(Running/Active):這時Activity位於棧頂,是可見的,並且可以用戶交互。b.暫停(Paused):當Activity失去焦點,不能跟用戶交互了,但依然可見,就處於暫停狀態。當一個新的非全屏的Activity或者一個透明的Activity放置在棧頂,Activity就處於暫停狀態;這個時候Activity的各種數據還被保持著;只有在系統內存在極低的狀態下,系統才會自動的去銷燬Activity。c.停止(Stoped):當一個Activity被另一個Activity完全覆蓋,或者點擊HOME鍵退入了後臺,這時候Activity處於停止狀態。這裡有些是跟暫停狀態相似的:這個時候Activity的各種數據還被保持著;當系統的別的地方需要用到內容時,系統會自動的去銷燬Activity。d.銷燬(Detroyed):當我們點擊返回鍵或者系統在內存不夠用的情況下就會把Activity從棧裡移除銷燬,被系統回收,這時候,Activity處於銷燬狀態。

2.服務(Service)

service(服務)是安卓中的四大組件之一,它通常用作在後臺處理耗時的邏輯,與Activity一樣,它存在自己的生命週期,也需要在AndroidManifest.xml配置相關信息。

服務(Service)是Android中實現程序後臺運行的解決方案,它非常適合去執行那些不需要和用戶交互而且還要求長期運行的任務。服務的運行不依賴於任何用戶界面,即使程序被切換到後臺,或者用戶打開了另外一個應用程序,服務仍然能夠保持正常運行。

不過需要注意的是,服務並不是運行在一個獨立的進程當中的,而是依賴於創建服務時所在的應用程序進程。與某個應用程序進程被殺掉時,所有依賴於該進程的服務也會停止運行。另外.也不要被服務的後臺概念所迷惑,實際上服務並不會自動開啟線程,所有的代碼都是默認運行在主線程當中的。也就是說,我們需要在服務的內部手動創建子線程,並在這裡執行具體的任務,否則就有可能出現主線程被阻塞住的情況。

(1)service用於在後臺完成用戶指定的操作。service分為兩種:(a)started(啟動):當應用程序組件(如activity)調用startService()方法啟動服務時,服務處於started狀態。(b)bound(綁定):當應用程序組件調用bindService()方法綁定到服務時,服務處於bound狀態。(2)startService()與bindService()區別:(a)started service(啟動服務)是由其他組件調用startService()方法啟動的,這導致服務的onStartCommand()方法被調用。當服務是started狀態時,其生命週期與啟動它的組件無關,並且可以在後臺無限期運行,即使啟動服務的組件已經被銷燬。因此,服務需要在完成任務後調用stopSelf()方法停止,或者由其他組件調用stopService()方法停止。(b)使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。(3)開發人員需要在應用程序配置文件中聲明全部的service,使用<service>標籤。

(4)Service通常位於後臺運行,它一般不需要與用戶交互,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類。Service組件通常用於為其他組件提供後臺服務或監控其他組件的運行狀態。

定義

Service是一個專門在後臺處理長時間任務的Android組件,它沒有UI。它有兩種啟動方式,startService和bindService。

這兩種啟動方式的區別:

startService只是啟動Service,啟動它的組件(如Activity)和Service並沒有關聯,只有當Service調用stopSelf或者其他組件調用stopService服務才會終止。bindService方法啟動Service,其他組件可以通過回調獲取Service的代理對象和Service交互,而這兩方也進行了綁定,當啟動方銷燬時,Service也會自動進行unBind操作,當發現所有綁定都進行了unBind時才會銷燬Service。

Service的onCreate回調函數可以做耗時的操作嗎?不可以,Service的onCreate是在主線程(ActivityThread)中調用的,耗時操作會阻塞UI
如果需要做耗時的操作,你會怎麼做?
線程和Handler方式

是否知道IntentService,在什麼場景下使用IntentService?

IntentService相比父類Service而言,最大特點是其回調函數onHandleIntent中可以直接進行耗時操作,不必再開線程。其原理是IntentService的成員變量 Handler在初始化時已屬於工作線程,之後handleMessage,包括onHandleIntent等函數都運行在工作線程中。

如果對IntentService的瞭解僅限於此,會有種IntentService很雞肋的觀點,因為在Service中開線程進行耗時操作也不麻煩。我當初也是這個觀點,所以很少用IntentService。

但是IntentService還有一個特點,就是多次調用onHandleIntent函數(也就是有多個耗時任務要執行),多個耗時任務會按順序依次執行。原理是其內置的Handler關聯了任務隊列,Handler通過looper取任務執行是順序執行的。

這個特點就能解決多個耗時任務需要順序依次執行的問題。而如果僅用service,開多個線程去執行耗時操作,就很難管理。

https://blog.csdn.net/zhengyin_tmac/article/details/52446696

3.廣播接受者(Broadcast Receive)

在Android中,廣播是一種廣泛運用的在應用程序之間傳輸信息的機制。而廣播接收器是對發送出來的廣播進行過濾接受並響應的一類組件。可以使用廣播接收器來讓應用對一個外部時間做出響應。例如,當電話呼入這個外部事件到來時,可以利用廣播接收器進行處理。當下載一個程序成功完成時,仍然可以利用廣播接收器進行處理。廣播接收器不NotificationManager來通知用戶這些事情發生了。廣播接收器既可以在AndroidManifest.xml中註冊,也可以在運行時的代碼中使用Context.registerReceive()進行註冊。只要是註冊了,當事件來臨時,即使程序沒有啟動,系統也在需要的時候啟動程序。各種應用還可以通過使用Context.sendBroadcast()將它們自己的Intent廣播給其他應用程序。

(1)你的應用可以使用它對外部事件進行過濾,只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力,例如閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。

(2)廣播接收者的註冊有兩種方法,分別是程序動態註冊(在運行時的代碼中使用Context.registerReceive()進行註冊)和AndroidManifest文件中進行靜態註冊。

(3)動態註冊廣播接收器特點是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。

4.內容提供者(Content Provider)

(1)android平臺提供了Content Provider使一個應用程序的指定數據集提供給其他應用程序。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。(2)只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式。(3)ContentProvider實現數據共享。ContentProvider用於保存和獲取數據,並使其對所有應用程序可見。這是不同應用程序間共享數據的唯一方式,因為android沒有提供所有應用共同訪問的公共存儲區。(4)開發人員不會直接使用ContentProvider類的對象,大多數是通過ContentResolver對象實現對ContentProvider的操作。

(5)ContentProvider使用URI來唯一標識其數據集,這裡的URI以content://作為前綴,表示該數據由ContentProvider來管理


嘉靖不上朝


正好是一路按照這個路線走下來的老工程師。

在2009年之前一直是JAVA開發,然後就在手機公司轉向了Android開發。

先說說相同點:

上層的開發基本上轉安卓後沒啥障礙,JAVA的各種面向對象編程,在安卓上是一樣的。

如果原來有用過一些應用框架Spring,Hibernate,mysql之類的,

轉到安卓平臺就是相當於用新的應用框架來開發。

安卓基本也是MVP開發框架,模型層、展示層、處理層。

安卓的UI交互界面,各類控件,開發起來也比較好理解。也要編寫大量的事件處理邏輯。

安卓應用開發

像這個手機應用主界面,稱為Launcher,這是開機就加載的主界面。

上面有Widget也就是小插件。

安卓UI開發中要處理大量的消息,有系統發來的各種通知消息,這些消息的處理,會非常關鍵。

安卓應用的生命週期的函數處理也是非常關鍵,直接決定了垃圾回收是否及時。

垃圾回收,是要重點處理的問題之一。

費精力的地方之一是,需要看安卓的應用開發框架了解各個API跟類。

應用之下是FrameWork層

一定要了解Android系統,實際就是Linux系統+JAVA虛擬機(安卓徹底改造過的)。

所以底層系統跟上層虛擬機直接,還有個FrameWork層。

對於應用開發工程師來說,也要了解Framework層。

比如通訊錄機制、Camera、音樂這些基礎功能都會跟下面有點關係。

上層通過JNI接口,來調用下層的功能。

工作會比較辛苦,但是挺有意思的

如果開始了安卓開發,那是打開了另一個世界。需要持之以恆的努力。

學無止境。


智能情感里奧


您好,很高興回答您的問題。

作為資深Android開發工程師,也是從JAVA一路走過來,簡單說一下吧。

初、中級開發

最直白的說,初中級JAVA和Android幾乎沒有差別,可以簡單的理解為,Android開發就是使用JAVA語言調用Android SDK而已,所以說JAVA工程師基本上可以直接轉Android開發,熟悉熟悉開發流程,學一下SDK就,基本上就可以上手開發一些小APP了,然後在網上學習一些開發框架,就可以應對大多數開發場景了。

中、高級開發

Android是基於在Lnux上的,應用是運行在虛擬機上,這點完全繼承於JAVA,但就Android 框架來說分為,linux驅動、libs層、framework、Application四層,要應對與framework以下的開發,必須要熟悉Android 服務架構,NDK,C/C++linxu驅動等技術,這點跟JAVA是不一樣的,對於新手而言,如果您熟悉C/C++可以考慮有下往上的技術路線,但如果熟悉JAVA,建議由上往下的技術路線。


分享到:


相關文章: