給iOS開發者的Android開發建議
本人從事iOS應用開發已經5年有餘,直到現在還總是刻意迴避Andriod應用的開發。但是不管你信不信,安卓開發還是很有意思的,從iOS轉向Android應用開發的跨度並沒有你想象的那麼大。
現在我把在開發7分鐘訓練這款Android應用中所學到的一些東西與大家分享,希望能對你們有所幫助。需要指出的是,我稍後所比較的每個專案並不是完全匹配的,並且這篇文章並不是一個完整的Android應用開發概述,但是它包涵了我從開發這個簡單應用所學到的點點滴滴。
開發環境
開發環境我選擇了Android Studio,我打賭當正式版釋出以後,它將成為Android應用的標準開發環境。雖然有很多關於Android Studio 不穩定的言論,但是我只遇到了一次程式崩潰,個人認為Android Studio穩定性尚可,也許是已經適應了Xcode的習慣性程式崩潰吧。
Java
說說你對Java瞭解多少,說白了它只是另外一門程式語言。像其他語言一樣,協助你利用計算機實現你的想法,如果你是個經驗豐富的程式設計師,你將會把更多的精力投入到應用的架構,而不是Java語言本身。謝天謝地,我們並不需要學習J2EE。
模擬器
在使用Android 模擬器之前,我習慣性的認為iOS的模擬器糟糕透了,現在看來iOS的模擬器還是很給力的。能不用Android模擬器就儘量別用,直接上真機除錯;要不然你就準備好把大把時間花在無謂的等待上吧。
Storyboard / NIBS
對於storybaord的使用,在我之前iOS開發的文章中已經有所闡述,在是否使用Storyboard這個問題上,之後還收到了持不同看法的讀者措辭強烈的來信,今天對此我們不予討論。
Android 使用xml來編寫佈局。不同佈局彼此是完全獨立的。Android Studio同時也提供了一個非常好的WYS|WYG編輯器:
你也可以深入原始xml檔案進行編輯(我自己經常這麼做)。
各種佈局容器可以被用來當做自動佈局的替代方案,比如 Relative Layout, Framelayout 等等。選中佈局後,你可以對佈局的寬度,高度,填充,留白,比重等屬性進行畫素(dp 裝置畫素)級的設定,或者直接將它們設定為match parent, wrapcontent。
Wrap-content 對於文字來說是個很好的選擇,它會自動根據文字來決定檢視的尺寸。
雖然我還沒有習慣使用fragments,但似乎確實是一個不錯的自定義介面的複用的方式。
UIViewController
Android中等同於iOS UiViewController的是一個叫Activity的元件。你所看到的每個檢視和視窗都是一個Activity。在Activity中,你做的最多的就是把資料和UI繫結,處理各種事件等等。
Transitioning Controllers / Views
在iOS中我們使用segues、 pushViewController、 presentController 進行不同檢視間的切換。在Android中,我們則用一個叫Intent的元件。
你可以輕鬆地使用intent去建立一個新的Activity,甚至是傳遞一些資料給新建立的Activity。
public void onItemClick(...) { Intent i = new Intent(getBaseContext(), MyActivity.class); i.putExtra("row", position); startActivity(i); }
在新建立的Activity(如上所示的MyActivty)中,你可以以這樣方式提取之前Activity傳遞的資料。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mine); Bundle extras = getIntent().getExtras(); if (extras != null) { int row = extras.getInt("row"); .... } ... }
你也可以使用Intent去觸發一些東西,例如:分享頁面。
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "Share This"); sendIntent.setType("text/plain"); startActivity(sendIntent);
IBOutlet
如果你像我一樣至少有一半時間會忘記連線IBOutlets,Android將是你的福音。
Android中每一個檢視/元件都有一個唯一的ID,例如:
@+id/myButton
Android將會為這些ID自動生成一個叫做R的類(想了解更多R點選這裡),你可以通過如下的方式來操作這個Button 物件。
Button button = (Button)findViewById(R.id.myButton);
Tag
為檢視設定一個tag來查詢資訊是iOS開發者們常用的一個小技巧,例如:陣列的偏移。而在Android你可以講這個物件設定成tag,相當的有用。
row.setTag(data);
UITableViewController / UITableViewDataSource / UITableViewCell
在Android中與UITableView相對應的是ListView。
與UITableViewDataSource大體上相對應的是ArrayAdapter:
MyAdapter adapter = new MyAdapter(this, R.layout.listview_item_row); listView.setAdapter(adapter);
如上的例子中,listviewitemrow是佈局中的一行,大體上相當於一個UITableViewCell。
Adapter通過getView來建立或複用不同的列。
你還可以設定表頭:
View header = getLayoutInflater().inflate(R.layout.listview_header_row, null); listView.addHeaderView(header);
網上有大把相關的好教程,例如這個。
Images / Resources
自從Asset Catalogues在iOS出現後,對於圖片的處理就輕鬆了很多,而且只需要應付retina和非retina螢幕即可(除非你還有專門為iPad使用的圖片)。
為了適應不同Android裝置的解析度,你需要提供四套不同尺寸的圖片。
它們分別是:mdpi (中等質量)、hdpi (高質量)、 xhdpi (超高質量), xxhdpi (宇宙無敵高質量)。個人很期待xxhdpi畫質的出現。
當你在Android Studio裡建立工程的時候,它會為你所提供的應用圖示自動生成四種不同尺寸的圖示。這可把設計師們嚇的心肝兒發顫了吧,別擔心,稍後它們還是可以被完美的圖示所替換的。
所以,基本的理念就是對應不同的螢幕解析度建立不同的圖片,並用與之相對應的螢幕解析度的名字命名後,放入正確的資料夾中,之後的事情就交給Android去處理吧。
自定義字型
自定義字型在Android中也相當容易實現:拷貝字型到main/assets資料夾,之後你可以像這樣呼叫他們:
Typeface font = Typeface.createFromAsset(getAssets(), "Lato-Regular.ttf"); textView.setTypeface(font);
這種方法並不是在所有裝置上都可行,最好還是加上try/catch方法來處理異常,即是在我的兩臺Android裝置上從來沒有出現過異常。
NSLog
看來Log 似乎是Android給我們提供的解決方案,你指定log的型別:debug ,verbose等等。當然,Java最基本的列印語句System.out.println(..) 也是行得通的。
向下相容性
我們常聽說Android碎片化。對於這個問題在Android中的解決技巧,跟我們在使用iOS新特性又要兼顧老版本時所採用的技巧基本上差不多。 你也許需要更頻繁,更長久的使用這些技巧。
Android中有一個非常有用的常量供你查詢當前的Android的API版本號。
if (Build.VERSION.SDK_INT >= 11.0) { ... }
你可以這樣來遮蔽警告:
@SuppressLint({"NewApi", "LocalSuppress"}) private void myFunction() { ... }
令人詫異的東西
計時器
我對Android內建了計時器這樣的功能感到非常興奮,它正是我開發7分鐘訓練所需要的。可是它不傳送在計時結束前的最後一次訊號,就是這樣一個令人詫異的bug,仍舊沒有得到修復。惱火,太惱火了!
螢幕方向
當使用者旋轉螢幕的時候,activity被完全重置,這意味著你需要儲存所有activity重置前的狀態,並在activity繼續後重新還原這些狀態。這可能會讓你感到有點詫異,因為在iOS中旋轉螢幕,你不需要做任何處理,一切照舊。
Kindle Fire / Amazon Store
在亞馬遜商店釋出應用相當簡單,我只想說兩點:
- YouTube的SDK將會停止工作,因為需要Youtube 應用的支援,而YouTube應用在此是不可用的,但似乎它們是支援Flash的。
- 為了亞馬遜商店,你需要清除原始碼裡的內購程式碼。
你可以通過使用android.os.Build.MANUFACTURER 和 android.os.Build.MODEL. 來查詢裝置的製造商和型號。
在此列出一份kindle fire型號詳細資料清單。
下一步?
希望未來我能給7分鐘訓練這個應用新增更多的功能,並且開發更多的Android應用。我相信我只看到了Android的冰山一角。誰知道呢,說不定接下來還有初探應用商店的精彩教程等著你呢。
原文連結: STUART HALL 翻譯: 伯樂線上 - 北歐的雜木林
相關文章
- 給開發維護大型專案開發者的建議
- 給PHP開發者的建議PHP
- 給Android應用開發者的十個建議Android
- 給iOS開發AIR原生擴充套件的20條建議iOSAI套件
- React Native 入門(三) - 給 Android 開發者的學習建議React NativeAndroid
- 給獨立開發商的5條PR建議
- 從業遊戲 22 年給獨立開發者的建議遊戲
- 寫給開發者:記錄日誌的10個建議
- 給遊戲開發者們的 7 個製作建議遊戲開發
- 高效開發Android App的10個建議AndroidAPP
- 給予Java初學者的建議(JavaWeb/後臺開發)JavaWeb
- 給移動應用開發新手的6個建議
- 給移動遊戲開發商的6條建議遊戲開發
- 給國內獨立遊戲開發者的一些建議遊戲開發
- 給獨立遊戲開發者掌握社交渠道的5個建議遊戲開發
- 給遊戲引擎開發者的 64 個建議(1):客戶端遊戲引擎客戶端
- 分享:高效開發Android App的10個建議AndroidAPP
- Google技術開發指南:給大學生自學的建議Go
- iOS開發學習路徑的一些建議iOS
- 對Android開發者有益的40條優化建議Android優化
- 給開發人員的幾點建議:如何理解你的DBATHBAT
- 給PHP開發者第一份工作的9條建議PHP
- 給Android程式設計師的六個建議Android程式設計師
- 給好學進取的開發者的一些建議(自學故事)
- 關於Android開發的40條優化建議Android優化
- 開發者 請優先開發Android應用而非iOSAndroidiOS
- iOS開發- tableView的協議iOSView協議
- go語言開發入門:GO 開發者對 GO 初學者的建議Go
- golang開發:go併發的建議Golang
- 關於優化iOS & Android遊戲發行計劃的幾點建議優化iOSAndroid遊戲
- iOS 實際開發中對效能優化的幾點建議iOS優化
- 給IT新人的15點建議
- iOS 開發編碼建議與程式設計經驗iOS程式設計
- 給 itpub 提建議
- Android / iOS開發者開發小程式前要做哪些準備AndroidiOS
- 開發者經驗:為Android開發比iOS貴4倍AndroidiOS
- 給Android程式設計師的一些面試建議Android程式設計師面試
- 給Java開發初學者的10個學習建議,助你學習事半功倍!Java