適用於iOS開發人員的Android開發技巧

來源:互聯網
上載者:User

適用於iOS開發人員的Android開發技巧

   我曾經從事過五年的iOS應用開發工作,那段時間我一直在盡量避免同Android打交道——不過現在情況不同了。不管大家是否相信,Android開發其實樂趣滿滿、而且與iOS開發相比也不像大家想象的那樣差異巨大。

  我在Android平台上開發出這款“七分鐘鍛煉”應用,並藉此學到了很多寶貴的知識。我希望這篇文章分享的一些小技巧也能協助大家解決實際問題。請注意,我接下來進行比較的內容並不一定完全符合,而且本文的重點也不在於完整地敘述Android開發;當然,我一定會提到自己在開發這款簡單應用的過程中所積累到的全部經驗。

  IDE

  我選擇使用Android Studio,而且我願意打賭:只要測試完成,它將成為未來的業界標準。雖然很多報道稱它的運行狀態並不穩定,但在我的實際使用中、它僅僅崩潰過一次。也許我只是習慣了Xcode。

  Java

  無論大家對Java如何評價,說到底它也只是不過是一種程式設計語言而已。它能夠解決問題,而且對於經驗豐富的開發人員來說、大家肯定是把主要精力放在架構而非Java身上。很高興我用不著跟J2EE扯上關係。

  iOS加密

  行動裝置 App安全保護平台——愛加密,在Android應用加密保護方面有dex加殼、專屬的so庫加密保護、資源檔保護等。而且推出了iOS應用加密保護,實屬全球首創。分別從本機資料、方法體/方法名、URL編碼、程式結構、網路傳輸資料等幾個方面對iOS應用進行全方位的保護,並可以根據iOS應用使用者的需求提供定製解決方案,從而實現iOS防破解保護。是iOS應用使用前後

  模擬器

  我一直認為iOS模擬器讓人頭痛不已,但相比之下我才發現當初的自己還是太年輕。在稍作嘗試之後,我決定放棄Android模擬器、直接將應用部署在實際裝置上——除非大家願意拿出大量時間盯著螢幕枯等。

  Storyboard / NIB

  我在自己的iOS開發部落格上談了很多關於Storyboard的話題,很多與我意見相左的讀者發來的一些措辭強硬的郵件讓我徹底放棄了這一交流平台。

  Android使用的布局格式為xml。它們彼此之間完全獨立。Android Studio還提供一套出色的“所見即所得 (WYSIWYG)”編輯器:

  但大家仍然可以深入到原始xml當中——如果願意的話(反正我一般是不願意這麼麻煩)。

  相對於自動布局,大家也可以選擇其它版面配置容器,例如RelativeLayout以及FrameLayout之類。在這裡,我們能夠以像素數量(即裝置的像素容納能力)或者matchparent、wrapcontant等來設定理想的寬度、高度、填充效果、邊框以及色調。

  Wrap非常適合常值內容,它會自動將調整正確的高度並設定與之相適應的尺寸,並把其餘工作交給LinearLayout等特定布局方案。

  雖然我還沒有用過,但Fragment看起來同樣是一種對自訂UI元素加以重新利用的好途徑。

  UIViewController

  Android利用一個Activity來實現UIViewConroller的功能。每一個螢幕/視窗都相當於一個Activity。我們就在這裡處理大部分工作,包括將資料繫結到UI當中或者處理事件等等。

  Controller/View轉換

  在iOS當中我們利用segue、pushViewController、presentController等在不同螢幕之間進行遷移。但在Android環境下,我們需要使用Intent。

  大家可以輕鬆遷移至新的activity當中,甚至能夠將一部分資料傳遞過去。

  public void onItemClick(...) {

  Intent i = new Intent(getBaseContext(), MyActivity.class);

  i.putExtra("row", position);

  startActivity(i);

  }

  在新的Activity(也就是以上代碼中的MyActivity)中,我們可以提取出傳遞來的資料:

  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

  也許大家跟我一樣,在超過半數的情況下會忘記串連IBOutlet。

  在Android當中,每一個情境/組件都擁有獨立的ID,內容如下所示:

  @+id/myButton

  它隨後會自動產生一個名為R的類,接下來我們可以如下所示存取碼中的按鈕:

  Button button = (Button)findViewById(R.id.myButton);

  標籤

  iOS開發人員們經常使用的一項技巧就是利用情境標籤來儲存尋找資訊,例如整體布局的位移。在Android環境下,大家也可以將整個對象加入到標籤當中,這種作法非常實用。

  row.setTag(data);

  UITableViewController / UITableViewDataSource / UITableViewCell

  Android當中的ListView就相當於iOS上的UITableView。

  而UITableViewDataSource在Android中所對應的則是ArrayAdapter:

  MyAdapter adapter = new MyAdapter(this, R.layout.listview_item_row);

  listView.setAdapter(adapter);

  其中listviewitemrow屬於某一行的布局,相當於iOS中的UITableViewCell。

  其中的adapter隨後會在getView當中建立/重新使用各行。

  大家也可以像這樣設定標題:

  View header = getLayoutInflater().inflate(R.layout.listview_header_row, null);

  listView.addHeaderView(header);

  圖片/資源

  由於有了Asset Catalogue的輔助,iOS環境下的圖片處理變得非常輕鬆,通常情況下開發人員只需考慮視網膜屏與非視網膜屏這兩種情況(除非大家想要在iPhone上使用專門針對iPad的圖片)。

  由於Android陣營下各款裝置的解析度千差萬別,因此大家必須要提供以下四種圖片格式。

  它們分別是:mdpi(普通解析度)、hdpi(高解析度)、xhdpi(超高解析度)以及xxhdpi(超超高解析度)。我個人認為xxxhdpi版本的誕生將只是時間問題。

  在利用Android Studio建立項目時,大家只需要提供一份表徵圖、它就能自動建立出這四種格式。這種作法相信已經給從事過Android應用開發的朋友們留下了嚴重的心理陰影:別怕,大家可以隨後手動將其替換為完美的像素版本。

  因此,最基本的解決思路就是為每幅圖片針對每種像素密度建立一個單獨的版本,為其設定同樣的名稱並放在正確的檔案夾之下;這樣Android就會視裝置平台的具體情況挑選理想的版本。

  自訂字型

  自訂字型在Android上實現起來同樣非常簡單:將字型複製到main/assets當中,而後就能利用以下代碼加以調用:

  Typeface font = Typeface.createFromAsset(getAssets(), "Lato-Regular.ttf");

  textView.setTypeface(font);

  問題在於這種方式並不是在所有裝置上都行得通,因此大家需要準備一套後備字型——不過我自己手頭的兩台Android裝置都沒有提供這樣的字型。

  NSLog

  日誌看起來沒什麼可講的,大家可以利用它來進行應用程式調試什麼什麼的(此處省去一千字)。System.out.println(..)似乎也同樣能夠完成這項任務。

  向下相容能力

  我們都聽說過Android裝置的片段化問題。不過從本質上講,處理舊版本Android的難度並不比在舊版本iOS上使用新型iOS功能更高。不過大家可能需要對這種相容能力加以高度重視,畢竟Android環境下這類問題的出現頻率要遠高於iOS。

  我們可以通過下列代碼來檢查當前Android版本:

  if (Build.VERSION.SDK_INT >= 11.0) {

  ...

  }

  以下代碼則用於防止函數調用引發的警告資訊:

  @SuppressLint({"NewApi", "LocalSuppress"})

  private void myFunction() {

  ...

  }

  千奇百怪的漫長Android之旅

  CountDownTimer

  CountDownTimer——這項內建功能的存在實在讓我興奮不已,因為這正是我的七分鐘鍛煉應用所必需的要素。然而經過實際測試,它不會在onFinish之前發送最後一次onTick,這是個非常詭異的bug而且到現在也沒能得到修複。詭異,真是太詭異了。

  方位

  當使用者轉動手中的裝置時,我們的activity也會完全重設,這意味著大家必須在activity重新載入之後為其保留全部狀態與恢複機制。Android環境下的處理方式令人頭痛,但iOS則處理得很好。

  Kindle Fire / Amazon Store

  要讓自己的應用程式順利入駐Amazon Store,我只需要對現有成果作出兩項調整:

  ·YouTube SDK無法起效,因為Kindle Fire上不提供YouTube應用。不過對Flash的支援能力依然被保留下來。

  ·大家需要針對Amazon Store替換應用購買代碼。

  大家可以利用android.os.Build.MANUFACTURER以及android.os.Build.MODEL對裝置的製造商以及產品型號資訊進行檢測。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.