OPhone平台架构和主要开发组件

移动开发
OPhone平台基于Linux和开放手机联盟(OHA)的Android系统,经过中国移动的创新研发,设计出拥有新颖独特的用户操作界面,增强了浏览器能力和WAP兼容性。

OPhone平台的架构

OPhone平台由底层操作系统、本地系统库、OPhone运行环境、Widget运行环境、应用程序框架和应用程序等部分组成。OPhone平台结构图如图1所示:


OPhone平台基于Linux 2.6版内核,内核为上层系统提供了安全、内存管理、线程管理、网络协议栈和驱动模型等系统服务。OPhone平台强大的功能来源于底层的本地库,包括多媒体引擎OpenCORE,浏览器引擎WebKit,2D图形引擎SGL和关系型数据库SQLite等。这些本地库通过上层的应用程序框架将编程接口提供给开发者调用,本地库和应用程序框架通过JNI(Java Native Interface)连接。OPhone平台为应用程序提供了一个开放的运行环境,无论是内置应用程序,还是后续安装的应用程序,所有应用程序访问底层框架的能力是一致的,开发者可以使用应用程序框架提供的API开发自己的应用程序。
 
OPhone上的应用程序模型

最新发布的OPhone 1.5平台支持以下三种应用程序,本文主要介绍OPhone应用程序模型。

使用java语言编写的OPhone应用程序,以APK形式发布。

使用HTML、JavaScript等脚本语言编写的Widget程序,以WGT形式发布。

使用java语言编写的MIDlet程序,以jar/jad形式发布。

APK文件在Dalvik虚拟机内运行,Dalvik虚拟机与普通的Java虚拟机不同,它针对嵌入式设备进行了优化,class文件也经过“dx”工具转换成.dex文件格式,.dex文件格式更为紧凑,执行效率更高。APK应用程序运行时,OPhone会启动一个Linux进程,应用程序就运行在自己的进程之中。每一个进程都拥有自己的一个Java虚拟机,不同应用程序的代码都是单独运行的,不会相互影响。

APK是一种与zip文件格式兼容的文件。OPhone SDK提供了aapt工具,可以把类文件和资源文件打包成APK文件,打包过程包括class文件到dex文件的转换、生成资源表、优化文本格式的XML文件等工作。转换过程如图2所示:

主要开发组件

OPhone应用程序通常由Activity、Content Provider、Service和BroadcastReceiver组成,虽然每项并非是必须的,但是掌握这些开发组件是学习OPhone应用程序开发首要的任务。下面对OPhone应用程序的主要开发组件逐一介绍。#t#

Activity

从表面上讲,Activity是OPhone应用程序的一个界面,用户可以通过这个界面操作播放器,查看联系人或者玩游戏。对开发者而言,Activity是OPhone应用程序的入口,OPhone应用程序模型没有定义像main()这样的入口方法,而是在Activity类中定义了一系列的生命周期方法,比如onCreate()、onResume()、onStart()、onPause()、onStop()和onDestroy(),OPhone系统会在适当的时候调用对应的生命周期方法。这一点与Java ME平台的MIDlet类似。#p#

OPhone的应用程序模型打破了应用程序之间的边界,系统会为每个应用程序维持一个堆栈,堆栈中放置Activity对象,应用程序不但可以将APK中定义的Activity放入堆栈,还可以将其他应用程序的Activity放入堆栈中。例如,可以通过调用startActivity()方法启动浏览器、拨打电话、浏览图片等。例如,从应用程序中调用Phone程序拨打电话的代码如下所示:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
startActivity(intent);

这种特性极大的增加了平台组件的复用性,你不需要单独开发一个电话程序,也没有必要单独开发一个图片浏览程序,只需要通过简单的代码调用系统已经提供的Activity即可。

Content Provider 

Content Provider提供了在不同应用程序间共享数据的机制。在OPhone系统中已经预置了几种Content Provider,向开发者提供音频、视频、图片、联系人和呼叫记录等数据。如果这些数据使用数据库接口来存储,那么将无法提供给其他的应用程序使用。当然,如果数据只是想在应用程序内部使用,就不应该使用Content Provider,而使用数据库或者文件等可以获得更高效的读/写操作。

在android.provider包内定义了一些类和接口,它们主要描述了内置的几个Content Provider的数据结构。例如MediaStore.Audio定义了音频数据的信息,CallLog.Calls则定义了通话记录的信息。ContentProvider类提供了抽象的接口,允许应用程序查询,插入,删除和更新其中的数据。下面的代码可以从系统中查询存储在SD卡上的歌曲,如图3所示:

  1. ContentResolver resolver = getContentResolver();   
  2. //从Content Provider中获得SD卡上的音乐列表   
  3. cursor =resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); String[] cols = new String[] {   
  4. MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST,   
  5. };   
  6. int[] ids = new int[] { R.id.track_name, R.id.artist };   
  7. if (cursor != null) startManagingCursor(cursor);   
  8. //创建Adapter并绑定到ListView SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.songs_list, cursor, cols, ids);   
  9. setListAdapter(adapter);    

Service

Service是OPhone平台非常重要的组件之一,它运行在后台,不与用户进行交互。在默认情况下,Service运行在应用程序进程的主线程之中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在单独的线程中处理,避免阻塞用户界面。启动后的Service具有较高的优先级,一般情况下,系统会保证Service的正常运行。只有当前台的Activity正常运行的资源被Service占用的情况下,系统才会暂时停止Service;当系统重新获得了资源后会自动启动原来的Service。

如果想使用Service组件,需要扩展android.app.Service类,并在AndroidManifest.xml文件中使用标签声明。与Activity类似,Service中同样定义了onCreate()、onStart()和onDestroy()等生命周期方法。当其他组件通过Context.startService()方法启动Service时,系统会创建一个Service对象,并顺序调用onCreate()方法和onStart()方法。在调用Context.stopService()或者stopSelf()之前,Service一直处于运行的状态。如果多次调用startService()方法,系统只会多次调用onStart()方法,而不会重复调用onCreate()方法。无论调用了多少次startService(),只需要调用一次stopService()就可以停止Service。Service对象在销毁之前,onDestroy()会被调用,因此与资源释放相关的工作应该在此方法中完成。
 
BroadcastReceiver

应用程序的运行环境不是一成不变的,SD卡插拔、电池电量低等事件会影响应用程序的运行。为了能够做出正确的响应,应用程序必须能够监听此类事件并做出正确的处理。在OPhone系统中,BroadcastReceiver就是我们需要的那个组件。BroadcastReceiver没有界面显示,但是它却可以通过AndroidManifest.xml或者在代码中进行注册,以监听应用程序感兴趣的事件。BroadcastReceiver是一个抽象类,定义了一个抽象方法onReceive(),当广播事件到来时,BroadcastReceiver的onReceive()方法会被调用,开发者只需要自己实现此方法即可。
void onReceive(Context curContext, Intent broadcastMsg)

使用BroadcastReceiver可以方便的实现开机自启动应用程序,OPhone系统启动后,会广播Intent.ACTION_BOOT_COMPLETED事件,因此只需要在程序中定义一个BroadcastReceiver并在AndroidManifest.xml中进行注册。

  1. <receiver android:name=".BootReceiver" >   
  2. <intent-filter> <action android:name="android.intent.action.BOOT_  
  3. COMPLETED" /> intent-filter> receiver>  

除此之外,还需要在AndroidManifest.xml中增加权限声明,如果不声明应用程序所需要的权限,那么在运行时会抛出安全异常。

  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_  
  2. COMPLETED"/>    
  3. <uses-permission android:name="android.permission.RECEIVE_BOOT_  
  4. COMPLETED"/> 

最后只需要实现一个BroadcastReceiver即可,代码如下所示:

  1. public class BootReceiver extends BroadcastReceiver  
  2. { @Override public void onReceive(Context arg0, Intent arg1)   
  3. { if (arg1.getAction().equals(Intent.ACTION_BOOT_COMPLETED))   
  4. {Intent intent = new Intent(arg0, com.ophone.MusicActivity.class); //在Activity之外调用startActivity()   
  5. intent.addFlag  
  6. (Intent.FLAG_ACTIVITY_NEW_TASK);   
  7. arg0.startActivity(intent); } } }    
责任编辑:chenqingxiang 来源: ophonesdn
相关推荐

2010-04-11 17:18:14

Windows Pho

2010-07-23 14:51:09

OPhone开发

2017-10-13 13:13:14

人工智能深度学习微博

2019-12-12 10:22:16

大数据平台大数据安全大数据

2022-01-07 16:24:30

Kubernetes容器平台

2015-08-31 14:57:11

大数据处理

2020-02-24 21:23:41

跨平台想法尝试

2023-12-04 11:13:46

AIoT智能物联网

2010-07-23 16:08:38

OPhone平台

2021-02-22 10:55:59

大数据大数据平台数据平台建设

2020-12-17 19:15:48

大数据大数据平台架构数据平台建设

2009-03-26 08:26:22

AndroidGoogle移动OS

2019-12-24 08:11:39

大数据架构数据开发

2020-04-14 08:24:29

滴滴ElasticSear架构

2021-02-22 10:32:53

大数据大数据平台大数据技术栈

2019-11-21 09:49:29

架构运维技术

2011-04-13 13:28:46

JavaScript程序员

2017-06-19 13:10:59

大数据大数据平台架构

2017-06-20 09:54:18

大数据架构数据分析

2017-02-28 21:23:34

大数据采集架构分析
点赞
收藏

51CTO技术栈公众号