自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

適用于iOS開(kāi)發(fā)者的Android開(kāi)發(fā)技巧

譯文
移動(dòng)開(kāi)發(fā) Android iOS
我曾經(jīng)從事過(guò)五年的iOS應(yīng)用開(kāi)發(fā)工作,那段時(shí)間我一直在盡量避免同Android打交道——不過(guò)現(xiàn)在情況不同了。不管大家是否相信,Android開(kāi)發(fā)其實(shí)樂(lè)趣滿滿、而且與iOS開(kāi)發(fā)相比也不像大家想象的那樣差異巨大。本文跟大家一起討論一下iOS開(kāi)發(fā)者如何著手開(kāi)發(fā)Android應(yīng)用。

我曾經(jīng)從事過(guò)五年的iOS應(yīng)用開(kāi)發(fā)工作,那段時(shí)間我一直在盡量避免同Android打交道——不過(guò)現(xiàn)在情況不同了。不管大家是否相信,Android開(kāi)發(fā)其實(shí)樂(lè)趣滿滿、而且與iOS開(kāi)發(fā)相比也不像大家想象的那樣差異巨大。

[[111130]]

我在Android平臺(tái)上開(kāi)發(fā)出這款“七分鐘鍛煉”應(yīng)用,并借此學(xué)到了很多寶貴的知識(shí)。我希望這篇文章分享的一些小技巧也能幫助大家解決實(shí)際問(wèn)題。請(qǐng)注意,我接下來(lái)進(jìn)行比較的內(nèi)容并不一定完全匹配,而且本文的重點(diǎn)也不在于完整地?cái)⑹鯝ndroid開(kāi)發(fā);當(dāng)然,我一定會(huì)提到自己在開(kāi)發(fā)這款簡(jiǎn)單應(yīng)用的過(guò)程中所積累到的全部經(jīng)驗(yàn)。

IDE

我選擇使用Android Studio,而且我愿意打賭:只要測(cè)試完成,它將成為未來(lái)的業(yè)界標(biāo)準(zhǔn)。雖然很多報(bào)道稱它的運(yùn)行狀態(tài)并不穩(wěn)定,但在我的實(shí)際使用中、它僅僅崩潰過(guò)一次。也許我只是習(xí)慣了Xcode。

Java

無(wú)論大家對(duì)Java如何評(píng)價(jià),說(shuō)到底它也只是不過(guò)是一種編程語(yǔ)言而已。它能夠解決問(wèn)題,而且對(duì)于經(jīng)驗(yàn)豐富的開(kāi)發(fā)者來(lái)說(shuō)、大家肯定是把主要精力放在框架而非Java身上。很高興我用不著跟J2EE扯上關(guān)系。

模擬器

我一直認(rèn)為iOS模擬器讓人頭痛不已,但相比之下我才發(fā)現(xiàn)當(dāng)初的自己還是太年輕。在稍作嘗試之后,我決定放棄Android模擬器、直接將應(yīng)用部署在實(shí)際設(shè)備上——除非大家愿意拿出大量時(shí)間盯著屏幕枯等。

Storyboard / NIB

我在自己的iOS開(kāi)發(fā)博客上談了很多關(guān)于Storyboard的話題,很多與我意見(jiàn)相左的讀者發(fā)來(lái)的一些措辭強(qiáng)硬的郵件讓我徹底放棄了這一交流平臺(tái)。

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

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

相對(duì)于自動(dòng)布局,大家也可以選擇其它布局容器,例如RelativeLayout以及FrameLayout之類(lèi)。在這里,我們能夠以像素?cái)?shù)量(即設(shè)備的像素容納能力)或者matchparent、wrapcontant等來(lái)設(shè)定理想的寬度、高度、填充效果、邊框以及色調(diào)。

Wrap非常適合文本內(nèi)容,它會(huì)自動(dòng)將調(diào)整正確的高度并設(shè)定與之相適應(yīng)的尺寸,并把其余工作交給LinearLayout等特定布局方案。

雖然我還沒(méi)有用過(guò),但Fragment看起來(lái)同樣是一種對(duì)自定義UI元素加以重新利用的好途徑。

UIViewController

Android利用一個(gè)Activity來(lái)實(shí)現(xiàn)UIViewConroller的功能。每一個(gè)屏幕/窗口都相當(dāng)于一個(gè)Activity。我們就在這里處理大部分工作,包括將數(shù)據(jù)綁定到UI當(dāng)中或者處理事件等等。

Controller/View轉(zhuǎn)換

在iOS當(dāng)中我們利用segue、pushViewController、presentController等在不同屏幕之間進(jìn)行遷移。但在Android環(huán)境下,我們需要使用Intent。

大家可以輕松遷移至新的activity當(dāng)中,甚至能夠?qū)⒁徊糠謹(jǐn)?shù)據(jù)傳遞過(guò)去。

  1. public void onItemClick(...) { 
  2.        Intent i = new Intent(getBaseContext(), MyActivity.class); 
  3.        i.putExtra("row", position); 
  4.        startActivity(i); 

在新的Activity(也就是以上代碼中的MyActivity)中,我們可以提取出傳遞來(lái)的數(shù)據(jù):

  1. protected void onCreate(Bundle savedInstanceState) { 
  2.     super.onCreate(savedInstanceState); 
  3.     setContentView(R.layout.activity_mine); 
  4.  
  5.     Bundle extras = getIntent().getExtras(); 
  6.     if (extras != null) { 
  7.         int row = extras.getInt("row"); 
  8.         .... 
  9.      } 
  10.      ... 
  11.  } 

大家也可以利用Intent來(lái)觸發(fā)各類(lèi)事件,例如實(shí)現(xiàn)表格共享:

  1. Intent sendIntent = new Intent(); 
  2.  sendIntent.setAction(Intent.ACTION_SEND); 
  3.  sendIntent.putExtra(Intent.EXTRA_TEXT, "Share This"); 
  4.  sendIntent.setType("text/plain"); 
  5.  startActivity(sendIntent); 

IBOutlet

也許大家跟我一樣,在超過(guò)半數(shù)的情況下會(huì)忘記連接IBOutlet。

在Android當(dāng)中,每一個(gè)場(chǎng)景/組件都擁有獨(dú)立的ID,內(nèi)容如下所示:

  1. @+id/myButton 

它隨后會(huì)自動(dòng)生成一個(gè)名為R的類(lèi)(大家可以點(diǎn)擊此處了解與R相關(guān)的信息),接下來(lái)我們可以如下所示訪問(wèn)代碼中的按鈕:

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

標(biāo)簽

iOS開(kāi)發(fā)者們經(jīng)常使用的一項(xiàng)技巧就是利用場(chǎng)景標(biāo)簽來(lái)保存查找信息,例如整體布局的位移。在Android環(huán)境下,大家也可以將整個(gè)對(duì)象加入到標(biāo)簽當(dāng)中,這種作法非常實(shí)用。

  1. row.setTag(data); 

UITableViewController / UITableViewDataSource / UITableViewCell

Android當(dāng)中的ListView就相當(dāng)于iOS上的UITableView。

而UITableViewDataSource在Android中所對(duì)應(yīng)的則是ArrayAdapter:

  1. MyAdapter adapter = new MyAdapter(this, R.layout.listview_item_row); 
  2.    listView.setAdapter(adapter); 

其中l(wèi)istviewitemrow屬于某一行的布局,相當(dāng)于iOS中的UITableViewCell。

其中的adapter隨后會(huì)在getView當(dāng)中創(chuàng)建/重新使用各行。

大家也可以像這樣設(shè)置標(biāo)題:

  1. View header = getLayoutInflater().inflate(R.layout.listview_header_row, null); 
  2.     listView.addHeaderView(header); 

互聯(lián)網(wǎng)上提供了大量?jī)?yōu)秀的指導(dǎo)教程,感興趣的朋友可以點(diǎn)擊此處查看其中之一。

圖片/資源

由于有了Asset Catalogue的輔助,iOS環(huán)境下的圖片處理變得非常輕松,通常情況下開(kāi)發(fā)者只需考慮視網(wǎng)膜屏與非視網(wǎng)膜屏這兩種情況(除非大家想要在iPhone上使用專門(mén)針對(duì)iPad的圖片)。

由于Android陣營(yíng)下各款設(shè)備的分辨率千差萬(wàn)別,因此大家必須要提供以下四種圖片格式。

它們分別是:mdpi(普通分辨率)、hdpi(高分辨率)、xhdpi(超高分辨率)以及xxhdpi(超超高分辨率)。我個(gè)人認(rèn)為xxxhdpi版本的誕生將只是時(shí)間問(wèn)題。

在利用Android Studio創(chuàng)建項(xiàng)目時(shí),大家只需要提供一份圖標(biāo)、它就能自動(dòng)創(chuàng)建出這四種格式。這種作法相信已經(jīng)給從事過(guò)Android應(yīng)用開(kāi)發(fā)的朋友們留下了嚴(yán)重的心理陰影:別怕,大家可以隨后手動(dòng)將其替換為***的像素版本。

因此,最基本的解決思路就是為每幅圖片針對(duì)每種像素密度創(chuàng)建一個(gè)單獨(dú)的版本,為其設(shè)定同樣的名稱并放在正確的文件夾之下;這樣Android就會(huì)視設(shè)備平臺(tái)的具體情況挑選理想的版本。

自定義字體

自定義字體在Android上實(shí)現(xiàn)起來(lái)同樣非常簡(jiǎn)單:將字體復(fù)制到main/assets當(dāng)中,而后就能利用以下代碼加以調(diào)用:

  1. Typeface font = Typeface.createFromAsset(getAssets(), "Lato-Regular.ttf"); 
  2.         textView.setTypeface(font); 

問(wèn)題在于這種方式并不是在所有設(shè)備上都行得通,因此大家需要準(zhǔn)備一套后備字體——不過(guò)我自己手頭的兩臺(tái)Android設(shè)備都沒(méi)有提供這樣的字體。

NSLog

日志看起來(lái)沒(méi)什么可講的,大家可以利用它來(lái)進(jìn)行應(yīng)用程序調(diào)試什么什么的(此處省去一千字)。System.out.println(..)似乎也同樣能夠完成這項(xiàng)任務(wù)。

向下兼容能力

我們都聽(tīng)說(shuō)過(guò)Android設(shè)備的碎片化問(wèn)題。不過(guò)從本質(zhì)上講,處理舊版本Android的難度并不比在舊版本iOS上使用新型iOS功能更高。不過(guò)大家可能需要對(duì)這種兼容能力加以高度重視,畢竟Android環(huán)境下這類(lèi)問(wèn)題的出現(xiàn)頻率要遠(yuǎn)高于iOS。

我們可以通過(guò)下列代碼來(lái)檢查當(dāng)前Android版本:

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

以下代碼則用于防止函數(shù)調(diào)用引發(fā)的警告信息:

  1. @SuppressLint({"NewApi""LocalSuppress"})  
  2. private void myFunction() {  
  3. ...  
  4. }  

千奇百怪的漫長(zhǎng)Android之旅

CountDownTimer

CountDownTimer——這項(xiàng)內(nèi)置功能的存在實(shí)在讓我興奮不已,因?yàn)檫@正是我的七分鐘鍛煉應(yīng)用所必需的要素。然而經(jīng)過(guò)實(shí)際測(cè)試,它不會(huì)在onFinish之前發(fā)送***一次onTick,這是個(gè)非常詭異的bug而且到現(xiàn)在也沒(méi)能得到修復(fù)。詭異,真是太詭異了。

方位

當(dāng)用戶轉(zhuǎn)動(dòng)手中的設(shè)備時(shí),我們的activity也會(huì)完全重置,這意味著大家必須在activity重新載入之后為其保留全部狀態(tài)與恢復(fù)機(jī)制。Android環(huán)境下的處理方式令人頭痛,但iOS則處理得很好。

Kindle Fire / Amazon Store

要讓自己的應(yīng)用程序順利入駐Amazon Store,我只需要對(duì)現(xiàn)有成果作出兩項(xiàng)調(diào)整:

·YouTube SDK無(wú)法起效,因?yàn)镵indle Fire上不提供YouTube應(yīng)用。不過(guò)對(duì)Flash的支持能力依然被保留下來(lái)。

·大家需要針對(duì)Amazon Store替換應(yīng)用購(gòu)買(mǎi)代碼。

大家可以利用android.os.Build.MANUFACTURER以及android.os.Build.MODEL對(duì)設(shè)備的制造商以及產(chǎn)品型號(hào)信息進(jìn)行檢測(cè)。

點(diǎn)擊此處查看關(guān)于Kindle Fire各機(jī)型的詳細(xì)信息。

原文鏈接:

http://stuartkhall.com/posts/android-development-tips-for-ios-devs

原文鏈接:Android Development Tips for iOS Devs

核子可樂(lè)譯

 

責(zé)任編輯:閆佳明 來(lái)源: 51CTO
相關(guān)推薦

2020-12-11 09:06:50

異常監(jiān)控云服務(wù)

2022-02-10 00:16:01

開(kāi)發(fā)者元宇宙系統(tǒng)

2015-07-20 09:16:42

iOSWatchKit開(kāi)發(fā)

2021-11-04 10:42:43

汽車(chē)軟件技術(shù)

2015-10-21 13:42:54

iOS開(kāi)發(fā)watch OS2

2011-12-08 09:43:56

虛擬化vmwareVMware Fusi

2019-02-21 09:37:22

蘋(píng)果 iOS開(kāi)發(fā)者

2015-04-14 09:33:17

WatchKitAPP

2019-09-11 15:43:15

微軟LinuxMicrosoft T

2019-08-12 09:00:00

物聯(lián)網(wǎng)云平臺(tái)IOT

2020-11-05 09:39:32

Java技術(shù)開(kāi)發(fā)

2019-08-02 09:36:22

開(kāi)發(fā)者技能工具

2010-03-24 09:54:27

PHPPython

2020-05-07 10:40:37

Web工具CSS

2021-06-10 10:25:12

微軟瀏覽器Windows

2011-12-26 20:25:58

2014-08-08 10:12:44

IRC

2017-01-19 21:45:27

iOS開(kāi)發(fā)者賬號(hào)

2019-11-14 14:44:32

開(kāi)發(fā)者工具

2012-02-06 14:24:41

iOSAndroid開(kāi)發(fā)環(huán)境
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)