給 iOS 開發者的 Android 開發建議

jopen 10年前發布 | 31K 次閱讀 Android

本人從事iOS應用開發已經5年有余,直到現在還總是刻意回避Andriod應用的開發。但是不管你信不信,安卓開發還是很有意思的,從iOS轉向Android應用開發的跨度并沒有你想象的那么大。

現在我把在開發7分鐘訓練這款Android應用中所學到的一些東西與大家分享,希望能對你們有所幫助。需要指出的是,我稍后所比較的每個項目并不是完全匹配的,并且這篇文章并不是一個完整的Android應用開發概述,但是它包涵了我從開發這個簡單應用所學到的點點滴滴。

給 iOS 開發者的 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");         ....      }      ...  }</pre>

你也可以使用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

在亞馬遜商店發布應用相當簡單,我只想說兩點:

  • 油Tube的SDK將會停止工作,因為需要油Tube 應用的支持,而油Tube應用在此是不可用的,但似乎它們是支持Flash的。

  • 為了亞馬遜商店,你需要清除源代碼里的內購代碼。

你可以通過使用android.os.Build.MANUFACTURER 和 android.os.Build.MODEL. 來查詢設備的制造商和型號。

在此列出一份kindle fire型號詳細資料清單

下一步?

希望未來我能給7分鐘訓練這個應用添加更多的功能,并且開發更多的Android應用。我相信我只看到了Android的冰山一角。誰知道呢,說不定接下來還有初探應用商店的精彩教程等著你呢。

原文鏈接: STUART HALL   翻譯: 伯樂在線 - 北歐的雜木林
譯文鏈接: http://blog.jobbole.com/69329/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!