另辟蹊徑創(chuàng)建移動應(yīng)用:iOS和Android代碼共享
過去幾年,移動應(yīng)用席卷了整個世界,在工作和生活的方方面面改變著我們使用互聯(lián)網(wǎng)的方式。創(chuàng)建移動應(yīng)用的各種技術(shù)也隨之興起,各種開發(fā)流程也 將移動應(yīng)用視為一等公民,開始考慮適應(yīng)移動開發(fā)的流程。盡管已經(jīng)讓人感覺無處不在,真正的移動應(yīng)用時代才剛剛開始。我們即將面對新一代的移動設(shè)備,如可穿戴設(shè)備或組成物聯(lián)網(wǎng)的各種各樣的移動裝置。我們將面臨全新的用于數(shù)據(jù)展示和命令接收的用戶交互接口。我們也認識到越來越多的公司將真正采取移動優(yōu)先的戰(zhàn) 略。所有的這些都將對我們未來幾年設(shè)計、開發(fā)和測試軟件的方式產(chǎn)生巨大影響。
在蘋果和安卓的應(yīng)用商店中有成千上萬各種用途的移動應(yīng)用。iOS設(shè)備上的應(yīng)用通常使用Objective-C工具庫創(chuàng)建而成,而安卓設(shè)備上的應(yīng)用則 基于Java語言。在這篇文章中我們將向您展示兩種不太常用的使用Java和Xtend構(gòu)建原生應(yīng)用的方法,這兩種方法能夠幫助開發(fā)者在兩個應(yīng)用平臺上共享代碼,從而簡化開發(fā)工作。
使用Java和RoboVM開發(fā)原生iOS應(yīng)用
將安卓和iOS兩個平臺同時作為目標平臺的移動應(yīng)用開發(fā)者經(jīng)常面臨很多挑戰(zhàn)。在比較這兩個平臺的原生應(yīng)用開發(fā)環(huán)境時,例如分別由谷歌和蘋果提供的開 發(fā)工具鏈,很容易就能夠發(fā)現(xiàn)這兩者之間有著本質(zhì)的區(qū)別。谷歌所提供的安卓開發(fā)環(huán)境是基于Eclipse集成開發(fā)環(huán)境和Java程序設(shè)計語言的。而由蘋果所 提供的iOS開發(fā)環(huán)境則是基于Xcode集成開發(fā)環(huán)境和Objective-C程序設(shè)計語言的。
這些平臺間的差異導(dǎo)致代碼無法重用。而且很少有開發(fā)者能夠同時精通兩個環(huán)境。最終就導(dǎo)致幾乎每個跨平臺的移動應(yīng)用都需要為各個平臺準備單獨的開發(fā)團隊并使用單獨的代碼庫。
RoboVM是一個新的開源項目,旨在不影響開發(fā)者和應(yīng)用用戶體驗的前提下解決上述問題。RoboVM項目的目標是在iOS設(shè)備上使用Java和其 他JVM語言,如Scala,Clojure和Kotlin。與其他類似的工具不同,RoboVM不會對開發(fā)者所使用的Java平臺特性做任何限制,如反 射機制或文件I/O,并且還允許開發(fā)人員重用Java龐大的第三方庫生態(tài)系統(tǒng)。RoboVM的獨特之處還在于開發(fā)人員能夠通過一個Java到 Objective-C的橋接器訪問到完整的原生iOS API。這樣,應(yīng)用程序開發(fā)時,就能夠用Java語言編寫真正的原生用戶交互界面并且能夠獲取到完整的硬件訪問權(quán)限,同時使用的開發(fā)工具也是Java開發(fā) 人員所熟悉的Eclipse和Maven等。
使用RoboVM,進行跨平臺開發(fā)將變得相對容易;同一組Java開發(fā)人員就有能力構(gòu)建兩個版本的移動應(yīng)用程序并且代碼庫中的相當一部分代碼都能夠被共享。
如何開始?
RoboVM有多種調(diào)用方式,如命令行方式或使用Maven或Gradle,最容易上手的方式應(yīng)該是使用RoboVM的Eclipse插件。
配置要求
安裝RoboVM的Eclipse插件之前,請確保系統(tǒng)滿足如下要求:
- 一臺運行Mac OS X 10.9操作系統(tǒng)的Mac電腦。
- Oracle Java SE 7 JDK。
- 從Mac應(yīng)用商店下載的Xcode 5.x集成開發(fā)環(huán)境。
需要注意的是,必須使用Oracle Java SE 7 JDK運行Eclipse。Eclipse無法正常運行在蘋果的Java 6 JVM之上。
安裝RoboVM的Eclipse插件
系統(tǒng)滿足所有的先決條件之后,安裝插件是一項很簡單的工作。從Eclipse的Help菜單中打開Eclipse Marketplace,搜索RoboVM并點擊Install Now即可。
或者也可以使用如下更新站點。
運行一個簡單的iOS應(yīng)用
接下來我們將創(chuàng)建一個簡單的iOS應(yīng)用。首先創(chuàng)建一個新的項目:File => New => Project......。在列表中選擇RoboVM iOS Project向?qū)А?/p>
在Project Name,Main Class和App name欄中輸入IOSDemo,在App id一欄中輸入org.robovm.IOSDemo。其他欄目保持默認值點擊Finish。
然后,創(chuàng)建一個新的名為IOSDemo的類文件,省略包名。將下面的代碼拷貝粘貼到新創(chuàng)建的文件中,替換Eclipse自動生成的代碼。
- import org.robovm.apple.coregraphics.*;
- import org.robovm.apple.foundation.*;
- import org.robovm.apple.uikit.*;
- public class IOSDemo extends UIApplicationDelegateAdapter {
- private UIWindow window = null;
- private int clickCount = 0;
- @Override
- public boolean didFinishLaunching(UIApplication application,
- NSDictionary launchOptions) {
- final UIButton button = UIButton.create(UIButtonType.RoundedRect);
- button.setFrame(new CGRect(115.0f, 121.0f, 91.0f, 37.0f));
- button.setTitle("Click me!", UIControlState.Normal);
- button.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() {
- @Override
- public void onTouchUpInside(UIControl control, UIEvent event) {
- button.setTitle("Click #" + (++clickCount), UIControlState.Normal);
- }
- });
- window = new UIWindow(UIScreen.getMainScreen().getBounds());
- window.setBackgroundColor(UIColor.colorLightGray());
- window.addSubview(button);
- window.makeKeyAndVisible();
- return true;
- }
- public static void main(String[] args) {
- NSAutoreleasePool pool = new NSAutoreleasePool();
- UIApplication.main(args, null, IOSDemo.class);
- pool.close();
- }
- }
***,右鍵點擊剛剛創(chuàng)建的項目,選擇Run As... =>iOS Simulator App (iPhone),在iOS模擬器中啟動應(yīng)用程序。這樣,應(yīng)用程序就運行在一個模擬的iPhone上了。
如果需要在真實的設(shè)備上運行應(yīng)用程序,需要使用Run As... =>iOS Device App選項。需要注意的是,執(zhí)行這一選項之前,所用到的設(shè)備需要進行相應(yīng)的設(shè)置。設(shè)置的過程超出了本文的討論范圍。詳細信息請參照蘋果的官方文檔。
#p#
創(chuàng)建用于應(yīng)用商店發(fā)布的IPA文件
如果應(yīng)用商店的發(fā)布證書(Distribution Certificate)和應(yīng)用描述文件(Provisioning Profile)已經(jīng)準備妥當,創(chuàng)建用于提交到應(yīng)用商店的IPA軟件包只需要在Eclipse中右鍵點擊RoboVM iOS項目,選擇RoboVM Tools=>Package for App Store/Ad-Hoc distribution… ,填寫對話框中相關(guān)信息即可。
完成上述操作后,將會在目標文件夾中生成一個后綴為.IPA的文件。使用Application Loader即可驗證生成的IPA文件并將其提交到應(yīng)用商店中。使用Spotlight可以很方便地定位到Application Loader應(yīng)用。
從蘋果網(wǎng)站上能夠找到很多關(guān)于如何加入iOS開發(fā)者計劃及如何創(chuàng)建用于應(yīng)用商店發(fā)布的證書和應(yīng)用描述文件的資源。
底層實現(xiàn)機制
字節(jié)碼編譯器
RoboVM的核心是它的預(yù)編譯器。預(yù)編譯器可以通過命令行或者Maven、Gradle等構(gòu)建工具或IDE調(diào)用。它可以將Java字節(jié)碼翻譯成用 于特定操作系統(tǒng)和CPU型號的機器碼。一般來說會翻譯成用于iOS系統(tǒng)和ARM處理器的機器碼,不過RoboVM也支持將字節(jié)碼轉(zhuǎn)為運行在x86 CPU(32位)上的Mac OS X和Linux系統(tǒng)的機器碼。
這種預(yù)編譯的方法與Oracle Hotspot之類的傳統(tǒng)JVM的工作機制有很大的區(qū)別。這些JVM通常會在運行時讀取Java字節(jié)碼,然后以某種方式執(zhí)行包含在字節(jié)碼的虛擬機指令。為 了加快這一進程,JVM采用了一種被稱為即時編譯的技術(shù)。簡單來說,這個過程會在程序***次調(diào)用某個方法時,將這一方法的虛擬機指令翻譯成當前系統(tǒng)所用的 CPU型號對應(yīng)的機器碼。
由于蘋果內(nèi)置于iOS中的技術(shù)限制,在iOS應(yīng)用中使用任何形式的即時編譯技術(shù)都是不可能的。唯一的替代方案就是使用解釋器或像RoboVM中所用 的預(yù)編譯技術(shù),而解釋器這種方式速度很慢并且十分耗電。預(yù)編譯的過程發(fā)生在使用開發(fā)者的機器進行編譯的時候,在iOS設(shè)備上運行時,生成的機器碼就能夠全 速運行,因此在速度上可以與由Objective-C編譯生成的代碼媲美,甚至可能會更快一些。
由于RoboVM預(yù)編譯器消費Java字節(jié)碼,而不是Java源代碼,因此至少在理論上可以用于任何能夠編譯成字節(jié)碼的JVM語言。目前已知的 RoboVM預(yù)編譯器能夠正常工作的JVM語言有Scala,Clojure和Kotlin。這種方法的另一個好處是,可在無需任何原始源代碼的情況下, 在標準JAR文件中的第三方庫上使用RoboVM,這樣就可以在應(yīng)用中使用專有的和閉源的庫。
增量編譯
即使是非常簡單的RoboVM應(yīng)用,例如IOSDemo應(yīng)用,在***次啟動時,都需要耗費較長一段時間。RoboVM編譯器編譯應(yīng)用的過程是從應(yīng)用 的main類開始。然后編譯main類所用到的所有的類,之后再編譯前面的類所用到的所有類,如此循環(huán),直到應(yīng)用所需的所有類均完成編譯為止。在這一過程 中,標準的運行時類,如java.lang.Object和java.lang.String,也包含在編譯的范圍內(nèi)。這是一個一次性的過程。 RoboVM會緩存已經(jīng)編譯過的類,只有一個類或與它有直接依賴關(guān)系的類已經(jīng)發(fā)生了改變時,才會重新編譯這個類。
增量編譯和緩存目標文件的好處在于能夠減少編譯所耗費的時間。在生成的可執(zhí)行文件中僅包含能夠從Main類觸及到的類可以降低可執(zhí)行文件的大小。不 過,在某些情況下(如通過反射機制加載類時),RoboVM編譯器無法決定是否應(yīng)該對某個類進行編譯。不過,可以給編譯器下達指令,顯式地將某個特定的類 或者所有符合某個條件的類包含在編譯范圍內(nèi)。
基于安卓的運行時類庫
任何的JVM虛擬機都需要運行時類庫。這個類庫為所有的Java程序提供標準的包和類,如java.lang.Object和 java.lang.String。RoboVM的運行時類庫來自于安卓開源項目和已經(jīng)被移植到RoboVM的非安卓專用的包中。這就意味著如果Java 或JVM代碼中只用到了安卓標準包中的類,那么這些代碼直接就能夠在RoboVM上正常運行。
RoboVM現(xiàn)狀
RoboVM目前仍在開發(fā)過程中,不過已經(jīng)可以基本使用。1.0版本預(yù)計將在2014年年底之前發(fā)布。
在蘋果應(yīng)用商店中已經(jīng)有至少50個基于RoboVM的應(yīng)用。已知應(yīng)用程序的***列表請參見這里。
目前為止,大概有50%左右的iOS API可用在基于RoboVM的iOS應(yīng)用中。在RoboVM的Wiki上可以查看到關(guān)于這些綁定的當前狀態(tài)列表。截至現(xiàn)在,RoboVM上已經(jīng)能夠運行由Scala,Clojure和Kotlin所編寫的代碼。
關(guān)于RoboVM的文檔,目前仍在完善過程中。在2014年晚些時候,1.0版本發(fā)布時,將會有較為完備的文檔說明。
RoboVM的應(yīng)用目前仍無法進行Debug。這一問題也將在今年的晚些時候解決。
限制
RoboVM只能夠?qū)⒁呀?jīng)完成預(yù)編譯的類加載到應(yīng)用中。這就意味著在RoboVM應(yīng)用中,無法在運行時使用自定義的類加載器動態(tài)創(chuàng)建字節(jié)碼并將其加載到應(yīng)用中。也就是說,RoboVM無法支持運行時創(chuàng)建或修改類的技術(shù)。
更多相關(guān)信息
- 關(guān)于RoboVM項目的更多信息請參考RoboVM網(wǎng)站。
- 可以從GitHub上下載到RoboVM源碼
- 關(guān)于如何配置測試設(shè)備請參考蘋果的文檔“配置用于開發(fā)的iOS設(shè)備”。
- 關(guān)于如何提交應(yīng)用到應(yīng)用商店,請參考蘋果的應(yīng)用發(fā)布指南。
使用Xtend創(chuàng)建安卓應(yīng)用
Xtend簡介
Xtend 1是一種可以編譯成可讀Java源碼的靜態(tài)類型程序設(shè)計語言。這種語言本身是同類設(shè)計中的***典范,特別是在可 讀性和強大的可擴展性方面,不過它也讓Java的互操作性問題顯而易見。這種語言鼓吹函數(shù)式編程風格和多分派、擴展方法、拉姆達表達式及編譯期宏等特性。 與其他的Java替代品不同,Xtend本身并不包含龐大的標準庫,而只是在標準的JDK上添加了一些擴展方法。Xtend還可以保證避免Java互操作 性問題的出現(xiàn)并且能夠提供強大的IDE支持。
為什么安卓上的Java如此難用
Java代碼往往十分冗長,特別是在安卓操作系統(tǒng)上。由于Android API的級別很低而且經(jīng)常出現(xiàn)沒有經(jīng)過充分定義的類型(到處都是int類型)。另外一個煩惱就是無處不在的XML文件的使用和綁定。由于Android上 尚未支持Java 8,我們還不得不仔細閱讀無處不在的匿名類。而且不幸的是,Java無法修剪代碼以增強可讀性,我們只能將代碼與多余的符號、類型信息和樣板習語 (boilerplate idioms)混雜在一起。
安卓對JVM語言的***要求
Java語言在安卓上的替代品必須要能夠保證不增加任何運行時的系統(tǒng)開銷,這就將所有的動態(tài)語言排除在外。另外,也不希望出現(xiàn)任何不必要的間接類型 轉(zhuǎn)換。例如,代碼中應(yīng)該只使用Java和安卓類型,不應(yīng)因為互操作性問題而需要來回轉(zhuǎn)換。這不僅是處于性能方面的擔心,在調(diào)試時也比較令人煩惱。***,安 卓系統(tǒng)限制每個應(yīng)用只能夠使用65536個方法。因此,尋找Java的替代品時,一定不能在應(yīng)用中添加大的標準SDK,因為這樣會大大減少開發(fā)人員所能使 用的方法數(shù)量。舉例來說,使用Groovy的SDK會增加8000多個方法。
Xtend——安卓開發(fā)的***解決方案?
Xtend能夠轉(zhuǎn)化成地道的Java源代碼,并且基本上只依賴于JDK和安卓系統(tǒng)的類。在運行時,也沒有間接尋址、轉(zhuǎn)換或者其他任何額外的開銷。也 就是說,Xtend代碼能夠和Java的源代碼有著基本一致的運行速度。另外,Xtend還包含一個經(jīng)過精簡的為安卓系統(tǒng)提供的運行時庫,只有275kb 大小并且?guī)缀醢四闼枰囊磺?。Xtend Eclipse插件與ADT(安卓開發(fā)工具)的整合也相當***,對于新的安卓構(gòu)建系統(tǒng)3,甚至還提供了相應(yīng)的Gradle插件2。接下來就讓我們詳細了解一下如何使用Xtend改善典型的安卓代碼。
Hello安卓!
與往常一樣,我們先看一個簡單的Hello World示例程序:
- class HelloWorldActivity extends Activity {
- override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState)
- val button = new Button(this)
- button.text = "Say Hello!"
- button.onClickListener = [
- Toast.makeText(context, "Hello Android from Xtend!", Toast.LENGTH_LONG).show
- ]
- val layout = new LinearLayout(this)
- layout.gravity = Gravity.CENTER
- layout.addView(button)
- contentView = layout
- }
- }
對于Java開發(fā)者來說,這個例子使用了類Java的編程風格,因此***眼看上去會非常熟悉。另外,你可能會注意到,示例中所用的API 100%來自于安卓SDK和JDK。
主要的區(qū)別在于:
- 沒有分號(分號是可選的)
- 使用setter和getter訪問對象屬性
- 屬性的默認可見性(如,類默認是共有的)
- 使用拉姆達表達式替代匿名類
在語言的特性方面,有很多地方可以深入探討,不過在此之前,先讓我們看一下如何將Xtend編譯器與相應(yīng)的Android構(gòu)建過程整合在一起。
#p#
使用Gradle進行構(gòu)建
對于目前最常用的三個構(gòu)建系統(tǒng):Maven,Gradle和Ant,Xtend都有相應(yīng)的插件支持。谷歌最近為安卓項目引入了新的基于Gradle的構(gòu)建系統(tǒng)。接下來我們看一下使用Gradle構(gòu)建我們的“Hello World”項目需要做哪些工作。
本文假設(shè)你已經(jīng)在系統(tǒng)中安裝了***版本的Gradle和安卓SDK并且正確的設(shè)置了ANDROID_HOME環(huán)境變量。同時,你已經(jīng)將Gradle的/bin目錄添加到了PATH環(huán)境變量中。
接下來需要將構(gòu)建腳本“build.gradle”添加到你的Eclipse Android項目的根目錄下,build.gradle文件樣例如下:
- buildscript {
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:0.8.+'
- classpath 'org.xtend:xtend-gradle-plugin:0.1.+'
- }
- }
- apply plugin: 'android'
- apply plugin: 'xtend-android'
- repositories {
- mavenCentral()
- }
- dependencies {
- compile ('org.eclipse.xtend:org.eclipse.xtend.lib:2.6.+')
- }
- android {
- compileSdkVersion 19
- buildToolsVersion "19.1.0"
- sourceSets {
- main {
- manifest {
- srcFile 'AndroidManifest.xml'
- }
- java {
- srcDir 'src'
- }
- res {
- srcDir 'res'
- }
- assets {
- srcDir 'assets'
- }
- resources {
- srcDir 'src'
- }
- aidl {
- srcDir 'src'
- }
- }
- }
- }
其主要工作就是導(dǎo)入并調(diào)用Maven和Xtend的構(gòu)建插件。此外,我們將運行時庫添加到項目中并告知Android插件我們正在使用 Eclipse風格的項目布局。上述工作完成后,在命令行窗口中進入項目的根目錄并運行“gradle build”,Gradle將為你完成剩余的所有工作。
深入Xtend
除了語法糖之外,Xtend還附帶了許多非常有用的語言特性,例如操作符重載,模板表達式和switch表達式。而且還可以通過結(jié)合不同的功能創(chuàng)建 新的特性。例如,假如你需要動態(tài)的UI,不能用靜態(tài)的XML文件構(gòu)建,而需要聲明式的編寫。Xtend為開發(fā)者提供了構(gòu)建器語法(builder syntax)的支持。“Hello World”實例的UI實現(xiàn)代碼如下:
- import static extension com.example.helloworld.UiBuilder.*
- class HelloWorldActivity extends Activity {
- override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState)
- contentView = linearLayout [
- gravity = Gravity.CENTER
- addButton("Say Hello!") [
- onClickListener = [
- Toast.makeText(context,
- "Hello Android from Xtend!",
- Toast.LENGTH_LONG).show
- ]
- ]
- ]
- }
- }
linearLayout(Context ctx, (LinearLayout)=>void initializer) 和button(ViewGroup group, String name, (Button)=>void initializer) 兩個方法作為擴展被引入到Activity中。這兩個方法將拉姆達函數(shù)作為其參數(shù)之一。傳入拉姆達函數(shù)中的參數(shù)被稱為implicit it,與this類似,implicit it不需要顯式地解引用。如上所示,拉姆達函數(shù),擴展方法和implicit it結(jié)合使用能夠產(chǎn)生非常漂亮的構(gòu)建器語法。通過Xtend也可以構(gòu)建許多其他漂亮的API,從而以一種易讀的聲明式的方式編寫代碼。
來自于XML地獄的問候!
安卓開發(fā)者的相當一大部分日常工作就是配置和開發(fā)各種XML文件,用作國際化字符串的資源或用于各類視圖的聲明。安卓平臺推薦使用XML文件,因為 平臺已經(jīng)為開發(fā)者提供了針對大型設(shè)備和SDK碎片化的解決方案。然而應(yīng)用程序最終不可能只由靜態(tài)視圖和數(shù)據(jù)組成。開發(fā)者需要將所有的素材組合并為其賦予生 命。在安卓平臺,通過R類來完成這些工作。這個自動生成的類包含了許多對應(yīng)在XML文件中聲明的各種元素的整型常量。假設(shè)一個視圖XML文件中聲明了如下 兩個元素,點擊Button可以更新TextView中的消息:
- <TextView android:id="@+id/message_view"
- android:layout_weight="1"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:hint="@string/empty" >
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="sayHello"
- android:text="@string/hello_world" >
- </Button>
典型的安卓式開發(fā)方法是通過R類中生成的常量獲取到TextView的控制權(quán)然后實現(xiàn)onClick的回調(diào)方法“sayHello”:
- class HelloWorldActivity extends Activity {
- TextView messageView
- override protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState)
- // set the view using the int constant
- contentView = R.layout.main
- // get a handle on the TextView
- messageView = findViewById(R.id.message_view) as TextView
- }
- /**
- * Callback automagically called by Android
- */
- def void sayHello(View v) {
- messageView.text = "Hello Android from Xtend!"
- }
- }
上面一段安卓的典型代碼中包含了不安全的類型轉(zhuǎn)換,命名規(guī)范和各種樣板文件。用Xtend我們能夠做得更好。
你好,Xtendroid!
Xtendroid4是一個專門為安卓開發(fā)提供類庫以及所謂的積極注解(active annotation)的小型項目。積極注解可以理解為編譯時的宏,它能夠參與到從Xtend到Java轉(zhuǎn)化的編譯過程中。你可以隨意修改被注解的類,生成附加類型或使用這個鉤子讀寫純文本文件。
這樣只要有一個注釋,我們就知道要綁定哪個視圖并且注釋還可以幫助我們生成樣板文件。除此之外,它還能夠提供類型安全的元素訪問方法和回調(diào)方法。下面一段代碼就是用Xtendroid的@AndroidActivity注釋編寫的Activity類。
- @AndroidActivity(R.layout.main) class HelloWorldActivity {
- /**
- * Type safe callback
- */
- override void sayHello(View v) {
- messageView.text = "Hello Android from Xtend!"
- }
- }
現(xiàn)在,這個Activity中只包含了我們想要加入的行為。其他的設(shè)置都是自動實現(xiàn)的,例如設(shè)置管道綁定、內(nèi)容視圖或擴展Activity的樣板文件。而且現(xiàn)在一切都是類型安全的,IDE能夠了解其中的來龍去脈并為開發(fā)者提供適當?shù)淖詣油瓿山ㄗh。
此外,Xtendroid還能夠為開發(fā)者處理JSON對象,資源文件或SQLite數(shù)據(jù)庫提供便利。而且,積極注解以庫的形式存在,因此通過自行開發(fā)或定制化已有庫的方式,開發(fā)者可以很容易地構(gòu)建更適于自己的庫。
從下方1下載Eclipse并使用更新站點5安裝ADT就可以開始自己親自嘗試上面所講的內(nèi)容。Xtendroid項目包含許多類似本文中所展示的示例。***祝大家能從中找到樂趣。
關(guān)于作者
Niklas Therning是開源項目RoboVM的創(chuàng)建者和的聯(lián)合創(chuàng)始人——RoboVM項目的主要貢獻者。他把如何合理地將Java引入iOS平臺作為其使命。開始RoboVM項 目前,Niklas參與創(chuàng)建了SpamDrain反垃圾郵件服務(wù),并且作為其承包商,主要從事Java EE和web應(yīng)用程序開發(fā)的工作。Niklas持有位瑞典哥德堡查爾姆斯理工大學的計算機科學理學碩士學位??梢酝ㄟ^Twitter賬號@robovm關(guān)注他。
Sven Efftinge是一個充滿激情的軟件開發(fā)人員,他喜歡風箏沖浪運動、音樂和美食。他是Xtext項目的領(lǐng)導(dǎo)人。Xtext是一個程序設(shè)計語言、領(lǐng)域特定語言和JVM靜態(tài)類型程序設(shè)計語言Xtend的開發(fā)框架。在位于Kiel的itemis公司,Sven領(lǐng)導(dǎo)一個研究部門。
過去幾年,移動應(yīng)用席卷了整個世界,在工作和生活的方方面面改變著我們使用互聯(lián)網(wǎng)的方式。創(chuàng)建移動應(yīng)用的各種技術(shù)也隨之興起,各種開發(fā)流程也 將移動應(yīng)用視為一等公民,開始考慮適應(yīng)移動開發(fā)的流程。盡管已經(jīng)讓人感覺無處不在,真正的移動應(yīng)用時代才剛剛開始。我們即將面對新一代的移動設(shè)備,如可穿 戴設(shè)備或組成物聯(lián)網(wǎng)的各種各樣的移動裝置。我們將面臨全新的用于數(shù)據(jù)展示和命令接收的用戶交互接口。我們也認識到越來越多的公司將真正采取移動優(yōu)先的戰(zhàn) 略。所有的這些都將對我們未來幾年設(shè)計、開發(fā)和測試軟件的方式產(chǎn)生巨大影響。
查看英文原文:Unusual Ways to Create a Mobile App