手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:android

Android 手机上的 Scala 编程

说实话,我在听到别人介绍scala可以直接采用java的类库时,还在犹豫,但在看到这篇文章之后,心里安定很多。才下决心要学scala的。

原文很长,来自http://www.oschina.net/bbs/thread/7572

在本文中,我们将创建一个在 Android 设备上运行的移动应用程序。您将需要安装 Android SDK;本文使用 V1.5 SDK。应用程序代码将用 Scala 编程语言编写。如果您从来没用过 Scala,那么没有关系,因为本文将解释 Scala 代码。但是,即使您不熟悉 Scala,建议您至少熟悉 Java 语言。本文使用 Scala V2.7.5 进行开发。对于 Android 和 Scala 都提供了很好的 Eclipse 插件。本文使用 Eclipse V3.4.2 和 Android Development Tools(ADT) V0.9.1 以及 Scala IDE 插件 V2.7.5。请参阅 参 考资料,获得所有这些工具。

设置

编写 Android 应用程序听起来像是一个复杂的命题。Android 应用程序在它们自己的虚拟机中运行:Dalvik 虚拟机。但是,Android 应用程序的构建路径是开放的。下面表明了我们将使用的基本策略。


图 1. Android 上 Scala 的构建路径
 
大小: 2.89 K
尺寸: 429 x 58
浏览: 2548 次
点击打开新窗口浏览全图

其思想是,我们首先将所有 Scala 代码编译成 Java 类文件。这是 Scala 编译器的工作,所以这方面没什么太复杂的事情。接下来,获取 Java 类文件,使用 Android dex 编译器将类文件编译成 Android 设备上的 Dalvik VM 使用的格式。这就是所谓的 dexing, 也是 Android 应用程序的常规编译路径。通常,要经历从 .java 文件到 .class 文件再到 .dex 文件的过程。在本文,惟一不同的是我们从 .scala 文件开始。最后,.dex 文件和其他应用程序资源被压缩成一个 APK 文件,该文件可安装到 Android 设备上。

那 么,如何让这一切发生?我们将使用 Eclipse 做大部分工作。但是,此外还有一个较复杂的步骤:要让代码运行,还需要来自标准 Scala 库中的代码。在典型的 Scala 安装中,这是 /lib/scala-library.jar 中一个单独的 JAR。但是,这个 JAR 包括一些不受 Android 支持的代码。有些代码需要稍作调整,有些代码则必须移除。scala-library.jar 的定制构建是运行得最好的,至少目前是这样。请参阅 参 考资料,了解这里使用的定制构建。我们将把这个 JAR 称作 Android 库 JAR。

有了这个 JAR,剩下的事情就很容易了。只需使用 Eclipse 的 ADT 插件创建一个 Android 项目。然后将一个 Scala 特性(nature)添加到项目中。用前面谈到的 Android 库替代标准的 Scala 库。最后,将输出目录添加到类路径中。现在,可以开始了。主 Scala 站点对此有更详细的描述(请参阅 参 考资料)。现在,我们有了基本的设置,接下来看看我们将使用 Scala 创建的 Android 应用程序。

UnitsConverter

现 在,我们知道如何利用 Scala 代码,将它转换成将在 Android 设备上运行的二进制格式,接下来可以使用 Scala 创建一个移动应用程序。我们将创建的应用程序是一个简单的单位转换应用程序。通过这个应用程序可以方便地在英制单位与公制单位之间来回转换。这是一个非常 简单的应用程序,但是我们将看到,即使是最简单的应用程序也可以从使用 Scala 中获益。我们首先看看 UnitsConverter 的布局元素。

创建布局

您 也许对编写手机上运行的 Scala 感到兴奋,但是并非所有的移动开发编程都应该用 Scala 或 Java 语言完成。Android SDK 提供了一种很好的方式,使用基于 XML 的布局系统将用户界面代码与应用程序逻辑分离。我们来看看本文中的应用程序的主要布局文件,如清单 1 所示。


清单 1. Converter 应用程序的主要布局

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     android:gravity="center_horizontal" android:padding="10px"  
  5.     >  
  6.     <TextView android:id="@+id/prompt_label" android:layout_width="wrap_content"  
  7.         android:layout_height="wrap_content"   
  8.         android:text="@string/prompt_metric"/>  
  9.     <EditText android:id="@+id/amount" android:layout_below="@id/prompt_label"  
  10.         android:layout_width="fill_parent"   
  11.         android:layout_height="wrap_content"/>  
  12.     <TextView android:id="@+id/uom_label"    
  13.         android:layout_below="@id/amount"  
  14.         android:layout_width="wrap_content"   
  15.         android:layout_height="wrap_content"  
  16.         android:text="@string/uom"/>  
  17.     <Spinner android:id="@+id/uom_value"  
  18.         android:layout_below="@id/uom_label"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"/>  
  21.     <Button android:id="@+id/convert_button"  
  22.         android:layout_below="@id/uom_value"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:text="@string/convert_button_label"/>  
  26.     <TextView android:id="@+id/result_value"  
  27.         android:layout_below="@id/convert_button"  
  28.         android:layout_width="fill_parent"  
  29.         android:layout_height="fill_parent"/>          
  30. </RelativeLayout>  

以上代码非常简洁地创建了该应用程序的主 UI。它的根节点是一个 RelativeLayout 容器元素。Android SDK 中有很多布局选项。RelativeLayout 指示运行时使用相对定位对不同的 UI 小部件进行布局。要使用相对定位,可添加可见元素 — 在这里是一个 TextView 元素。这是用于显示文本的一个简单的元素。它被赋予一个 ID prompt_label。 接下来的元素,即一个 EditText 元素(一个文本输入框)将用到它。这个元素有一个 layout_below 属性,它的值等于 prompt_label ID。换句话说,EditText 应该放在名为 prompt_label 的元素的下方。

布局代码剩下的部分非常简单。有一个带标签的文本输入框、一个带标签的微调器(一个组合框或下拉框)、一个按钮和一个用于输出的文本框。图 2 显示正在运行的应用程序的一个截图,其中标出了不同的元素。


图 2. Android lLayout — 分解图
 
大小: 52 K
尺寸: 238 x 376
浏览: 2384 次
点击打开新窗口浏览全图

那么,以上视图中看到的不同文本值来自哪里呢?注意,清单 1 中的一些元素有一个 text 属性。例如,prompt_label 元素有一个等于 @string/prompt_metric 的 text 属性。这表明它将使用 Android 应用程序中一个标准的资源文件:strings.xml 文件,如清单 2 所示。


清单 2. strings.xml 资源

 

现在可以看到,图 2 中所有的文本来自何处。微调器有一个下拉框,其中包含可用于度量的单位,那些单位在清单 2 中没有列出。相反,它们来自另一个文件 arrays.xml,如清单 3 所示。


清单 3. arrays.xml 资源

 

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <array name="english_units">  
  4.         <item>Fahrenheit</item>  
  5.         <item>Pounds</item>  
  6.         <item>Ounces</item>  
  7.         <item>Fluid Ounces</item>  
  8.         <item>Gallons</item>  
  9.         <item>Miles</item>  
  10.         <item>Inches</item>  
  11.     </array>  
  12.     <array name="metric_units">  
  13.         <item>Celsius</item>  
  14.         <item>Kilograms</item>  
  15.         <item>Grams</item>  
  16.         <item>Millileters</item>  
  17.         <item>Liters</item>  
  18.         <item>Kilometers</item>  
  19.         <item>Centimeters</item>  
  20.     </array>      
  21. </resources>  

现在,我们可以看到将用于微调器的那些值。那么,这些值如何出现在微调器中,应用程序如何在英制单位与公制单位之间切换?要回答这些问题,我们需要 看看应用程序代码本身。

 

Scala 应用程序代码

Converter 应用程序的代码非常简单 — 不管用什么语言编写。当然,用 Java 编写起来非常容易,但是用 Scala 编写也同样不复杂。首先我们看看前面见过的 UI 背后的代码。

视图背后的代码

解释创建 UI 的 Scala 代码的最简单方式是先看看代码,然后走查一遍。对于任何应用程序,都是在应用程序的 AndroidManifest.xml 文件中定义应用程序的默认活动。任何 UI 背后都有一个 Activity 类,默认的 Activity 定义当应用程序初次装载时执行的 Activity 类。对于像本文这样简单的应用程序,有一个 Converter 类,清单 4 中显示了它的源代码。


清单 4. Converter 活动类

 

SCALA代码
  1. class Converter extends Activity{  
  2.     import ConverterHelper._  
  3.     private[this] var amountValue:EditText = null  
  4.     private[this] var uom:Spinner= null  
  5.     private[this] var convertButton:Button = null  
  6.     private[this] var resultValue:TextView = null  
  7.       
  8.     override def onCreate(savedInstanceState:Bundle){  
  9.       super.onCreate(savedInstanceState)  
  10.       setContentView(R.layout.main)  
  11.       uom = findViewById(R.id.uom_value).asInstanceOf[Spinner]  
  12.       this.setUomChoice(ENGLISH)  
  13.       amountValue = findViewById(R.id.amount).asInstanceOf[EditText]  
  14.       convertButton = findViewById(R.id.convert_button).asInstanceOf[Button]  
  15.       resultValue = findViewById(R.id.result_value).asInstanceOf[TextView]  
  16.       convertButton.setOnClickListener( () => {  
  17.           val unit = uom.getSelectedItem.asInstanceOf[String]  
  18.           val amount = parseDouble(amountValue.getText.toString)  
  19.           val result = UnitsConverter.convert(Measurement(unit,amount))  
  20.           resultValue.setText(result)  
  21.       })  
  22.     }  
  23.     override def onCreateOptionsMenu(menu:Menu) = {  
  24.       super.onCreateOptionsMenu(menu)  
  25.       menu.add(NONE, 00, R.string.english_units)  
  26.       menu.add(NONE, 11, R.string.metric_units)  
  27.       true  
  28.     }  
  29.     override def onMenuItemSelected(featureId:Int, item:MenuItem) = {  
  30.       super.onMenuItemSelected(featureId, item)  
  31.       setUomChoice(if (item.getItemId == 1) METRIC else ENGLISH)  
  32.       true  
  33.     }  
  34.     private   
  35.     def setUomChoice(unitOfMeasure:UnitsSystem){  
  36.       if (uom == null){  
  37.         uom = findViewById(R.id.uom_value).asInstanceOf[Spinner]  
  38.       }  
  39.       val arrayId = unitOfMeasure match {  
  40.         case METRIC => R.array.metric_units  
  41.         case _ => R.array.english_units  
  42.       }  
  43.       val units = new ArrayAdapter[String](this, R.layout.spinner_view,   
  44.         getResources.getStringArray(arrayId))  
  45.       uom.setAdapter(units)        
  46.     }  
  47. }  

我们从这个类的顶部开始。它扩展 android.app.Activity。这是一 个 Java 类,但是从 Scala 中可以对 Java 类轻松地进行细分。接下来,它有一些实例变量。每个实例变量对应前面定义的一个 UI 元素。注意,每个实例变量还被限定为 private[this]。这演示了 Scala 中特有的一种访问控制级别,而 Java 语言中不存在这种访问控制。这些变量不仅是私有的,而且只属于 Converter 类的特定实例。这种级别的访问控制对于移动应用程序来说有些大材小用,但是如果您是一名 Scala 开发人员,可以放心地在 Android 应用程序上使用您熟悉的语法。

 

回到清单 4 中的代码,注意,我们覆盖了 onCreate 方法。这是 Activity 类中定义的方法,通常被定制的 Activity 覆盖。如果用 Java 语言编写该代码,那么应该添加一个 @Override 标注。在 Scala 中,override 是一个关键词,用于确保正确性。这样可以防止误拼方法名之类的常见错误。如果误拼了方法名,Scala 编译器将捕捉到方法名并返回一个错误。注意,在这个方法上,以及任何其他方法上,不需要声明返回类型。Scala 编译器可以轻松推断出该信息,所以不需要多此一举。

onCreate 中的大部分代码类似于 Java 语言编写的代码。但是有几点比较有趣。注意,我们使用 findViewById 方法(在 Activity 子类中定义)获得不同 UI 元素的句柄。这个方法不是类型安全的,需要进行类型转换(cast)。在 Scala 中,要进行类型转换,可使用参数化方法 asInstanceOf[T],其中 T 是要转换的类型。这种转换在功能上与 Java 语言中的转换一样。不过 Scala 有更好的语法。接下来,注意对 setUomChoice 的调用(稍后我们将详细谈到这个方法)。最后,注意上述代码获得一个在布局 XML 中创建的按钮的句柄,并添加一个单击事件处理程序。

如果用 Java 语言编写,那么必须传入 Android 接口 OnClickListener 的一个实现。这个接口只定义一个方法:onClick。实际上,您关心的只是那个方法,但是在 Java 语言中无法直接传入方法。而在 Scala 中则不同,在 Scala 中可以传入方法字面量(literal)或闭包。在这里,我们用语法 () => { ... } 表示闭包,其中方法的主体就是花括号中的内容。开始/结束括号表示一个不带参数的函数。但是,我将这个闭包传递到 Button 的一个实例上的 setOnClickListener 方法,Button 是 Android SDK 中定义的一个 Java 类。如何将 Scala 闭包传递到 Java API?我们来看看。

Android 上的函数式编程

为了理解如何让 Android API 使用函数字面量,看看 Converter 类定义的第一行。这是一条重要的语句。这是 Scala 的另一个很好的特性。您可以在代码的任何地方导入包、类等,它们的作用域限于导入它们的文件。在这里,我们导入 ConverterHelper 中的所有东西。清单 5 显示 ConverterHelper 代码。


清单 5. ConverterHelper

Java代码
  1. object ConverterHelper{  
  2.   import android.view.View.OnClickListener  
  3.   implicit def funcToClicker(f:View => Unit):OnClickListener =   
  4.     new OnClickListener(){ def onClick(v:View)=f.apply(v)}  
  5.   implicit def funcToClicker0(f:() => Unit):OnClickListener =   
  6.     new OnClickListener() { def onClick(v:View)=f.apply}  
  7. }  

这是一个 Scala 单例(singleton),因为它使用对象声明,而不是类声明。单例模式被直接内置在 Scala 中,可以替代 Java 语言中的静态方法或变量。在这里,这个单例存放一对函数:funcToClickerfuncToClicker0。 这两个函数以一个函数作为输入参数,并返回 OnClickListener 的一个实例,OnClickListener 是 Android SDK 中定义的一个接口。例如,funcToClicker 被定义为以一个函数 f 为参数。这个函数 f 的类型为带一个 View 类型(Android 中的另一个类)的输入参数的函数,并返回 Unit,它是 void 在 Scala 中的对等物。然后,它返回 OnClickListener 的一个实现,在这个实现中,该接口的 onClick 方法被实现为将输入函数 f 应用到 View 参数。另一个函数 funcToClick0 也做同样的事情,只是以一个不带输入参数的函数为参数。

 

这两个函数(funcToClickerfuncToClicker0) 都被定义为隐式函数(implicit)。这是 Scala 的一个方便的特性。它可以让编译器隐式地将一种类型转换成另一种类型。在这里,当编译器解析 Converter 类的 onCreate 方法时,它遇到一个 setOnClickListener 调用。这个方法需要一个 OnClickListener 实例。但是,编译器却发现一个函数。在报错并出现编译失败之前,编译器将检查是否存在隐式函数,允许将函数转换为 OnClickListener。 由于确实还有这样的函数,所以它执行转换,编译成功。现在,我们理解了如何使用 Android 中的闭包,接下来更仔细地看看应用程序逻辑 — 特别是,如何执行单位转换计算。

单位转换和计算

我们回到清单 4。传入 onClickListener 的函数收到用户输入的度量单位和值。然后,它创建一个 Measurement 实例,并将该实例传递到一个 UnitsConverter 对象。清单 6 显示相应的代码。


清单 6. MeasurementUnitsConverter

Java代码
  1. case class Measurement(uom:String, amount:Double)  
  2.   
  3. object UnitsConverter{  
  4.       // constants  
  5.     val lbToKg = 0.45359237D  
  6.       val ozToG = 28.3495231  
  7.       val fOzToMl = 29.5735296  
  8.       val galToL = 3.78541178  
  9.       val milesToKm = 1.609344  
  10.       val inchToCm = 2.54    
  11.      
  12.       def convert (measure:Measurement)= measure.uom match {  
  13.           case "Fahrenheit" => (5.0/9.0)*(measure.amount - 32.0) + " C"  
  14.             case "Pounds" => lbToKg*measure.amount + " kg"  
  15.             case "Ounces" => ozToG*measure.amount + " g"  
  16.             case "Fluid Ounces" => fOzToMl*measure.amount + " mL"  
  17.             case "Gallons" => galToL*measure.amount + " L"  
  18.             case "Miles" => milesToKm*measure.amount + " km"  
  19.             case "Inches" => inchToCm*measure.amount + " cm"  
  20.             case "Celsius" => (9.0/5.0*measure.amount + 32.0) + " F"  
  21.             case "Kilograms" => measure.amount/lbToKg + " lbs"  
  22.             case "Grams" => measure.amount/ozToG + " oz"  
  23.             case "Millileters" => measure.amount/fOzToMl + " fl. oz."  
  24.             case "Liters" => measure.amount/galToL + " gallons"  
  25.             case "Kilometers" => measure.amount/milesToKm + " miles"  
  26.             case "Centimeters" => measure.amount/inchToCm + " inches"  
  27.             case _ => ""  
  28.       }  
  29. }  

Measurement 是一个 case 类。这是 Scala 中的一个方便的特性。用 “case” 修饰一个类会导致这个类生成这样一个构造函数:这个构造函数需要类的属性,以及 equalshashCodetoString 的实现。它对于像 Measurement 这样的数据结构类非常适合。它还为定义的属性(在这里就是 uomamount)生成 getter 方法。也可以将那些属性定义为 vars(可变变量),然后也会生成 setter 方法。仅仅一行 Scala 代码可以做这么多事情!

 

接下来,UnitsConverter 也是一个单例模式,因为它是使用 object 关键词定义的。它只有一个 convert 方法。注意,convert 被定义为相当于一条单一语句 — 一条 match 语句。它是一个单一表达式,所以不需要额外的花括号。它使用 Scala 的模式匹配。这是函数式编程语言中常见的一个强大特性。它类似于 Java 语言和很多其他语言中的 switch 语句。但是,我们可以匹配字符串(实际上,还可以有比这高级得多的匹配)。如果字符串匹配,则执行适当的计算,并返回格式化的字符串,以供显示。最后,注 意与 _ 匹配的最后一个 case。Scala 中的很多地方使用下划线作为通配符。在这里,它表示匹配任何东西,这类似于 Java 语言中的 default 语句。

现在,我们理解了应用程序中的计算,最后来看看剩下的 UI 设置和菜单。

UI 初始化和菜单

回到清单 4。我们说过要看看 setUomChoice。这个方法被定义为带有一个 UnitsSystem 类型的参数。我们来看看如何定义这个类型。


清单 7. UnitsSystem

 

Java代码
  1. sealed case class UnitsSystem()  
  2. case object ENGLISH extends UnitsSystem  
  3. case object METRIC extends UnitsSystem  

我们看到,UnitsSystem 是一个密封的 case 类,没有属性。看上去它不是很有用。接下来,我们看看两个 case 对象。还记得吗,object 表示 Scala 中的一个单例。在这里,有两个 case 对象,每个 case 对象都扩展 UnitsSystem。这是 Scala 中的一个常见的特色,它可以提供更简单、更类型安全的枚举方式。

 

现在 setUomChoice 的实现更加合理。在获得微调器的一个句柄后,我们匹配传入的 UnitsSystem 的类型。这标识了我们在前面见到的 arrays.xml 中的一个数组。这是使用 Android SDK 生成的 R 类表示资源,例如 arrays.xml 文件。一旦知道使用哪个数组,我们就通过创建一个传入微调器的适配器(在这里是一个 ArrayAdapter), 使用那个数组作为微调器的数据源。

最后,看看清单 4 中的 onCreateOptionsMenuonMenuItemSelected 方法。这些方法是在 Activity 中定义的,我们将在 Converter 活动中覆盖这些方法。第一个方法创建一个菜单。第二个方法处理用户从菜单中选择 English 或 metric 的事件。它再次调用 setUomChoice。 这使用户可以在从英制单位转换为公制单位与从公制单位转换为英制单位之间进行切换。

结束语

Android 平台的架构使它可以用于在 Java 虚拟机上运行的任何编程语言。我们看到了如何设置 Android 项目,使它使用 Scala 代码。这个过程也可以延伸到其他 JVM 编程语言,例如 Groovy、JRuby 或 Fan。当可以任意使用 Scala 编程语言时,编写 Android 应用程序将变得更轻松。您仍可以使用 Eclipse 进行开发。仍然可以在 Eclipse 中用模拟器和设备进行调试。您可以继续使用所有的工具,同时又得到一种生产率更高的编程语言。

例程下载:os-eclipse-scala-converter[1].zip

Tags: android, scala, eclipse, netbeans

android相关资料

黑黑,原来google上已经有了这么多资料了。想起几年前看到SDK不学习,现在再学习,那是相当的后悔啊,不然,说不定我都N个程序写出来了(当然也可能一个也没有写)
地址为:http://code.google.com/p/androidbmi/w/list
值得看看的。。

Android 是什麼

在可見的將來,基於 Android 平台的手機程式設計,將像今日的 PC 程式設計一樣普及。

「Android」是一個基於 Linux 核心(kernel) 的開放手機平台作業系統。與 Windows MobileSymbian 等手機作業系統處在同一級別。

對 於設備製造商來說,「Android」是一個免費的平台。「Android」作業系統讓設備製造商免除「每出一台手機,就得被手機作業系統廠商(如 MicroSoft)收取費用」的情況。 對硬體開發廠商來說,「Android」也是個開放的平台。只要廠商有能力,可以在這個平台上自由加入特有的裝置或功能,不受手機作業系統廠商的限制。

對於手持裝置的開發者來說,「Android」是個先進的平台。平台上的應用程式可相容於各種型號的 Android 手機,免去為各種不同手機機型開發的困擾。「Android」平台支援各種先進的網路、繪圖、3D處理能力,可以用來提供更好的使用者體驗。

對於使用者來說,「Android」是一個用於手機的作業系統。使用者只要先申請一個免費的 Google 帳戶,當使用者想換一台手機時,就可以在不同廠牌,同樣使用「Android」作業系統平台的手機之間選擇,並且很容易地將如聯絡簿等個人資料轉換到新手機上。

Android 在 Linux 核心的基礎上,提供了各種合用的函式庫,和一個完整的應用程式框架。並採用較符合商用限制的 Apache 版權。在 Linux 核心的基礎上提供 Google 自製的應用程式運行環境 (稱作 Dalvik,與 Sun 的 J2ME 不同),並提供基於 Eclipse 整合開發環境(IDE)的免費、跨平台(Windows、Mac OS X、Linux)開發工具(SDK),便於應用程式開發者學習、使用。

免費、熟悉的跨平台開發工具,讓具備一些物件導向觀念,或視窗程式開發經驗的開發者,能在一定時間內上手。1000 萬美元的大獎賽則提供了足夠的誘因,讓第一支 Android 手機正式面市前,就擁有了各式各樣的應用程式可供使用。

從不同角度來說,Android代表著

一個嶄新的開放原始碼作業系統平台、
一個友善的免費應用程式開發環境、
一個與世界各地的程式開發者,站在相同起跑點上的公平競爭機會。

從創意開始

預測未來的最好的方式,就是去創造未來

你是否曾經思考過,當我們擁有了一台能夠上網,能夠依照自己的期望自由修改、調配功能的手機,我們會用它來施展什麼創意? Android 大獎賽首頁上提供了一些方向。

你 的心裡可能已經有了關於手機程式的絕好創意,你想在 Android 開放手機平台上,實現因為其他封閉平台的種種限制,而無法在手機上達成的需求; 無論你以何種目的來看待「Android」平台,都需要為了達成你的創意,所需的一些基本協助。 本書所提供的內容,將可以協助你快速地理解 Android 平台的概念。 提供你初次開發手機程式介面的注意事項、Android 資料應用程式的運作過程, 與詳細的 Android 應用程式實例解說。

要開發 Android 應用程式,你甚至不需要擁有實機。 Google 已經為我們提供了各個主要平台(Windows、Mac、Linux) 上可用的開發工具包。開發工具包中,也包含了 Android 手機模擬器,好讓我們在電腦上就能完成所有的手機應用程式開發工作。接著,我們就先來安裝 Android 開發工具吧。

參考資料

Tags: android

用 wpToGo 在 Android 上写 WordPress 博文

看来,我上次所说的博客换到wordpress是势在必行了,为什么?为什么?因为这款软件啦。。。WPTOGO

在谷奥上找到的文章,刺激我要转换博客为wordpress了。。

 

尽管WordPress官方并没有像关照iPhone那样为Android系统推出WordPress发布应用程序,但Android Market里已经有不少第三方应用了,今天我介绍其中的一个佼佼者,wpToGo,目前最高版本1.6.8,而且它是免费的哦。

wpToGo可以发布博文、上传图片、查看评论。发布的博文可编辑格式、设置分类、设置标签甚至是存为草稿,如果你是Android+WordPress用户,那么wpToGo简直是必须拥有的。

下面是一些操作截图,感觉好的话就快去Android Market里免费下载吧。

Via Android and Me

本站文章除注明转载外,均为本站原创编译
转载请注明:文章转载自:谷奥——探寻谷歌的奥秘 [http://google.org.cn]
本文标题:用 wpToGo 在 Android 上写 WordPress 博文
本文地址:http://google.org.cn/posts/wordpress-on-android-with-wptogo.html
 

作者: musiXboy

Tags: wptogo, android, wordpress, google, magic

收藏的一些资料

黑黑,不多说,看图

大小: 45.78 K
尺寸: 161 x 376
浏览: 1483 次
点击打开新窗口浏览全图

附件是我编译后的CHM文件:gphone.chm

记得下载后,如果是XP以及上系统,请右键CHM文件,在属性里点击“解除锁定”

顺便,CA(cyber article)的编译CHM的功能真的很强大,不仅支持索引,还直接支持中文搜索。很满意。呵呵

Tags: google, android

龙芯获MIPS专利授权 将支持Android

据cnbeta报道:龙芯获MIPS专利授权 将支持Android
6月16日消息,中国自主研发的CPU龙芯近日获得了MIPS授权。MIPS Technologies周一称,中国科学院计算技术研究所(简称计算所)已经获得MIPS32与MIPS64架构的授权,技术将用于开发龙芯CPU。 龙芯之痛,卡在专利关口

知名IT杂志《PC World》撰文称:“龙芯的支持者希望终有一天这款产品能渗透外国市场,但现在使用该芯片的设备在中国也寥寥无几,龙芯的MIPS核心使得它与英特尔AMD的X86结构PC不兼容。”龙芯使用MIPS架构,既是无奈,更是被迫。

在中国自力更生研发CPU的过程中,曾使用用“MIPS-like”的词汇来形容龙芯(修改版本的MIPS),此举招致MIPS Technologies的不满,因而一直未获授权。这几年来,计算所不断与MIPS Technologies谈判,希望获得技术授权,但一直未果。无奈之下,计算所只好退而求其次,与意法半导体合作,因为它拥有MIPS授权。以龙芯为核 心的CPU也在意法半导体的网页有所介绍,其名字为更商业化的“Loongson”。龙芯难产,卡在专利一关。

龙芯将支持Android 年底推新款低价CPU

中国科学院计算技术研究所“龙芯1号”研制组组长胡伟武说,尽管这几年龙芯推出了新品,但一直不准在上面贴上‘MIPS-compatible’标签。现 在问题终于解决了。他还表示,研究所正在对一些芯片做兼容性测试。获得MIPS授权是一个大进步,它意味着龙芯可以支持Google的Android平 台。胡伟武表示:“无论是否推出装有龙芯CPU与Android的设备,计算所都将与寻找一些商业伙伴,努力将芯片植入它们的产品中。”

MIPS Technologies公司亚太区的副总Mark Pittman说:“在我们看来,授权将缩短龙芯进入市场化的时间。”因为计算所再也不用通过意法半导体来设计芯片了。

据计算所介绍,龙芯将同时进入高端与低端产品线,设计完全其于第一款高端芯片——4核心龙芯3代,它也是第一款多核龙芯。今年晚些时候,计算所还将推出低端的龙芯,即1GHz的Godson 2g。

附:
MIPS Technologies是一家设计制造高性能、高档次及嵌入式32位和64位处理器的厂商,在RISC处理器方面占有重要地位。1984年,MIPS计算机公司成立。1992年,SGI收购了MIPS计算机公司。


有人说,龙芯买授权花了N多钱,还有人对龙芯购买授权很不理解,为此,龙芯论坛超版九门提督这样说:

要说明白龙芯为什么拿MIPS授权要回答一下几个问题:
1、龙芯为什么要选择MIPS指令集而不是x86指令集?
2、龙芯为什么是现在才取得授权而不是8年前?
3、现在MIPS授权对龙芯发展有什么帮助?


一、现在回答第一个问题,龙芯为什么要选择MIPS指令集而不是x86指令集?
     大家应该都知道,计算所准备研制龙芯是2000年左右的事,20015月正式开始研制,第一个要解决的问题就是选择什么架构什么指令集,当然龙芯选择了RISC架构,而不是CISC架构。架构的事我们不谈(如果将来有人由于架构的关系说龙芯是冒牌货,没有技术含量,忽悠纳税人的钱,就如现在的情况,那我们再谈,当然架构也是广义指令集)。
       确定了架构开始确定使用何种指令集,两条路:一、自己开发指令集;二、采用已有指令集。
要自己开发出指令集并不难,我国早期的计算机采用的就是自己开发的指令集,如果大家想知道相关的情况,可在百度输入“夏培肃”来了解,比如107计算机、银河系列计算机,在局部取得了成功,但是它们是用在专有领域,不存在和别人竞争通用市场的问题。外国科技企业再牛也不敢找中国人民解放军的麻烦不是么?
       难就难在指令集要为整个业界所接受,成为标准之一并推向世界。
       打个比方,我开发了一个名叫“小强”的指令集,研发了基于“小强”的CPU,然后呢?然后你要卖CPU啊!可是你这个CPU,市面上没有配套的操作系统,更别说应用软件!你怎么办?你要开发基于“小强”的编译器、BIOS、操作系统、应用软件……。你要把这些东西都推广出去,让别人去接受,让别人把自己现有的东西都迁移到“小强”上来——这是一个何其浩大的工程——用屁股想都知道不可能。你会发现你家除了一窝“小强”什么也没有!!!
       以上说了七八轱辘的话,我想我们大家应该有个共识:龙芯不能独创一个全新的指令集。如果还有朋友不同意这个观点,那么以下的文字对你来说都是废话,你可以不用看了。
       龙芯要选择已有的指令集,现在指令集有很多,但可供龙芯选的稍微思考一下就只剩X86MIPS了,当然还有ARM,但ARM得授权方式虽然好,却使龙芯失去了独立的研发经历,没有任何安全可言。
       要选择X86么?我们知道计算所对龙芯的定位是通用CPU,通用CPU的老大是INTEL,龙芯只要研发出来,不论性能如何,从性质上说,就是INTEL的竞争对手,何况背后还有中国政府的支持。如果我是INTEL我会很高兴计算所选择了X86指令集,我会提供给计算所不高不低的技术支持,要他研究一个不好不坏的CPU,等他壮大一点,我就掐死一点,造个舆论,骂下计算所,多要点授权费,然后再多给点授权,让龙芯的市场再大一点,然后如此这般再来一边,最后计算所痛苦的发现,原来替INTEL做嫁衣裳。
       最后李国杰和胡伟武被骂成汉奸,买办,卖国贼,白痴,最终被钉在历史的耻辱柱上。
       亲爱的你还会选择X86架构么?
       最后只剩MIPS了。MIPS的最大竞争对手是谁呢?自然是X86啊,换句话说几乎就是INTEL啊。从这个程度上说龙芯和MIPS的大目标是一致的。
       尤其重要的是,MIPS经过几十年发展,是一种优秀的精简指令集,但是MIPSSGI抛弃后就江河日下,上个世纪90年代的辉煌已经过去,现在几乎沦落到靠卖个指令集的授权吃饭,今天上了下ARMMIPS的网站,两者气象完全不同,MIPS卖了个授权给计算所,就毫不犹豫的把新闻放在公司首页,如此可见一般。
通过提供MIPS指令集授权来获取授权费,这是MIPS现在比较现实的商业模式,承认与否也是这样。
到现在为止,大家应该明白,选择MIPS指令集是龙芯最理想也最现实的选择。
好了,第一个问题,回答完了。
二、龙芯为什么是现在才取得授权而不是8年前?
       计算所的一帮学究刚开始设计龙芯的时候,估计也没有仔细考虑将来产业化的情况,毕竟当时连什么时候能设计出来都没谱。但是关于指令集的问题,是经过仔细考虑的,在设计时采用MIPS指令集,几乎所有指令都是过了保护期的,可以自由使用,虽然落后,但那是千锤百炼,经过市场检验的东西。其它没有开放的指令,通过用其他相似指令代替和与ST的合作来解决。
       网上传说计算所花了500万美元获得了mips的正式授权,此价格我还没有确认,但肯定是不菲的,500万美元合3500万人民币左右,这可不是一笔小钱!大家想想八年前MIPS心气多高啊,当时的要价绝对要比500万美元高多了,计算所哪出得起啊。龙芯刚刚开发的时候,是计算所自己的1000万人民币创新基金拿出来搞的,可没有什么国家的科研经费(你要说计算所属于国家,这钱也是国家的,哪我没话可说)。这点钱,当时的MIPS绝对看不上眼,而且MIPS当时认为中国人开发通用CPU有一种中国男足拿世界杯的感觉。
       八年以后,龙芯虽然没有多好,但他有了自己的产品线,有了明确的发展规划,有了初步的产业化成果,有了国家的国民的大力支持。
       所以,为了MIPS和龙芯的发展,龙芯拿到了授权。

三、现在MIPS授权对龙芯发展有什么帮助?
       龙芯发展了8年多,大部分指令集是MIPS的,受专利保护的指令集自己做了扩展,但是还是对MIPS指令集的软件在龙芯上的使用有很多冲突,现在好了,基于MIPS的软件都可以使用了。龙芯有了具有自主知识产权的架构,又能使用MIPS所有的指令集,现阶段来说,是最好的结果。好多朋友以为,我们采用MIPS指令集就是采用了MIPS提供的核,这根本就两回事。这种情况,一般出现在ARM的合作伙伴上。
       在国外销售不会有版权冲突,不会再仰仗ST这个第三方,以后ST就是纯粹的代工企业。将来和ST谈起来,筹码更多了。
       还有 很多很多。。。。
       就像当年没有钱拿授权现在可以一样。我希望龙芯将来强大了,直接买下MIPS公司。这才是终极解决方案——这也是我内心的深切愿望。

本文最初在yhustc的博客上看到,全部内容来自于网上

引:

1、妓者? http://yhustc.com/Blog/175.html

2、龙芯获MIPS专利授权 将支持Android    http://www.cnbeta.com/articles/86691.htm

3、关于龙芯拿MIPS授权的再一点理解  http://www.lemote.com/bbs/viewthread.php?tid=23886&extra=page%3D1

Tags: 龙芯, mips, android

Records:1012