- 簡書0 系統概覽 0.1 Android 0.1.1 起源 Android 是一種基於 Linux 的自由及開放源代碼的操做系統,主要使用於移動設備如智能手機和平板電腦,由 Google...java
2018.07.05 04:31:46 字數 2,809 閱讀 242react
Android 是一種基於 Linux 的自由及開放源代碼的操做系統,主要使用於移動設備如智能手機和平板電腦,由 Google 公司和開放手機聯盟領導及開發。linux
Android 系統架構android
主要使用 java 語言開發的應用程序,如通信錄、瀏覽器等各類應用 appios
視圖(View):能夠用來構建應用程序,如列表,文本框,WebView 瀏覽器組件等。
內容提供器(Content Provider):對外部其餘應用提供數據
資源管理器(Resource Manager):提供非代碼資源的訪問,如本地字符串,圖形,佈局文件等。
通知管理器(Notification Manager):使得應用程序能夠在狀態欄中顯示自定義的提示信息。
活動管理器( Activity Manager):用來管理應用程序生命週期並提供經常使用的導航回退功能。git
Android 包含一些 C/C++ 庫,這些庫能被 Android 系統中不一樣的組件使用。它們經過 Android 應用程序框架爲開發者提供服務。程序員
Android 包括了一個核心庫,該核心庫提供了 JAVA 編程語言核心庫的大多數功能。
每個 Android 應用程序都在它本身的進程中運行,都擁有一個獨立的 Dalvik 虛擬機實例。Dalvik 被設計成一個設備能夠同時高效地運行多個虛擬系統。 Dalvik 虛擬機執行 (.dex) 的 Dalvik 可執行文件,該格式文件針對小內存使用作了優化。同時虛擬機是基於寄存器的,全部的類都經由 JAVA 編譯器編譯,而後經過 SDK 中 的 "dx" 工具轉化成. dex 格式由虛擬機執行。
Dalvik 虛擬機依賴於 linux 內核的一些功能,好比線程機制和底層內存管理機制。github
Android 的核心繫統服務依賴於 Linux 2.6 內核,如安全性,內存管理,進程管理, 網絡協議棧和驅動模型。 Linux 內核也同時做爲硬件和軟件棧之間的抽象層。objective-c
iOS 是由蘋果公司開發的移動操做系統。蘋果公司最先於 2007 年 1 月 9 日的 Macworld 大會上公佈這個系統,最初是設計給 iPhone 使用的,後來陸續套用到 iPod touch、iPad 以及 Apple TV 等產品上。iOS 與蘋果的 Mac OS X 操做系統同樣,屬於類 Unix 的商業操做系統。數據庫
iOS 系統架構
Cocoa Touch 是可觸摸層,這一層爲咱們的應用程序開發提供了各類有用的框架,而且大部分與用戶界面有關,本質上來講它負責用戶在 iOS 設備上的觸摸交互操做。
Media 是媒體層,經過它咱們能夠在應用程序中使用各類媒體文件,進行音頻與視頻的錄製,圖形的繪製,以及製做基礎的動畫效果。
Core Services 是核心服務層,能夠經過它來訪問 iOS 的一些服務。
Core OS 是位於 iOS 系統架構最下面的一層是核心操做系統層,它包括內存管理、文件系統、電源管理以及一些其餘的操做系統任務。它能夠直接和硬件設備進行交互。做爲 app 開發者不須要與這一層打交道。
Android 使用的語言主要是 Java,也能夠經過 jni 來運行 C 語言編寫的代碼或者庫,從而提升運行效率。
Kotlin 是 Google 推薦的新的編程語言
上古時代:集成了 android 開發插件的 Eclipse,使用的是 Ant 構建工具
摩登時代:Android Studio,源自 jetbrain 的 idea 開發工具 ,使用 gradle 構建項目
windows / linux / mac
Android Studio
iOS 使用的語言主要是 objective-c 語言,發明於上世紀八十年代
Swift 是這幾年開始推薦的語言
Xcode 開發環境,必須使用 mac 系統才能開發。
mac
Xcode
Android 程序主要有如下幾個部分組成:
Android 工程
代碼展開
iOS 程序主要有如下幾個部分組成:
[UIViewController loadView] [UIViewController viewDidLoad] [UIViewController viewWillAppear:] [UIViewController shouldAutorotateToInterfaceOrientation:] [UIViewController viewWillLayoutSubviews] [UIView layoutSubviews] [UIViewController viewDidLayoutSubviews] [UIViewController viewDidAppear:]
-(void) toMainViewControllerAfterSeconds{
MainViewController *mainVC = [[MainViewController alloc] init];
[self presentViewController:mainVC animated:YES completion:nil]; }
其中的數據能夠經過 UIViewController 對象自定義屬性 / 變量來傳遞
UINavigationController 用來管理視圖控制器,在多視圖控制器中經常使用。它以棧的形式管理視圖控制器,管理視圖控制器個數理論上不受限制 (實際受內存限制),push 和 pop 方法來彈入彈出控制器,最多隻能顯示一個視圖控制器,那就是處於棧頂的視圖控制器。
通常狀況下,UINavigationController 最少管理一個控制器,即最少有一個根視圖控制器或者叫作棧底視圖控制器。固然也有例外,若是不給它添加視圖控制器也不會報錯,界面上也有視圖,由於 UINavigationController 繼承自 UIViewController,也有本身的 view,只不過默認狀況下. view.backgroundColor 爲 nil,即透明的。
Android 中,程序入口是由 AndroidManifest.xml 文件中響應的 xml 配置指定的 application 以及程序的 activity 入口。iOS 中,程序的入口是 main.h 文件
#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }
在這裏指定了程序的代理,AppDelegate 類,至關因而 android 的 application 類。
#import "AppDelegate.h" #import "SplashViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; SplashViewController *appStartController = [[SplashViewController alloc] init]; self.window.rootViewController = appStartController; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application { } - (void)applicationDidEnterBackground:(UIApplication *)application { } - (void)applicationWillEnterForeground:(UIApplication *)application { } - (void)applicationDidBecomeActive:(UIApplication *)application { } - (void)applicationWillTerminate:(UIApplication *)application { } @end
AppDelegate 的頭文件:
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @end
iOS 中的資源文件能夠放在任意一個文件夾下,但特色是整個工程不能有重複的文件名。在圖片適配方面,iOS 採用圖片名稱 +@2x.png 的方式,適配大屏手機。Android 採用的是放置在不一樣的資源文件夾下,如 drawable drawable-hdpi drawable-xxhdpi 等,同一個相同圖片文件的名稱必須相同。
Android 添加 view 採用的是使用 layout 文件的方式,也可使用代碼的方式,即 addView()。
iOS 可使用 xcode 提供的 storyboard 工具,來拖動調整控件,並經過在 storyboard 文件中指定對應的 viewcontroller 類,來對 viewcontroller 進行 view 的佈局,也可使用代碼 addSubView 的方式進行添加,因爲 iOS 的佈局代碼佈局方式比較繁瑣,通常採用第三方的代碼佈局方案,如 masonry:
[_statusBarView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view).offset(0); make.size.mas_equalTo(CGSizeMake(self.view.frame.size.width, UI_STATUS_BAR_HEIGHT)); }];
可採用 pod 的方式引用
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' target 'TestOC' do pod 'AFNetworking', '~> 2.6.3’ pod 'Masonry' pod 'Toast', '~> 3.1.0' pod 'JSONModel' pod 'SDWebImage', '~>3.8' end
可採用 gradle 的方式引用
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' target 'TestOC' do pod 'AFNetworking', '~> 2.6.3’ pod 'Masonry' pod 'Toast', '~> 3.1.0' pod 'JSONModel' pod 'SDWebImage', '~>3.8' end
apply plugin: 'com.android.application'
apply plugin: 'io.fabric' apply plugin: 'com.neenbedankt.android-apt' android { useLibrary 'org.apache.http.legacy' dexOptions { jumboMode = true javaMaxHeapSize = "6g" dexInProcess = true } compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "org.wordpress.android" versionName "alpha-62" versionCode 426 minSdkVersion 16 targetSdkVersion 25 multiDexEnabled true vectorDrawables.useSupportLibrary = true buildConfigField "boolean", "AZTEC_EDITOR_AVAILABLE", "true" buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "false" buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "false" } productFlavors { vanilla { buildConfigField "boolean", "AZTEC_EDITOR_AVAILABLE", "false" } zalpha { applicationId "org.wordpress.android" buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "true" buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "true" } wasabi { applicationId "org.wordpress.android.beta" minSdkVersion 21 buildConfigField "boolean", "SHARING_FEATURE_AVAILABLE", "true" } } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' } debug { minifyEnabled false buildConfigField "String", "APP_PN_KEY", "\"org.wordpress.android.debug.build\"" buildConfigField "boolean", "VIDEO_OPTIMIZATION_AVAILABLE", "true" ext.enableCrashlytics = false } } } dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') { transitive = true; } compile 'com.google.code.gson:gson:2.6.+' compile 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' compile 'com.android.support:support-compat:25.3.1' compile 'com.android.support:support-core-ui:25.3.1' compile 'com.android.support:support-fragment:25.3.1' compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:cardview-v7:25.3.1' }
項目名稱 | 項目信息 |
---|---|
AFNetworking | 做者是 NSHipster 的博主, iOS 開發界的大神級人物, 畢業於卡內基 · 梅隆大學, 開源了許多牛逼的項目, 這個即是其中之一, AFNetworking 採用 NSURLConnection + NSOperation, 主要方便與服務端 API 進行數據交換, 操做簡單, 功能強大, 如今許多人都用它取代 ASIHTTPRequest |
GPUImage | 一款強大的圖片濾鏡工具, 支持自定義濾鏡, 可用來實時處理圖片和視頻流, 做者是 SonoPlot 公司的 CTO, 在很小的時候便開始接觸編程, 他在 SO 上面的回答也有不少值得閱讀, GPUImage 這個項目從 2012 年開始, 使用 OpenGL 圖形程序接口編寫, 性能很是好, 如今不少 iOS 程序員都用它來實現 iOS 的模糊效果 |
SDWebImage | 做者 Olivier Poitrey 是 Dailymotion 的 CTO, 擁有多個不錯的開源項目, 此項目經常使用於對從 Web 端接受到的圖片進行緩存, 是 UIImageView 的擴展, 應用起來比較簡單 |
RestKit | 主要用於 iOS 上網絡通訊, 容許與 RESTful Web 服務交互, 經常使用於處理 API, 解析 JSON, 映射響應對象等操做, 簡單易用, 方便你把全部精力都放在對數據的操做上 |
ReactiveCocoa | 由 GitHub 工程師們開發的一個應用於 iOS 和 OS X 開發的函數響應式編程新框架, Matt 稱其爲 "An open source project that exemplifies this brave new era for Objective-C", 也有人說它是 Cocoa 的將來, 具體可看唐巧寫的這篇文章 |
three20 | 由 Facebook iOS 客戶端衍生出的一款 iPhone 框架, 內置許多豐富的功能, 有豐富的界面, 對底層的操做便捷, 爲開發者省下了不少時間, 但如今已經中止了更新, 一個 PR 把代碼刪得乾乾淨淨, 不要好奇去點開 Files changed, 我點開後該頁面直接卡死, three20 當中的一位做者建立了 Nimbus, 算是 three20 的一個替代品 |
MBProgressHUD | 做者 Matej Bukovinski 是一位全棧工程師, UI/UX 設計師, 此項目是一款提示框第三方庫, 幫助開發者快速應用到項目中) |
MagicalRecord | 做者是 Coursera 的 iOS 工程師, 該項目創做靈感來自於 Ruby on Rails 的 Active Record, 主要爲方便操做 CoreData 而生, 幫助清除 CoreData 引用的代碼, 協助方便 CoreData 的工做 |
FMDB | 一個對 SQLite 進行封裝的庫, 使用起來方便, 簡單 |
Mantle | 做者是 GitHub 的員工, 文檔寫的很清楚: Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application, 主要用來將 JSON 數據模型化爲 Model 對象, 唱吧在前段時間也改用 Mantle 了. |
FlatUIKit | 收集了不少扁平化 UI 的 iOS 組件, 方便使用 |
ASIHTTPRequest | 一個輕量級的 iOS 網絡通訊類庫, 基於 CFNetwork 框架開發, 但如今已經中止更新, 多數開發者改用 AFNetworking 替代) |
FastImageCache | Path 公司出品的 iOS 庫, 做者 Mallory Paine 是蘋果前員工, 此類庫適用於在滾動時快速顯示圖像, 高速持久是其最大的特色 |
Masonry | 一個輕量級的佈局框架, 同時支持 iOS 和 Mac OS X, 語法優雅, 幫助開發者快速適配不一樣分辨率的 iOS 設備 |
Shimmer | Facebook 推出的一款具備閃爍效果的第三方控件, 供它旗下一款名爲 Paper 的應用使用, 安裝使用整個過程都十分簡單 |
SVProgressHUD | 又一款輕量級的 iOS 第三方控件, 用於顯示任務加載時的動畫, 很是輕便, 容易使用 |
Slate | 一款窗口管理應用程序, 但在兩年前就已經中止更新了 |
JSONKit | 主要用於解析 JSON, 適用於 iOS6 如下環境, 自從 iOS5 開始 Apple 官方給出了 NSJSONSerialization API, 自此你們都用官方的了 |
項目名稱 | 項目簡介 |
---|---|
react-native | 這個是 Facebook 在 React.js Conf 2015 大會上推出的基於 JavaScript 的開源框架 React Native, 該框架結合了 Web 應用和 Native 應用的優點, 可使用 JavaScript 來開發 iOS 和 Android 原生應用 |
Android-Universal-Image-Loader | ImageLoader 是最先開源的 Android 圖片緩存庫, 強大的緩存機制, 早期被普遍 Android 應用使用, 至今仍然有不少 Android 開發者在使用 |
RxJava | RxJava 是一個在 Java VM 上使用可觀測的序列來組成異步的, 基於事件的程序的庫, 簡單來講它就是一個實現異步操做的庫, RxJava 的優勢在於一個詞 "簡潔", 使用它就算你程序邏輯有多麼複雜, 它依然可以保持簡潔易懂 |
retrofit | Retrofit 是 Square 公司出品的 HTTP 請求庫, 同時是 Square 是最先開源項目之一, Retrofit 是目前 Android 最流行的 Http Client 庫之一, 目前版本是 Retrofit2.0 Beta4, 愈來愈多 Android 開發者開始使用這個請求庫了 |
okhttp | OkHttp 是 Square 公司出品的 HTTP 另外一個請求庫, Google 不推薦人們使用 HttpClient, 但是 HttpURLConnection 實在是太難用了, 所以不少人使用了 OkHttp 來解決這問題, 聽說 Android4.4 的源碼中能夠看到 HttpURLConnection 已經替換成 OkHttp 實現呢 |
SlidingMenu(不建議使用) | 一個側滑菜單開源庫, 在 Google 本身原生態的側滑菜單 NavigationDrawer 沒有出現以前, 這個庫就已經被普遍使用, 但是到如今這個庫已經被放棄了 |
picasso | Picasso 是 Square 公司出品的一款圖片緩存庫, 主導者是 JakeWharton 大神 |
android-best-practices | Android 開發最佳實踐, 裏面所介紹的經驗都是來自於 Futurice 公司 Android 開發者, 介紹內容有 Android 開發規範, 架構, 佈局技巧, 以及使用一些有助於快速開發相關工具等等, 很是適合新手去學習 |
EventBus | EventBus 是 Android 事件管理總線, 使用它能夠替帶 Android BroadCast, BroadCastReceiver, Handler 在 Activity, Fragment, Service, 線程之間傳遞消息, 大大簡化了事件傳遞邏輯 |
android-async-http | Android-Async-Http 是 Android 一款老牌異步請求庫, 專門對 Android 在 Apache 的 HttpClient 基礎上構建的異步 http 鏈接, 該庫有不少特徵, 例如: 庫的 size 小, 支持文件上傳不需使用第三方庫支持, 內部使用線程池來處理併發, 等等 |
fresco | Fresco 是 FaceBook 公司出品的一款圖片緩存庫, Fresco 是一個強大的圖片加載組件, 支持加載 Gif 圖和 WebP 格式, 支持 Android2.3(API level 9) 及其以上系統, Fresco 中設計了 Image pipeline 和 Drawees 兩個模塊各施其職, 使得圖片完美加載出來, 想知道更多 image pipeline 和 Drawees 有關於它的特性, 能夠到它官方平臺看介紹 |
zxing | ZXing 是二維碼領域中名氣最大的開源項目, 它提供了多個平臺的二維碼 / 條形碼掃描解決方案, 擁有掃描快, 識別率高, 使用簡單等特色 |
leakcanary | LeakCanary 是 Square 公司出的一款檢測內存泄露工具, 該工具能幫助你在開發階段方便的檢測出內存泄露的問題, 使用起來很是簡單方便 |
butterknife | 由 JakeWharton 大神開發出來的, ButterKnife 是 View 注入框架, 使用它爲了簡寫不少 findViewById 代碼, 同時還支持 View 的一些事件處理函數 |
MPAndroidChart | MPAndroidChart 是一款強大的 Android 圖表庫, 支持各類各樣圖表顯示, 能想到的圖表樣式這裏幾乎都有, 圖表還支持選擇, 拖放和縮放動畫效果 |
ActionBarSherlock (不建議使用) | ActionBarSherlock 這個庫是 JakeWharton 大神開發出來支持 Android3.0 如下版本的, 後來慢慢的 Google 也提供了 AppCompat 庫來支持 Android3.0 如下版本使用 ActionBar, 所以做者不建議咱們再使用這個庫了 |
androidannotations | AndroidAnnotations 是一個可以讓你快速進行 Android 開發的開源框架, 它能讓你專一於真正重要的地方, 使代碼更加精簡, 使項目更加容易維護, 它的目標就是 "Fast Android Development.Easy maintainance" |
ViewPagerIndicator | 由 JakeWharton 大神開發出來的一個 ViewPager 指示器, 使用起來簡單方便, 可高度定製, 開發出各類各樣動畫效果 |
glide | Glide 是 Google 員工的開源項目, 普遍應用於 Google 一些 App 上, 在 2014 年 Google I/O 大會上被推薦使用, Glide 和 Picasso 被人拿來比較研究過, Glide 與 Picasso 有 90% 的類似度, 但在一些細節上仍是有點區別的, 各有各優缺點看君選擇 |
HomeMirror | 開發者是由一名程序媛 Hannah Mittelstaedt , HomeMirror 是一款 Android 鏡子應用, 目前它能實現日期, 時間, 天氣, 生日信息, 事件提醒器, 騎車天氣的推薦, 股票信息, XKCD 漫畫網站的新帖等等 |
Android-PullToRefresh(不建議使用) | 一個強大的拉動刷新開源項目, 支持各類控件下拉刷新, ListView, ViewPager, WebView, ExpandableListView, GridView, ScrollView, Horizontal ScrollView, Fragment 上下左右拉動刷新, 不過如今這個項目已經中止維護更新了, 推薦使用 Android-Ultra-Pull-To-Refresh |
MaterialDesignLibrary | 這個庫控件都是遵循了 Google Material Design 設計規範開發出來, 例若有: Flat Button, Rectangle Button, CheckBox, Switch, Progress bar circular indeterminate 等等 |
PhotoView | PhotoView 是 ImageView 的子類, 支持全部 ImageView 的源生行爲, 例如: 支持 Pinch 手勢自由縮放, 支持雙擊放大 / 還原, 支持平滑滾動等等, 而且很是方便的與 ImageLoader/Picasso 之類的網絡圖片讀取庫集成使用, 還方便的與 ViewPager 等一樣支持滑動手勢的控件集成 |
RxAndroid | 由 JakeWharton 大神主導開發的項目, RxAndroid 是 RxJava 的一個針對 Android 平臺的擴展, 主要用於 Android 開發 |
未完待續