1. 學習android開發需要哪些基礎
android以java為基礎的,所以前提要學好Java基礎知識,比如基本類型、集合等。
android api,學習基本的Activity、service、intent等基本的知識,可以開發一些界面。
計算機網路基本知識。
Linux命令、C編程基礎、Android Java編程、Google Android Linux操作系統具體操作等
安卓系統開發的方法,簡單來說分成四層:
第一層,以Inventor為代表的繪圖工具,是Google推出的簡單開發工具,主要是針對初級玩家的玩意兒,操作起來確實容易,一個不懂程序開發的用戶就可以通過拖拽搞出一個能在安卓平台上跑的應用來,有點像做PPT,但任何事情都有兩面性,這種容易上手的繪圖工具,無法實現業務邏輯,運行效率也比較低。
第二層,以Rexsee為代表的無線中間件,這種方法就不是玩家用的了,必須是工程師來用,但對技術門檻的要求很低,會用HTML和JS的技術員就可以方便的使用,在技術要求大幅度降低的同時,基礎功能的封裝也是一大亮點,這些中間件已經把所有應用需要的基礎功能封裝好,程序員直接使用JS去調用就可以了,不再需要吭哧吭哧從零開始寫代碼,比如你想調用個GPS,本來要編幾千行的代碼,用中間件只需一行JS代碼即可搞定,難怪說做中間件的廠商都說:「用了我的東西,你的程序已經做了一大半啦!」此言不虛。
第三層,基於JAVA的JDK JDK(Java Development Kit),目前絕大部分應用都是用這種方式來開發,對程序員的要求比較高,首先要有比較好的JAVA底子,然後要對Android平台本身有很深的研究,門檻不算低。
2. 如何學習安卓開發
說的是剛剛起步學習的同學,假如開始沒有任何的開發經驗的話,千萬不要著急,不要想著在短時間內就把一個語言學習好,因為你之前沒有任何的學習經驗,在這個過程中需要有耐心地學習完JAVA的基礎知識,然後才開始踏上Android開發之旅。一類同學是只之前做過JAVA開發經驗的,這類同學可以在Android上迅速上手,但是同樣的是不可忽略Android的一些基礎知識,只有把基礎掌握好了,才能在後期取得大的進步。 二、Android基礎知識學習 在掌握好JAVA基礎知識後,接下來就是學習Android基礎知識和如何查看開發文檔了,在這個階段我認為是學習最有勁頭和最有收獲的時候,因為從一無所知到了解是會讓人有收獲良多的感覺,事實上在這一階段也是學習了很多,至少知道如何建立工程,知道一些基本的機制很常用函數的用法,這個階段會出現很多的問題,往往一個很低級的問題都會把你難倒,而這階段正式培養學習能力的好時機,還是那句話,凡是遇到問題第一個想的是自己去解決,自己解決不了的,用網路用谷歌,要學會使用搜索引擎,大部分的時候問題都能得到解決,因為你遇到過的問題別人早就遇到過了,假如搜索引擎也找不到好的答案,這時候可以到論壇發帖問,網上牛人很多,也可以選擇到群里咨詢。 三、Android開發進階 學習完Android基礎知識以後,很多同學很快就會感覺到學習停步不前,感覺自己似懂非懂,我覺得這個時候是學習最關鍵的時候,因為一旦你踏出這一步之後,你對Android的理解就會跟更加透徹,做起開發也會更加有信心,但是怎樣跨過這一階段,我根據自己的經驗是首先是保持對自己的信心,自己找一個比較簡單的項目做做或者找一些應用的源代碼研究研究,然後自己山寨出來一個,這樣你也會有了學習的方向,因為你在了解了基礎知識以後急切需要證明一下自己到底是學到了什麼東西,而開發出一個自己的簡單應用,就是最大的證明了,而且在開發應用的時候,肯定會遇到很多的問題,而在獨立解決bug的同時,你已經掌握了獨立處理問題的能力。
希望能解決您的問題。
3. 怎樣著手研究 Android 源代碼
不需要全部了解,閱讀你感興趣或者與你工作相關的部分就可以了。比如:
頂層目錄:
.
|– bionic (bionic庫,Android的基礎庫)
|– bootable (bootloader, recovery等,ROM移植相關)
|– build (編譯和配置所需的腳本和工具)
|– dalvik (dalvik的Java虛擬機)
|– development (開發應用程序所需的模板和工具)
|– external (由其他平台移植過來的項目,對於移植工作是非常好的參考)
|– frameworks (應用程序框架層,請仔細閱讀此部分代碼,對於開發App會有很大幫助)
|– hardware (與硬體相關的庫,驅動開發相關)
|– kernel (linux內核)
|– out (編譯後生成的目錄,包含構建文件系統所需的文件)
|– packages (Android的原生應用程序,App開發者需要重點關注)
|– prebuilt (Android在各平台下編譯的預置腳本)
|– system (Android的底層庫)
`– vendor / device (設備相關的代碼,AOSP里不會有太多涉及,但是CM中卻是重點)
external目錄:
.
|– aes (ASE加密)
|– apache-http (網頁伺服器)
|– bison (自動生成語法分析器,將無關文法轉換為C,C++)
|– bluez (Linux下的藍牙工具)
|– bsdiff (diff工具)
|– bzip2 (壓縮工具)
|– clearsilver (html模板系統)
|– dbus (低延時,低開銷,高可用性的IPC機制)
|– dhcpcd (DHCP服務)
|– dosfstools (DOS文件系統工具)
|– dropbear (SSH2的伺服器/客戶端)
|– e2fsprogs (EXT2文件系統工具)
|– elf (ELF復制工具)
|– elfutils (ELF工具)
|– embunit
|– emma (Java代碼覆蓋率統計工具)
|– esd (將多種音頻流混合在一個設備上播放)
|– expat
|– fdlibm
|– freetype (字體)
|– gdata (google的無線數據)
|– genext2fs
|– giflib (gif庫)
|– googleclient (google用戶庫)
|– grub
|– icu4c
|– iptables (防火牆)
|– jdiff
|– jhead (jpeg頭部信息工具)
|– jpeg (jpeg庫)
|– libffi
|– libpcap (網路數據包捕獲函數)
|– libpng (png庫)
|– libxml2 (xml解析庫)
|– netperf (網路性能測試工具)
|– opencore (多媒體框架,最讓人詬病的模塊,Andoird 4.0中已被 stagefright 取代)
|– openssl (SSL模塊,需要注意的是一定要靜態編譯此模塊,否則會出現兼容問題)
|– qemu (Android 模擬器,Android 4.0之前只支持 arm-eabi,現在已支持 arm-v7)
|– skia (SKIA圖像引擎)
|– sqlite (資料庫)
|– strace (調試跟蹤工具)
|– tcpmp (TCP抓包軟體)
|– webkit (瀏覽器核心)
|– wpa_supplicant (無線網卡管理)
|– yaffs2 (yaffs文件系統)
4. 怎樣著手研究 Android 源代碼
一般人是不具備研究全部代碼的能力的,如果要研究android的源代碼,不如先研究一下android開發,從開發中了解sdk,然後再看sdk的代碼,一般來說不需要靠linux kernel
5. 基於android的開發主要研究什麼內容
1、學習Java基矗
2、對頁面布局,熟悉各種控制項。
3、使用Java代碼實現控制項的功能。
4、優化界面效果。
6. Android採用的是什麼研究方法與系統架構
您好。 抱歉給您帶來疑惑。 Android X86平台是由Beyounn和Cwhuang主持設計的。項目的主要目的在於為X86平台提供一套完整的Android系統解決方案。這個項目提供了一套完整的可行源代碼樹,配套文檔以及Live CD與Live USB。 具體信息可參考ke/view/4413912/default.aspx
7. Android常見知識點
跳槽無非就是錢少了或不爽了,無論怎麼樣,記住:
不要裸辭!
不要裸辭!
不要裸辭!
為什麼呢?
1、裸辭就沒有錢拿了,還不如騎驢找馬。
2、裸辭之後如果一個月內沒有找到工作,那麼社保就會斷了,除非你自己找渠道交了。
3、裸辭之後真的會很頹廢!
當初還在上班的時候就想著,裸辭了,首先花幾天時間吧簡歷完善一下,把知識點惡補一下,然後投簡歷,面試,妥妥的妥妥。
結果呢?每次裸辭之後都是:
首先躺屍一個星期;
然後用了一個星期才慢吞吞的改完簡歷;
然後海投,沒回復,修改簡歷;
再次海投,面試,被虐得體無完膚,懷疑人生;
再改簡歷,再海投,一不小心中了。
當然海投也是有個目標范圍的。
如果不是裸辭,那麼現在應該還是在公司上班,在完成工作之餘,就會逼著自己復習知識點了,起碼不會在家墮落。在家不上班就是睡覺、看電影,檣櫓灰飛煙滅,所以不要裸辭。
然並卵,我依然裸辭了。請假面試真的很煩。
onPause,假如從ActivityA啟動B,如果B是透明的,則不會回調A的onStop方法。
方法一:
方法二:
1、寫好動畫文件 R.anim.enter 、 R.anim.exit
2、調用 overridePendingTransition 設置動畫
引申:如Activity設置為singleInstance,則應該怎麼設置跳轉動畫?
1、 startService 啟動方與Service並沒有關聯,只有當Service調用 stopSelf 或者其它組件調用 stopService 的時候服務才會終止。
2、 bindService 啟動方綁定Service,並且可以通過Binder與之交互,當啟動方銷毀時,也會自動unbindService,當所有啟動方都unbindService之後,Service也就自動銷毀了。
為什麼呢?官方文檔是這樣寫的:
大概意思是 onReceive() 執行完畢之後,它所在的進程就會變成低優先順序進程,極易被系統殺死。
分兩種情況分析一下:
一、收到廣播的時候,應用正在運行:
此時如果沒有在Manifest中設置了獨立進程,則 onReceive() 就直接在主進程主線程執行,這里很明顯不能執行耗時操作。
二、收到廣播的時候,應用沒有啟動:
這時候系統會啟動一個進程去執行 onReceive() ,(如果Manifest中沒有設置進程名,則進程名為包名),(插一句,所有進程都會創建一個Application實例),當onReceive執行完畢之後,此進程就變成低優先順序了,隨時有可能被系統殺死,如果你在onReceive裡面啟動了線程執行耗時任務,那很有可能子線程沒執行完畢,進程就被殺死了,進程沒了,線程自然就掛了。
那麼確實要執行耗時操作呢,怎麼辦?
方法一:goAsync()
方法二:schele a JobService from the receiver using the JobScheler
三種實現方法
1、繼承現有的組件,如TextView等,進行拓展。
2、繼承ViewGroup,自定義布局。
3、繼承View,在onDraw()中描繪。
onMeasure()
onLayout()
onDraw()
其它
attachToRoot 從字面理解就是是否綁定到 root 上面去了。
1、 attachToRoot=true :則返回的view為root的子view;
2、 attachToRoot=false :則返回的view是個單獨的view,傳入的root只是提供一些參數給view使用而已。
那麼這里不傳入 attachToRoot 呢?那就看root是否為空了,如果傳入root不為空,則默認綁定到root,作為root的子view返回。
也就是所謂的Frame動畫。指通過指定每一幀的圖片和播放時間,有序的進行播放而形成動畫效果。
可以通過插入器 Interpolator 控制動畫的變化速度。
也就是所謂補間動畫。指通過指定View的初始狀態、變化時間、方式,通過一系列的演算法去進行圖形變換,從而形成動畫效果,主要有 AlphaAnimation 、 TranslateAnimation 、 ScaleAnimation 、 RotateAnimation 四種。
注意:只是在視圖層實現了動畫效果,並沒有真正改變View的屬性。
屬性動畫,通過不斷的改變View的屬性,不斷的重繪而形成動畫效果。相比於視圖動畫,View的屬性是真正改變了。
注意:Android 3.0(API 11)以上才支持。
最常用的類有 ObjectAnimator
P.S. 我不明白cancel存在的意義。
另外, DialogFragment 是沒有cancel的。
ping
內存大致分為三個區:棧區、堆區、方法區。
棧區
堆區
方法區
JAVA不允許手動釋放內存,只能通過垃圾回收程序不定期對那些不再被引用的對象進行回收。
那麼怎麼判斷哪些對象需要回收?
1、引用計數法
就是給對象添加一個引用計數器,引用對象時+1,引用失效時-1。但是這種方法解決不了對象相互引用的情況。
2、可達性分析法
通過一系列「GCRoots」對象作為起點進行搜索,當GCRoots和一個對象之間沒有可達路徑,則認為此對象不可用,但是不可用不一定會成為可回收對象。
編寫AIDL文件,定義介面。
編譯生成JAVA文件。
定義進程級Service,onBind中返回Interface.Stub()。
onServiceConnected中Interface aidl = Interface.Stub.asInterface(service);
把已修復的class文件打包成dex文件,網路傳輸到用戶手機中,利用類載入器把這些類載入到類隊列的前面即可。
【未完待續】
如果公司錄用我,不管是三年還是五年,首先我都會先把公司的任務做好,然後不斷深入研究Android的相關技術,特別是Android源碼,了解Android底層原理,以便更好的優化性能,避免一些不必要的奇葩問題,還有就是研究一些新的框架的原理,學習別人的思維。最後就是學習周邊語言,比如後台,前端等等。
8. Android有什麼好的技術點適合進行技術分享
這個簡單的方法是使用Chrome開發工具來調試Android應用程序,你可以查看網路請求,包括API圖像等,也可以用來查看和修改資料庫和SharedPref /。它不僅對Android開發有用,而且對後端程序員也很有用。他們已經熟悉了Chrome的開發工具,一旦你把Stetho集成到他們身上,只要他們的手機上有可調試的應用程序,就很容易檢查網路的錯誤請求。最酷的事情是在幾分鍾內集成這個庫,即插即用。
mpsys原理 可列印服務中的重要狀態的值。在一些崩潰的場景中,你不能列印服務,如果你不理解mpsys框架,你就失去了一個非常重要的線索。
watchdog機制監視系統伺服器進程中最重要的服務是否被阻塞。如果你的手機被困了一段時間,然後重新啟動,它可能是有效的。
9. 怎樣著手研究 Android 源代碼
一、源碼里的工程需要導入所有的Android源碼,不可以單獨作為一個Android工程導入到Eclipse里。
二、使用git和repo下載Android的源代碼,參考如下步驟
以下操作都是在Ubuntu10.04LTS下完成:
1)安裝git
sudo apt-get install git-core
2)安裝curl
sudo apt-get install git-core curl
3)安裝Repo,為了方便直接下載repo到用戶根目錄中。通過curl下載repo
curl http://android.git.kernel.org/repo >~/repo
4)給repo可執行的許可權
chmod a+x ~/repo
5)新建一個目錄,然後進入該目錄。通過repo將當前Android上所有源代碼下載。
首先初始化本地,
~/repo init -u git://android.git.kernel.org/platform/manifest.git
看到repo initialized in /android的提示後,則證明初始化完畢。成功後會在~/android下生成.repo文件夾
執行
repo sync
則自動開始下載源代碼。git支持斷點續傳,如果中斷了下次可繼續。
單獨下載內核,用這個
git clone git://android.git.kernel.org/kernel/linux-2.6.git
如果想拿某個branch而不是主線上的代碼,我們需要用-b參數制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
另一種情況是,我們只需要某一個project的代碼,比如kernel/common,就不需要repo了,直接用Git即可。
git clone git://android.git.kernel.org/kernel/common.git
10. Android中判斷app何時啟動和關閉的技術研究
Android開發中不可避免的會遇到需要檢查app何時進入前台,何時被用戶關閉。奇怪的是,要達到這個目的並不容易。檢查app第一次啟動並不難,但要判斷它何時重新打開和關閉就沒有那麼簡單了。
這篇文章將介紹一種判斷app打開,重新打開和關閉的技術。
讓我們開始吧
判斷一個app打開和關閉的關鍵在於判斷它的activities是否正在前台顯示。讓我們先從簡單的例子開始,一個只有一個activity的app,而且不支持水平模式。這樣想要判斷app是打開還是關閉只需要檢查activity的onStart和onStop方法即可:
[Java] 純文本查看 復制代碼
@Override
protected void onStart() {
super.onStart();
// The Application has been opened!
}
@Override
protected void onStop() {
super.onStop();
// The Application has been closed!
}
上面例子的問題在於當需要支持水平模式時該方法就失效了。當我們旋轉設備時activity將會重建,onStart方法將被再次調用,這時將會錯誤的判斷為app第二次被打開。
為了處理設備旋轉的情況,我們需要增加一個校驗步驟。當activity退出時啟動一個定時器,用於判斷短時間內app的這個activity是否又被啟動,如果沒有,說明用戶真的退出了這個app,如果重新啟動了這個activity,說明用戶還逗留在這個app中。
這種校驗方式也適用於擁有多個activities的app,因為從app的一個activity跳轉到另一個activity也可以用這種校驗方式來處理。
使用這個技術我創建了一個管理類,所有的activities在可見和不可見時都會通知這個管理類。這個管理類為每個activity處理上述的校驗步驟,從而避免錯誤的檢測。它也提供了發布訂閱(觀察者)模式,任何對app啟動和關閉感興趣的模塊都可以通過它來得到對應的通知。
這個管理類的使用分為三個步驟:
1)把它添加到你的工程中
2)Activities在可見性改變的需要發送通知
app中所有activities都要增加下面的代碼,用於可見性改變時通知管理類。最好的實現方式是把這段代碼加到工程的BaseActivity中。
[Java] 純文本查看 復制代碼
@Override
protected void onStart() {
super.onStart();
AppForegroundStateManager.getInstance().onActivityVisible(this);
}
@Override
protected void onStop() {
AppForegroundStateManager.getInstance().onActivityNotVisible(this);
super.onStop();
}
3)訂閱app的前台可見性改變事件
在感興趣的模塊中訂閱app前台可見性改變事件,application類的onCreate函數是一個不錯的地方,它可以保證每次app啟動和關閉,你都能得到通知。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
AppForegroundStateManager.getInstance().addListener(this);
}
@Override
public void onAppForegroundStateChange(AppForegroundStateManager.AppForegroundState newState) {
if (AppForegroundStateManager.AppForegroundState.IN_FOREGROUND == newState) {
// App just entered the foreground. Do something here!
} else {
// App just entered the background. Do something here!
}
}
}
進一步的思考
有一些細節需要進一步討論,下面討論的幾點針對具體的應用可以做微調。
校驗時間
校驗定時器檢查app是否真的進入後台的時間間隔是多少合適呢?上面的代碼設置為30秒,原因如下。
當你的app在運行時,可能存在第三方的activities會覆蓋全屏幕,一些常見的例子是Google應用內購買和Facebook登錄注冊頁面。這些情況下你的app都會被迫進入後台,前台用於顯示這些第三方頁面。如果把這種情況當做用戶離開了你的app,顯然是不對的。30秒超時設置就是用來避免這種情況的。例如當用戶在30秒內完成應用內購買,大部分用戶都可以做得到,那麼就不會當做用戶突然離開app了。
如果你的app不存在上述這種情況,我建議可以把你的校驗時間設置為4秒,這樣對於低配設備當屏幕旋轉重新創建activity的時間間隔是合適的。
CPU休眠
可能存在的問題是當用戶關閉app或者app仍處於前台時用戶鎖屏了,這時CPU可能不會等到定時器檢測就休眠了。為了保證這種情況下定時器能夠正常檢測用戶退出app,我們需要持有wakelock防止CPU休眠直到app關閉事件被確認。實踐中相比使用wakelock,這種情況並不算問題。
判斷app是如何啟動的
現在我們已經知道如何檢測app何時啟動和關閉,但我們不知道app是如何啟動的。是用戶點擊通知欄消息?還是點擊一個鏈接?亦或是他們直接通過桌面圖標或最近使用啟動?
跟蹤啟動機制
首先我們需要知道在哪裡檢測app是如何啟動的。基於前面一個例子我們可以列印出app何時啟動,以及如何啟動。
public class MyApplication extends Application {
public final String TAG = MyApplication.class.getSimpleName();
public enum LaunchMechanism {
DIRECT,
NOTIFICATION,
URL;
}
private LaunchMechanism mLaunchMechanism = LaunchMechanism.DIRECT;
public void setLaunchMechanism(LaunchMechanism launchMechanism) {
mLaunchMechanism = launchMechanism;
}
@Override
public void onCreate() {
super.onCreate();
AppForegroundStateManager.getInstance().addListener(this);
}
@Override
public void onAppForegroundStateChange(AppForegroundStateManager.AppForegroundState newState) {
if (AppForegroundStateManager.AppForegroundState.IN_FOREGROUND.equals(newState)) {
// App just entered the foreground.
Log.i(TAG, "App Just Entered the Foreground with launch mechanism of: " + mLaunchMechanism);
} else {
// App just entered the background. Set our launch mode back to the default of direct.
mLaunchMechanism = LaunchMechanism.DIRECT;
}
}
}
設置啟動機制
現在我們可以列印app何時啟動的機制,但我們沒有設置它。因此下一步就是在用戶通過鏈接或者通知啟動app時我們記下它。如果沒有通過這兩種方式設置過,說明用戶是通過點擊app圖標啟動的。
跟蹤鏈接點擊事件
為了跟蹤用戶點擊鏈接打開app,你需要找到代碼中處理鏈接的地方,並加入下面的代碼來跟蹤啟動機制。要確保這些代碼在activity的onStart()函數之前調用。在哪些地方加入下面的代碼取決於你的app架構了。
getApplication().setLaunchMechanism(LaunchMechanism.URL);
1
跟蹤通知事件
不幸的是跟蹤通知點擊需要更多技巧,通知顯示後,點擊它將會打開之前綁定好的一個PendingIntent,這里的技巧是為通知的所有PendingIntents添加一個標識表明是由通知發出的。
例如當為通知創建PendingIntent時為每個intent添加如下代碼:
public static final String EXTRA_HANDLING_NOTIFICATION = "Notification.EXTRA_HANDLING_NOTIFICATION";
// Put an extra so we know when an activity launches if it is a from a notification
intent.putExtra(EXTRA_HANDLING_NOTIFICATION, true);
到這一步我們需要做的就是在每個activity(統一在BaseActivity中添加)中檢查這個標識。當識別到這個標識時說明是從通知啟動的,這時可以把啟動機制設置為通過通知。這一步應該在onCreate中處理,這樣在app啟動到前台之前就設置好了(會觸發啟動機制的列印)。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
// Detect if the activity was launched by the user clicking on a notification
if (intent.getExtras().getBoolean(EXTRA_HANDLING_NOTIFICATION, false)) {
// Notify that the activity was opened by the user clicking on a notification.
getApplication().setLaunchMechanism(LaunchMechanism.NOTIFICATION);
}
}
}
本文接近尾聲了,到這里你應該已經掌握了如何檢測app何時啟動和關閉,以及它是如何啟動的。