科学网

 找回密码
  注册
科学网 标签 Android 相关日志

tag 标签: Android

相关日志

两个Android静态分析工具被Mobile Security Wiki收录
qizhwei 2017-3-14 13:34
我们开发的工具Appaudit和PATdroid 被Mobile Security Wiki收录,作为Android动态分析的重要工具,也是来自于论文 SP'15 的研究成果, 详见 https://mobilesecuritywiki.com/。 最近主要侧重于Android Devops的自动化开发测试, 详见 https://appetizer.io/cn/。 基于程序分析的手段,提高Android开发测试与运维效率和水平,将研究成果转化到软件实践中,是目前的尝试,欢迎交流。
个人分类: 杂感随谈|2200 次阅读|0 个评论
android学习笔记(一)
bingws 2016-11-3 08:34
1、安卓知识结构: 2、Android系统架构,Android试运行在Linux内核基础之上的。 第一层:应用层Application 第二层:应用框架层Application Framework 第三层:Android底层类库层 Libraries、Dalvik虚拟机 第四层:linux内核层 linux kernel 3、Android工程的目录结构 src/ java源代码存放目录 gen/ 自动生成目录 gen目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。 res/ 资源(Resource)目录 在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。 libs/ 支持库目录 程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。 assets 资源目录 Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file://android_asset/xxx.3gp AndroidManifest.xml 项目清单文件 这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。 project.properties 项目环境信息,一般是不需要修改此文件 4、ADB命令 常见命令: adb devices 列出所有的设备 adb shell 挂载到linux的空间 可以执行liux指令 adb install xxx.apk 如果有多个设备,我们可以指定设备,例如:adb install –s emulator-5554 D:/xxx.apk adb shell 挂载到linux空间 adb push 把文件推到手机里 adb pull 把文件从手机里拉出来 ctrl+F11 横竖屏的切换
个人分类: 笔记|4 次阅读|0 个评论
Note3电信版n9009打接电话没声音的解决方法
rasin 2016-10-13 10:00
最近爆出Note7爆炸继而全球停止发售的新闻,今天偶尔又看到了网友求助的帖子“Note3电信版n9009打接电话没声音的问题”。因为我原来使用Note3,在购机半年之后也碰到了接打电话没有声音的问题,这里分析我的解决方法。 通过分析,我怀疑是三星的噪音过滤模块的问题,因此,软件上禁用这一功能应该可以解决问题,但是通过Android系统设置了一般是没有效果(有时有效)。噪音过滤是通过两个麦克风的差异实现的,所以,可能手机上部的麦克风有问题。所以我拆开手机,用一块折叠的3mm*5mm卫生纸垫上(在手机上部一个小孔对应的位置),用盖板压住,使接触点压紧,就解决了问题,这样又坚持使用了一年半。 希望对遇到类似问题的同学有帮助。(晚了点,就当做是给三星提醒吧,当时我给他们售后打电话,他们给不出方案)
3957 次阅读|0 个评论
安卓开发平台搭建整理_2016/09/28
AlanTuring 2016-9-28 20:16
中秋节第二天(2016/09/17)出车祸,这几天才出院,顿感人生很短,很多事情没来得及去做,今天有空特定整理了以前大学期间自己搭建安卓开发平台的心得,以供大家交流讨论,当然整个过程参考了网上很多内容,希望有空再更新博客! 第一部分:准备工作(下载开发工具) 1、 下载 JDK ( Java Development Kit ); (1) 进入官网 http://www.oracle.com/index.html (2) 点击红色圈圈区域,进入下载界面: ( 3 )下拉,点击红色圈圈区域,进入下一界面: ( 4 )点击下面红色区域; ( 5 )点击下面红色圈圈区域,进入下载界面: ( 6 )点击 Accept Lisense Agreement ;选择版本为 win7 64 位系统;下载; 2、 下载 Eclipse+ADT+Android SDK : 参考网址: http://www.cnblogs.com/tc310/p/3938353.html 第二部分:安装配置环境变量 (1) JDK 安装在默认路径下; (2) 安装 Eclipse+ADT+Android SDK : (3) 环境变量设置: A. 新建 JAVA_HOME (系统变量) C:\Program Files\Java\jdk1.8.0_51 B. 新建 JAVA_JRE_HOME %JAVA_HOME%\jre C. 新建 JRE_HOME C:\Program Files\Java\jre1.8.0_51 D. 新建 Andriod_SDK_HOME D:\learning software\Android\adt-bundle-windows-x86_64-20140702\sdk E. 新建 CLASSPATH C:\Program Files\Java\jdk1.8.0_51\lib;C:\Program Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_51\lib\dt.jar;C:\ProgramFiles\Java\jre1.8.0_51\lib;C:\Program Files\Java\jre1.8.0_51\lib\rt.jar;%JAVA_JRE_HOME%\lib;%JAVA_JRE_HOME%\lib\rt.jar F. 新建 PATH %Android_SDK_HOME%\platform-tools;%Android_SDK_HOME%\tools;%JAVA_HOME%\bin;%JRE_HOME%\bin;%JAVA_JRE_HOME%\bin; (4) cmd 验证是否配置环境变量成功; 输入 java; 效果如下证明配置成功; 输入 javac; 效果如下则配置成功; 输入 adb ;效果如下则配置成功; (5) 打开 SDK Manager,安装相应的组件,比如ARM等等,因为之前是没有安装的,导致不能创建AVD,所以必须把相应的插件安装好才能启动安卓模拟器。 (6) 创建 Hello World程序,进行检验上述是否配置成功。 启动 Eclipse;选择Files-New-New Android Application 点击 Next ,一直按照默认操作,直至 Finish 。 (7) Hello world程序能在安卓模拟器上运行,说明整个平台搭建成功,可以继续任何安卓软件开发了!
个人分类: AI Workshop|2821 次阅读|0 个评论
[转载][恐怖] [豚鼠系列六部曲(1985 - 1990)][720p][日本][主演:田村
lcj2212916 2016-5-29 21:39
日本《豚鼠系列》一共六部: 1、Devil’s Experiment 恶魔实验  1985 2、Flowers Of Flesh And Blood 血肉之花  1985 3、He Never Dies 他不会死  1986 4、Mermaid In A Manhole 地窖人鱼 1988 ( 下水道的美人鱼 ) 5、Android Of Notre Dame 圣母机器人  1988 6、Devil Woman Doctor 恶魔女医生  1990 下载地址: http://www.yimuhe.com/file-3068416.html
11207 次阅读|0 个评论
[转载]Android修改hosts文件的方法
fredade 2015-11-22 12:28
修改hosts文件一定要谨慎:Android手机hosts文件的换行符必须是n而不是windows的rn,使用Notepad++打开hosts文件,依次点击菜单中的“视图–显示符号–显示所有字符”,如果行末是LF就没问题,CR LF结束则需要替换所有的CR LF为LF。 Android手机hosts文件路径: /system/etc/hosts 修改hosts方法(需重启): 修改host文件首先需要Android手机获取Root权限; 使用Root Explorer管理器或ES文件浏览器装载/system可写状态,找到/system/etc/hosts的文件,使用文本编辑器打开编辑后保存; 保存后重启手机即可生效。
个人分类: 工具使用|2 次阅读|0 个评论
小小的安卓,不一样的生活
xdcaxy2013 2014-8-7 13:28
现在我从事的是安卓开发方面的实习工作,我很佩服美国人,佩服google和apple,他们发明了安卓和ios,正因为如此,短短五六年时间,打败芬兰人引以为豪辉煌了十几年的诺基亚,包括它的塞班系统,我之前一直想学习 塞班,可是当我想了解它的时候,发现塞班已经快灭亡了。 android和ios似乎是“天生一对”,我不知这个词恰当不,因为他们面向的是两个不同的人群,一个面向高端消费,属于“高富帅”;一个面向中低端消费,属于“屌丝”。正好可以满足不同人的需要,这也许也是美国人的精明之处吧。话题扯远了,说起android,不得不说google公司,我很佩服这样的企业,他引领者人们的生活,无论是人们现在手里拿的安卓手机还是吵得很火的“云计算”这样的词,都是google提出的,它真正实现了“软件改变世界”的豪言壮语,不管我们 承认 不承认,世界事实确实如此。 “Android一词的本义指“ 机器人 ”,同时也是 Google 于2007年11月5日 宣布的基于 Linux 平台的 开源 手机操作系统的名称,该平台由 操作系统 、中间件、 用户界面 和 应用软件 组成。 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的 科幻小说 《 未来夏娃 》( L'ève future )中。他将外表像人的机器起名为Android。”
2376 次阅读|0 个评论
[转载]【Android】SAX解析之错误纠正!!
hailuo0112 2013-10-28 10:51
【Android】SAX解析之错误纠正!! 分类: Java 【Android基础】 【Android进阶】 【SAX解析】 2011-11-26 00:20 2325人阅读 评论 (17) 收藏 举报 android string attributes xml import date 在讲这次错误之前,先看一下下面这段代码。 【◆以下解析方法是错误的×】 view plain copy print ? import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; public class XmlHandler extends DefaultHandler{ private final String TAG = this .getClass().getSimpleName(); /**XML文件中标签定义*/ private final String TAG_Article = Article ; private final String TAG_ArticleID = ArticleID ; private final String TAG_Title = Title ; private final String TAG_Date = Date ; private final String TAG_SmallPictures = SmallPictures ; private final String TAG_LargePictures = LargePictures ; private final String TAG_Category = Category ; private static final String TAG_HeadNote = HeadNote ; private static final String TAG_SubTitle = SubTitle ; private static final String TAG_Source = Source ; //当前正在解析的TAG private String currentName; //单个文章 private News news = null ; //文章列表 private ListNews newsList = null ; //解析开始时间 private long start_time; private boolean flag = false ; @Override public void characters( char ch, int start, int length) throws SAXException { super.characters(ch, start, length); if(!flag) { return; } // 取值 String value = new String(ch, start, length); Log.d(TAG, "Element: " + currentName + " Element Value: " + value); if(value != null) { if(TAG_ArticleID.equals(currentName)) { news.setArticleId(value); } else if(TAG_Title.equals(currentName)) { news.setTitle(value); } else if(TAG_Date.equals(currentName)) { news.setDate(value); } else if(TAG_Category.equals(currentName)) { news.setCategory(value); } else if(TAG_SmallPictures.equals(currentName)) { news.setSmallPicture(value); } else if(TAG_LargePictures.equals(currentName)) { news.setLargePicture(value); } else if(TAG_HeadNote.equals(currentName)) { news.setHeadNote(value); } else if(TAG_SubTitle.equals(currentName)) { news.setSubTitle(value); } else if(TAG_Source.equals(currentName)) { news.setSource(value); } } } @Override public void startDocument() throws SAXException { super.startDocument(); start_time = System.currentTimeMillis(); newsList = new ArrayListNews(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); this.currentName = localName; flag = true; if(TAG_Article.equals(localName)) { news = new News(); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); flag = false; if(TAG_Article.equals(localName)) { newsList.add(news); } } @Override public void endDocument() throws SAXException { super.endDocument(); long end = System.currentTimeMillis(); Log.d(TAG, "Parse List's Xml Cost: " + (end - start_time) + " !!"); } } Baidu 或者 Google 一下 “Android Sax 解析” , 给出的Sample无一例外都是如此。 坑爹啊... 甚至连有些书籍中都是这么写的, 比如《Android开发入门与实践》。(本书亲自确认过,其他书情况不详) 没错, 一般情况下,这么写是可以的, 而且在大多数情况下解析出来也是正确的。 但是就是偶尔会出错, 这个时候通常你都莫不着头脑, 怎么回事? 数据没错啊,解析部分代码貌似也没问题.. 真是奇了怪了。 其实问题都出在上面那段代码上!! 大家都认为 SAX 解析过程大致如下: startDocument - startElement - characters - endElement - endDocument 没错,就是这样, startElement 读取起始标签, endElement 读取结束标签,characters 呢? 当然是读取其值, 这没错,但是大家都天真的以为 characters 只执行一次,并且一次就读取了全部内容。错就错在这! 其实characters 是很有可能会执行多次的,当遇到内容中有回车,\t等等内容时,它很有可能就执行多次。 有的人可能会说,那我没有这些是不是就只执行一次了? 看下我实测结果: 测试用XML如下: view plain copy print ? News Article ArticleID 1000555 / ArticleID Title ! ] / Title Date 2011-11-25 14:23:52 / Date SmallPictures livenews/images/s20.png / SmallPictures LargePictures livenews/images/l20.png / LargePictures Category 闻天下 / Category HeadNote / HeadNote SubTitle / SubTitle Author / Author Source 人民日报 / Source Abstract / Abstract / Article Article ArticleID 1000554 / ArticleID Title ! ] / Title Date 2011-11-25 14:22:33 / Date Category ! ] / Category HeadNote / HeadNote SubTitle / SubTitle Author / Author Source / Source Abstract / Abstract / Article Article ArticleID 1000553 / ArticleID Title / Title Date 2011-11-25 14:21:23 / Date SmallPictures livenews/images/s21.png / SmallPictures LargePictures livenews/images/l21.png / LargePictures Category ! ] / Category HeadNote / HeadNote SubTitle / SubTitle Author / Author Source ! ] / Source Abstract / Abstract / Article News News Article ArticleID1000555/ArticleID Title! ]/Title Date2011-11-25 14:23:52/Date SmallPictureslivenews/images/s20.png/SmallPictures LargePictureslivenews/images/l20.png/LargePictures Category闻天下/Category HeadNote/HeadNote SubTitle/SubTitle Author/Author Source人民日报/Source Abstract/Abstract /Article Article ArticleID1000554/ArticleID Title! ]/Title Date2011-11-25 14:22:33/Date Category! ]/Category HeadNote/HeadNote SubTitle/SubTitle Author/Author Source/Source Abstract/Abstract /Article Article ArticleID1000553/ArticleID Title/Title Date2011-11-25 14:21:23/Date SmallPictureslivenews/images/s21.png/SmallPictures LargePictureslivenews/images/l21.png/LargePictures Category! ]/Category HeadNote/HeadNote SubTitle/SubTitle Author/Author Source! ]/Source Abstract/Abstract /Article News 可以很明显的看到,在解析 ArticleID1000553/ArticleID 这一段时, characters执行了两次,将内容1000553分两次读取.. 用上面那种方式的最终结果就是 ArticleID = 00553 了。 那如果你的应用需要根据这个id 进一步获取内容岂不是死翘翘了?(比如这边根据id获取新闻详细内容) 好了,废话不多说了,看下正确的写法! 【★以下解析方法才是正确的 √ 】 view plain copy print ? import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; public class XmlHandler extends DefaultHandler{ private final String TAG = this .getClass().getSimpleName(); /**XML文件中标签定义*/ private final String TAG_Article = Article ; private final String TAG_ArticleID = ArticleID ; private final String TAG_Title = Title ; private final String TAG_Date = Date ; private final String TAG_SmallPictures = SmallPictures ; private final String TAG_LargePictures = LargePictures ; private final String TAG_Category = Category ; private static final String TAG_HeadNote = HeadNote ; private static final String TAG_SubTitle = SubTitle ; private static final String TAG_Source = Source ; //单个文章 private News news = null ; //文章列表 private ListNews newsList = null ; //解析开始时间 private long start_time; //(1) private StringBuilder sb = new StringBuilder(); @Override public void characters( char ch, int start, int length) throws SAXException { super.characters(ch, start, length); //(2)不管在startElement到endElement的过程中,执行了多少次characters, 都会将内容添加到StringBuilder中,不会丢失内容 sb.append(ch, start, length); } @Override public void startDocument() throws SAXException { super.startDocument(); start_time = System.currentTimeMillis(); newsList = new ArrayListNews(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //(3) 开始收集新的标签的数据时,先清空历史数据 sb.setLength(0); if(TAG_Article.equals(localName)) { news = new News(); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); //(4)原来在characters中取值,现改在此取值 String value = sb.toString(); if(TAG_ArticleID.equals(localName)) { news.setArticleId(value); } else if(TAG_Title.equals(localName)) { news.setTitle(value); } else if(TAG_Date.equals(localName)) { news.setDate(value); } else if(TAG_Category.equals(localName)) { news.setCategory(value); } else if(TAG_SmallPictures.equals(localName)) { news.setSmallPicture(value); } else if(TAG_LargePictures.equals(localName)) { news.setLargePicture(value); } else if(TAG_HeadNote.equals(localName)) { news.setHeadNote(value); } else if(TAG_SubTitle.equals(localName)) { news.setSubTitle(value); } else if(TAG_Source.equals(localName)) { news.setSource(value); } if(TAG_Article.equals(localName)) { newsList.add(news); } } @Override public void endDocument() throws SAXException { super.endDocument(); long end = System.currentTimeMillis(); Log.d(TAG, "Parse List's Xml Cost: " + (end - start_time) + " !!"); } } 归纳为三点: 1.startElement的时候, new StringBuilder(); 或者 sb.setLength(0); (我建议后者) 2.characters的时候, sb.append(ch, start, length); 3.endElement的时候, sb.toString(); 此时 StringBuilder中的内容才是解析的结果 通过这种方法就不会再有数据离奇丢失的情况了(同时也不需要像错误方法那样再设个currentTag之类的了,逻辑繁杂了,还出错)! 希望大家可以尽早看到这篇文章,不要继续被吭了!!!
个人分类: java|1612 次阅读|0 个评论
[转载]XE5开发Android程序调用电话相关功能(短信息和电话)
thismoment 2013-10-11 21:09
XE5开发Android程序调用电话相关功能(短信息和电话) 日期:2013年9月16日 作者:武稀松(wr960204)的博客 人气:1217 查看: 其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent而是直接发短信. smsManager对应的Delphi代码应该是: uses Androidapi.JNI.JavaTypes,Androidapi.JNI.Telephony; var j: JSmsManager; begin j := tjsmsmanager.Create; j.sendTextMessage(stringtojstring('137114553XX'), nil, stringtojstring('测试短信'), nil, nil); end; 至于双卡双待用哪个卡来发送这些我没有详细研究,有兴趣的朋友可以研究下. 方法b.使用Intent启动系统的短信程序: 我猜以后这种方式会和电话一样会合并到TPlatformServices中. uses Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, Androidapi.JNI.Net var uri: Jnet_Uri; Intent: JIntent; begin uri := StrToJURI('smsto:137114553XX'); Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SENDTO, uri); Intent.putExtra(StringToJString('sms_body'), StringToJString('测试短信')); SharedActivityContext.startActivity(Intent); end; 2.电话 uses FMX.Platform, FMX.PhoneDialer; var phone : IFMXPhoneDialerService; begin ifTPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(phone)) then begin phone.Call('137114553XX'); //监听电话请用phone.OnCallStateChanged事件 end; end; 这段代码适用于iOS和Android. Android平台上实际上电话的封装就是系统的Intent方式调用. 扩展说一下,怎么使用Intent和Action. 简单封装了一个函数.可以使用Intent调用各种系统程序.大家理解成Windows的ShellExecute即可. uses Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, Androidapi.JNI.Net; procedureCall_URI(constAAction : JString;constAURI: string); var uri: Jnet_Uri; Intent: JIntent; begin uri := StrToJURI(AURI); Intent := TJIntent.JavaClass.init(AAction, uri); {Intent.putExtra() 如果是要发短信等复杂的应用,需要传递各种其他的参数.要用到Intent.putExtra()传递多个参数. 这里只封装最简单的,具体Intent.putExtra()的用法,可以查询Java的资料.大把的 } SharedActivityContext.startActivity(Intent); end; //使用例子: //打电话 Call_URI(TJIntent.JavaClass.ACTION_CALL, 'tel:137114553XX'); //打开地图显示某个坐标点 Call_URI(TJIntent.JavaClass.ACTION_VIEW, 'geo:38.899533,-77.036476'); //发送电子邮件 Call_URI(TJIntent.JavaClass.ACTION_SENDTO, 'mailto:wr960204@126.com'); //播放音乐 Call_URI(TJIntent.JavaClass.ACTION_VIEW, ' file:///sdcard/download/ 最炫民族风.mp3'); 最后别忘了配置权限.Android程序是需要权限的. 另外补充一点,做Android开发最好还是有点java开发经验,这样对Android的体系可以有一个比较具体的了解,最起码知道调用的概念.其他平台同理. 先了解多各个平台的概念,然后用XE5开发.XE5解决的是实际工作的时候为了一套代码多个平台使用.
3549 次阅读|0 个评论
[转载]Android系统Gps分析(转)
applehacker 2013-9-25 11:05
1 GPS 架构 2 GPS 分析 2.1 头文件 头文件定义在: hardware/libhardware/include/hardware/gps.h ,定义了 GPS 底层相关的结构体和接口 GpsLocation GPS 位置信息结构体,包含经纬度,高度,速度,方位角等。 view plain copy /** Flags to indicate which values are valid in a GpsLocation. */ typedef uint16_t GpsLocationFlags; // IMPORTANT: Note that the following values must match // constants in GpsLocationProvider.java. /** GpsLocation has valid latitude and longitude. */ #define GPS_LOCATION_HAS_LAT_LONG 0x0001 /** GpsLocation has valid altitude. */ #define GPS_LOCATION_HAS_ALTITUDE 0x0002 /** GpsLocation has valid speed. */ #define GPS_LOCATION_HAS_SPEED 0x0004 /** GpsLocation has valid bearing. */ #define GPS_LOCATION_HAS_BEARING 0x0008 /** GpsLocation has valid accuracy. */ #define GPS_LOCATION_HAS_ACCURACY 0x0010 /** Represents a location. */ typedef struct { /** set to sizeof(GpsLocation) */ size_t size; /** Contains GpsLocationFlags bits. */ uint16_t flags; /** Represents latitude in degrees. */ double latitude; /** Represents longitude in degrees. */ double longitude; /** Represents altitude in meters above the WGS 84 reference * ellipsoid. */ double altitude; /** Represents speed in meters per second. */ float speed; /** Represents heading in degrees. */ float bearing; /** Represents expected accuracy in meters. */ float accuracy; /** Timestamp for the location fix. */ GpsUtcTime timestamp; } GpsLocation; GpsStatus GPS 状态包括 5 种状态,分别为未知,正在定位,停止定位,启动未定义,未启动。 view plain copy /** GPS status event values. */ typedef uint16_t GpsStatusValue; // IMPORTANT: Note that the following values must match // constants in GpsLocationProvider.java. /** GPS status unknown. */ #define GPS_STATUS_NONE 0 /** GPS has begun navigating. */ #define GPS_STATUS_SESSION_BEGIN 1 /** GPS has stopped navigating. */ #define GPS_STATUS_SESSION_END 2 /** GPS has powered on but is not navigating. */ #define GPS_STATUS_ENGINE_ON 3 /** GPS is powered off. */ AgpsCallbacks AgpsInterface #define GPS_STATUS_ENGINE_OFF 4 /** Represents the status. */ typedef struct { /** set to sizeof(GpsStatus) */ size_t size; GpsStatusValue status; } GpsStatus; GpsSvInfo GPS 卫星信息,包含卫星编号,信号强度,卫星仰望角,方位角等。 view plain copy /** Represents SV information. */ typedef struct { /** set to sizeof(GpsSvInfo) */ size_t size; /** Pseudo-random number for the SV. */ int prn; /** Signal to noise ratio. */ float snr; /** Elevation of SV in degrees. */ float elevation; /** Azimuth of SV in degrees. */ float azimuth; } GpsSvInfo; GpsSvStatus GPS 卫星状态,包含可见卫星数和信息,星历时间,年历时间等。 view plain copy /** Represents SV status. */ typedef struct { /** set to sizeof(GpsSvStatus) */ size_t size; /** Number of SVs currently visible. */ int num_svs; /** Contains an array of SV information. */ GpsSvInfo sv_list ; /** Represents a bit mask indicating which SVs * have ephemeris data. */ uint32_t ephemeris_mask; /** Represents a bit mask indicating which SVs * have almanac data. */ uint32_t almanac_mask; /** * Represents a bit mask indicating which SVs * were used for computing the most recent position fix. */ uint32_t used_in_fix_mask; } GpsSvStatus; GpsCallbacks 回调函数定义 view plain copy /** Callback with location information. 向上层传递GPS位置信息 * Can only be called from a thread created by create_thread_cb. */ typedef void (* gps_location_callback)(GpsLocation* location); /** Callback with status information. 向上层传递GPS状态信息 * Can only be called from a thread created by create_thread_cb. */ typedef void (* gps_status_callback)(GpsStatus* status); /** Callback with SV status information. 向上层传递GPS卫星信息 * Can only be called from a thread created by create_thread_cb. */ typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); /** Callback for reporting NMEA sentences. 向上层传递MEMA数据 * Can only be called from a thread created by create_thread_cb. */ typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char * nmea, int length); /** Callback to inform framework of the GPS engine's capabilities.告知GPS模块可以实现的功能 * Capability parameter is a bit field of GPS_CAPABILITY_* flags. */ typedef void (* gps_set_capabilities)(uint32_t capabilities); /** Callback utility for acquiring the GPS wakelock.上锁,防止处理GPS事件时中止。 * This can be used to prevent the CPU from suspending while handling GPS events. */ typedef void (* gps_acquire_wakelock)(); /** Callback utility for releasing the GPS wakelock. */ 释放锁 typedef void (* gps_release_wakelock)(); /** Callback for creating a thread that can call into the Java framework code.等待上层请求 * This must be used to create any threads that report events up to the framework. */ typedef pthread_t (* gps_create_thread)( const char * name, void (*start)( void *), void * arg); /** GPS callback structure. */ typedef struct { /** set to sizeof(GpsCallbacks) */ size_t size; gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb; gps_nmea_callback nmea_cb; gps_set_capabilities set_capabilities_cb; gps_acquire_wakelock acquire_wakelock_cb; gps_release_wakelock release_wakelock_cb; gps_create_thread create_thread_cb; } GpsCallbacks; GpsInterface GPS 接口是最重要的结构体,上层是通过此接口与硬件适配层交互的。 view plain copy /** Represents the standard GPS interface. */ typedef struct { /** set to sizeof(GpsInterface) */ size_t size; /** * Opens the interface and provides the callback routines * to the implemenation of this interface. */ int (*init)( GpsCallbacks* callbacks ); /** Starts navigating. 启动定位*/ int (*start)( void ); /** Stops navigating. 取消定位*/ int (*stop)( void ); /** Closes the interface. 关闭GPS接口*/ void (*cleanup)( void ); /** Injects the current time.填入时间 */ int (*inject_time)(GpsUtcTime time, int64_t timeReference, int uncertainty); /** Injects current location from another location provider填入位置 * (typically cell ID). * latitude and longitude are measured in degrees * expected accuracy is measured in meters */ int (*inject_location)( double latitude, double longitude, float accuracy); /** * Specifies that the next call to start will not use the删除全部或部分辅助数据,在性能测试时使用 * information defined in the flags. GPS_DELETE_ALL is passed for * a cold start. */ void (*delete_aiding_data)(GpsAidingData flags); /**设置定位模式和GPS工作模式等 * min_interval represents the time between fixes in milliseconds. * preferred_accuracy represents the requested fix accuracy in meters. * preferred_time represents the requested time to first fix in milliseconds. */ int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); /** Get a pointer to extension information. 自定义的接口*/ const void * (*get_extension)( const char * name); } GpsInterface; gps_device_t GPS 设备结构体,继承自 hw_device_tcommon ,硬件适配接口,向上层提供了重要的 get_gps_interface 接口。 view plain copy struct gps_device_t { struct hw_device_t common; /** * Set the provided lights to the provided values. * * Returns: 0 on succes, error code on failure. */ const GpsInterface* (*get_gps_interface)( struct gps_device_t* dev); }; 2.2 硬件适配层 GPS 硬件适配层的源码位于: hardware/qcom/gps 目录下。 我们看 gps/loc_api/llibloc_api/gps.c ,首先定义了 gps 设备模块实例: view plain copy const struct hw_module_t HAL_MODULE_INFO_SYM = { .tag = HARDWARE_MODULE_TAG, .version_major = 1, .version_minor = 0, .id = GPS_HARDWARE_MODULE_ID, .name = loc_api GPS Module , .author = Qualcomm USA, Inc. , .methods = gps_module_methods, }; 这里的 methods 指向 gps.c 文件中的 gps_module_methods view plain copy static struct hw_module_methods_t gps_module_methods = { .open = open_gps }; gps_module_methods 定义了设备的 open 函数为 open_gps ,我们看 open_gps 函数: view plain copy static int open_gps( const struct hw_module_t* module, char const * name, struct hw_device_t** device) { struct gps_device_t *dev = malloc( sizeof ( struct gps_device_t)); memset(dev, 0, sizeof (*dev)); dev-common.tag = HARDWARE_DEVICE_TAG; dev-common.version = 0; dev-common.module = ( struct hw_module_t*)module; dev-get_gps_interface = gps__get_gps_interface; *device = ( struct hw_device_t*)dev; return 0; } 此处可以看作是 GPS 设备的初始化函数,在使用设备前必须执行此函数。函数里面指定了 hw_device_t 的 module 成员,以及 gps_device_t 的 get_gps_interface 成员。上层可通过 gps_device_t 的 get_gps_interface 调用 gps__get_gps_interface 函数。 gps__get_gps_interface 的定义如下: view plain copy const GpsInterface* gps__get_gps_interface( struct gps_device_t* dev) { return get_gps_interface(); } 用代码跟踪可看到,此函数返回了 gps/loc_eng.cpp 文件的 sLocEngInterface 变量, sLocEngInterface 定义如下: view plain copy // Defines the GpsInterface in gps.h static const GpsInterface sLocEngInterface = { sizeof (GpsInterface), loc_eng_init, loc_eng_start, loc_eng_stop, loc_eng_cleanup, loc_eng_inject_time, loc_eng_inject_location, loc_eng_delete_aiding_data, loc_eng_set_position_mode, loc_eng_get_extension, }; sLocEngInterface 指定了 GpsInterface 结构体的各个回调函数,如启动定位 / 取消定位等,这些回调函数的实现均在 loc_eng.cpp 中实现。 2.2 JNI 适配层 GPSJNI 适配层的源码位于: frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp 首先看注册 JNI 方法的函数定义: view plain copy int register_android_server_location_GpsLocationProvider(JNIEnv* env) { return jniRegisterNativeMethods(env, com/android/server/location/GpsLocationProvider, sMethods, NELEM(sMethods)); } 此函数被同目录下 onload.cpp 文件调用,调用地方在: view plain copy extern C jint JNI_OnLoad(JavaVM* vm, void * reserved) { JNIEnv* env = NULL; jint result = -1; if (vm-GetEnv(( void **) env, JNI_VERSION_1_4) != JNI_OK) { LOGE( GetEnv failed! ); return result; } LOG_ASSERT(env, Could not retrieve the env! ); //...省略其他注册代码 register_android_server_location_GpsLocationProvider(env); return JNI_VERSION_1_4; } 从这里可以看到, JNI 初始化的时候,即会进行 JNI 方法的注册,从而使上层应用能通过 JNI 调用 c/c++ 本地方法。 回到 register_android_server_location_GpsLocationProvider 函数,变量 sMethods 定义如下: view plain copy static JNINativeMethod sMethods view plain copy static jboolean android_location_GpsLocationProvider_start(JNIEnv* env, jobject obj) { const GpsInterface* interface = GetGpsInterface(env, obj); if (interface) return (interface-start() == 0); else return false ; } 它调用了 GetGpsInterface 获得 GpsInterface 接口,然后直接调用该接口的 start 回调函数。 GetGpsInterface 方法定义如下: view plain copy static const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) { // this must be set before calling into the HAL library if (!mCallbacksObj) mCallbacksObj = env-NewGlobalRef(obj); if (!sGpsInterface) { sGpsInterface = get_gps_interface(); if (!sGpsInterface || sGpsInterface-init(sGpsCallbacks) != 0) { sGpsInterface = NULL; return NULL; } } return sGpsInterface; } 这个函数返回了 sGpsInterface ,而 sGpsInterface 又是从 get_gps_interface() 获得的,我们继续查看 get_gps_interface() 函数的实现: view plain copy static const GpsInterface* get_gps_interface() { int err; hw_module_t* module; const GpsInterface* interface = NULL; err = hw_get_module(GPS_HARDWARE_MODULE_ID, (hw_module_t const **)module); if (err == 0) { hw_device_t* device; err = module-methods-open(module, GPS_HARDWARE_MODULE_ID, device); if (err == 0) { gps_device_t* gps_device = (gps_device_t *)device; interface = gps_device-get_gps_interface(gps_device); } } return interface; } 这里面调用 hw_get_module 加载硬件适配模块 .so 文件,接着通过 hw_device_t 接口调用 open() 函数,实际执行 gps/loc_api/llibloc_api/gps.c 定义的 open_gps 函数,而后调用 gps_device_t 接口的 get_gps_interface 函数,此函数也是在 gps.c 中定义的,最后返回硬件适配层中 loc_eng.cpp 文件的 sLocEngInterface ,从而打通了上层到底层的通道。 2.3 Java Framework GPSFramework 源码位于: frameworks/base/location 2.3.1 接口和类简介 首先对 GPSFramework 重要的接口和类作一个简单的介绍 接口 GpsStatus.Listener 用于当 Gps 状态发生变化时接收通知 GpsStatus.NmeaListener 用于接收 Gps 的 NMEA 数据 LocationListener 用于接收当位置信息发生变化时, LocationManager 发出的通知 类 Address 地址信息类 Criteria 用于根据设备情况动态选择 provider Geocoder 用于处理地理编码信息 GpsSatellite 用于获取当前卫星状态 GpsStatus 用于获取当前 Gps 状态 Location 地理位置信息类 LocationManager 用于获取和操作 gps 系统服务 LocationProvider 抽象类,用于提供位置提供者( Locationprovider ) 2.3.2 使用 Gps 编程接口 下面,我们用一个代码示例说明如何在应用层写一个简单的 gps 程序。 首先在 AndroidManifest.xml 中添加位置服务权限 : view plain copy uses-permission android:name=android.permission.INTERNET / uses-permission android:name=android.permission.ACCESS_COARSE_LOCATION / uses-permission android:name=android.permission.ACCESS_FIND_LOCATION / uses-permission android:name=android.permission.ACCESS_FINE_LOCATION/uses-permission 接着获取位置信息: view plain copy //获取位置服务 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); // 获得最好的定位效果 criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置为最大精度 criteria.setAltitudeRequired( false ); //不获取海拔信息 criteria.setBearingRequired( false ); //不获取方位信息 criteria.setCostAllowed( false ); //是否允许付费 criteria.setPowerRequirement(Criteria.POWER_LOW); // 使用省电模式 // 获得当前的位置提供者 String provider = locationManager.getBestProvider(criteria, true ); // 获得当前的位置 Location location = locationManager.getLastKnownLocation(provider); Geocoder gc = new Geocoder( this ); ListAddress addresses = null ; try { //根据经纬度获得地址信息 addresses = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1 ); } catch (IOException e) { e.printStackTrace(); } if (addresses.size() 0 ) { //获取address类的成员信息 Sring msg = “”; msg += AddressLine: + addresses.get( 0 ).getAddressLine( 0 )+ \n ; msg += CountryName: + addresses.get( 0 ).getCountryName()+ \n ; msg += Locality: + addresses.get( 0 ).getLocality() + \n ; msg += FeatureName: + addresses.get( 0 ).getFeatureName(); } 设置侦听,当位置信息发生变化时,自动更新相关信息 view plain copy //匿名类,继承自LocationListener接口 private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location); //更新位置信息 } public void onProviderDisabled(String provider){ updateWithNewLocation( null ); //更新位置信息 } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status,Bundle extras){ } }; //更新位置信息 private void updateWithNewLocation(Location location) { if (location != null ) { //获取经纬度 double lat = location.getLatitude(); double lng = location.getLongitude(); } //添加侦听 locationManager.requestLocationUpdates(provider, 2000 , 10 ,locationListener); 2.3.3 接口和类分析 下面对相关的类或接口进行分析, LocationManager 的代码文件位于: frameworks/base/location/java/location/LocationManager.java 我们看其构造函数: view plain copy public LocationManager(ILocationManager service) { mService = service; } 其中 mService 为 ILocationManager 接口类型,构造函数的参数为 service ,外部调用时传入 LocationManagerService 实例。 LocationManager 是 android 系统的 gps 位置信息系统服务,在稍后将会对其进行分析。由带参构造函数实例化 LocationManager 类的方式用得不多,一般用的方式是 由 getSystemService 获得 LocationManagerService 服务,再强制转换为 LocationManager 。例如在 2.3.2 中的代码示例中是这样获取 gps 服务的: view plain copy LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 这里的 Context.LOCATION_SERVICE 为 ” location” ,标识 gps 服务。 LocationManagerService 服务是整个 GpsFramework 的核心,首先看它是如何加载的,代码文件位于: frameworks/base/services/java/com/android/server/systemserver.java view plain copy … //省略其他代码 LocationManagerService location = null ; … //省略其他代码 try { Slog.i(TAG, Location Manager ); location = new LocationManagerService(context); ServiceManager.addService(Context.LOCATION_SERVICE, location); } catch (Throwable e) { Slog.e(TAG, Failure starting Location Manager , e); } 此处向 ServiceManger 系统服务管理器注册了新的服务,其名称为 ” location” ,类型为 LocationManagerService 。注册此服务后, Java 应用程序可通过 ServiceManager 获得 LocationManagerService 的代理接口 ILocationManager.Stub , 从而调用 LocationManagerService 提供的接口函数。 ILocationManager 位于: frameworks/base/location/java/location/ILocationManager.aidl ,其代码如下: view plain copy /** * System private API for talking with the location service. * * {@hide} */ interface ILocationManager { ListString getAllProviders(); ListString getProviders(in Criteria criteria, boolean enabledOnly); String getBestProvider(in Criteria criteria, boolean enabledOnly); boolean providerMeetsCriteria(String provider, in Criteria criteria); void requestLocationUpdates(String provider, in Criteria criteria, long minTime, float minDistance, boolean singleShot, in ILocationListener listener); void requestLocationUpdatesPI(String provider, in Criteria criteria, long minTime, float minDistance, boolean singleShot, in PendingIntent intent); void removeUpdates(in ILocationListener listener); void removeUpdatesPI(in PendingIntent intent); boolean addGpsStatusListener(IGpsStatusListener listener); void removeGpsStatusListener(IGpsStatusListener listener); // for reporting callback completion void locationCallbackFinished(ILocationListener listener); boolean sendExtraCommand(String provider, String command, inout Bundle extras); void addProximityAlert( double latitude, double longitude, float distance, long expiration, in PendingIntent intent); void removeProximityAlert(in PendingIntent intent); Bundle getProviderInfo(String provider); boolean isProviderEnabled(String provider); Location getLastKnownLocation(String provider); // Used by location providers to tell the location manager when it has a new location. // Passive is true if the location is coming from the passive provider, in which case // it need not be shared with other providers. void reportLocation(in Location location, boolean passive); boolean geocoderIsPresent(); String getFromLocation( double latitude, double longitude, int maxResults, in GeocoderParams params, out ListAddress addrs); String getFromLocationName(String locationName, double lowerLeftLatitude, double lowerLeftLongitude, double upperRightLatitude, double upperRightLongitude, int maxResults, in GeocoderParams params, out ListAddress addrs); void addTestProvider(String name, boolean requiresNetwork, boolean requiresSatellite, boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude, boolean supportsSpeed, boolean supportsBearing, int powerRequirement, int accuracy); void removeTestProvider(String provider); void setTestProviderLocation(String provider, in Location loc); void clearTestProviderLocation(String provider); void setTestProviderEnabled(String provider, boolean enabled); void clearTestProviderEnabled(String provider); void setTestProviderStatus(String provider, int status, in Bundle extras, long updateTime); void clearTestProviderStatus(String provider); // for NI support boolean sendNiResponse( int notifId, int userResponse); } android 系统通过 ILocationManager.aidl 文件自动生成 IlocationManager.Stub 代理接口,在 Java 客户端获取 LocationManagerService 的方式如下: view plain copy ILocationManager mLocationManager; IBinder b = ServiceManager.getService(Context.LOCATION_SERVICE); mLocationManager = IlocationManager.Stub.asInterface(b); 客户端通过 mLocationManager 即可操作 LocationMangerService 继承自 ILocationManager.Stub 的的公共接口。之前提到了通过 getSystemSerivice 方式也可以获得 LocationManagerService ,但 getSystemService() 返回的是 Object ,必须转换为其他接口,我们可以看到之前的是强制转换为 LocationManager 类型,而此处由 ServiceManager.getService 返回 IBinder 接口,再通过 ILocationManager.Stub 转换为 ILocationManager 类型,是更加规范的做法。 LocationMangerService 的代码文件位于: frameworks/base/services/java/com/android/server/LocationMangerService.java 我们首先看其中的 systemReady() 函数 view plain copy void systemReady() { // we defer starting up the service until the system is ready Thread thread = new Thread( null , this , LocationManagerService ); thread.start(); } 此处启动自身服务线程,因 LocationMangerService 继承自 Runnable 接口,当启动此线程后,会执行继承自 Runnable 接口的 run() 函数,我们看 run() 函数的定义: view plain copy public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Looper.prepare(); mLocationHandler = new LocationWorkerHandler(); initialize(); Looper.loop(); } 此处调用了 initialize() 进行初始化, initialize() 函数定义如下: view plain copy private void initialize() { //...省略其他代码 loadProviders(); //...省略其他代码 } 此处调用了 loadProviders() 函数, loadProviders() 函数调用了 _loadProvidersLocked() ,其代码如下: view plain copy private void _loadProvidersLocked() { // Attempt to load real providers first if (GpsLocationProvider.isSupported()) { // Create a gps location provider GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this ); mGpsStatusProvider = gpsProvider.getGpsStatusProvider(); mNetInitiatedListener = gpsProvider.getNetInitiatedListener(); addProvider(gpsProvider); mGpsLocationProvider = gpsProvider; } // create a passive location provider, which is always enabled PassiveProvider passiveProvider = new PassiveProvider( this ); addProvider(passiveProvider); mEnabledProviders.add(passiveProvider.getName()); // initialize external network location and geocoder services if (mNetworkLocationProviderPackageName != null ) { mNetworkLocationProvider = new LocationProviderProxy(mContext, LocationManager.NETWORK_PROVIDER, mNetworkLocationProviderPackageName, mLocationHandler); addProvider(mNetworkLocationProvider); } if (mGeocodeProviderPackageName != null ) { mGeocodeProvider = new GeocoderProxy(mContext, mGeocodeProviderPackageName); } updateProvidersLocked(); } 在这里对 GpsLocationProvider 和 NetworkLocationProvider 类作了初始化,并添加到 provider 集合中。 GpsLocationProvider 和 NetworkLocationProvider 继承自 LocationProviderInterface 接口,分别代表两种位置提供者 (LocationProvider) : ( 1 ) LocationManager.GPS_PROVIDER : GPS 模式,精度比较高,但是慢而且消耗电力,而且可能因为天气原因或者障碍物而无法获取卫星信息,另外设备可能没有 GPS 模块( 2 ) LocationManager.NETWORK_PROVIDER :通过网络获取定位信息,精度低,耗电少,获取信息速度较快,不依赖 GPS 模块。 Android 提供 criteria 类,可根据当前设备情况动态选择位置提供者。我们在之前 2.3.2 的代码示例中,有这样一句代码: view plain copy // 获得当前的位置提供者 String provider = locationManager.getBestProvider(criteria, true ); getBestProvider 其实是根据 Criteria 的条件遍历 mProviders 集合,返回符合条件的 provider 名称。我们再看 GpsLocationProvider 的实现,其代码文件位于: frameworks/base/services/java/com/android/server/location/GpsLocationProvider.java 在 GpsLocationProvider 的构造函数中: view plain copy public GpsLocationProvider(Context context, ILocationManager locationManager) { //...省略部分代码 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intents.DATA_SMS_RECEIVED_ACTION); intentFilter.addDataScheme(sms); intentFilter.addDataAuthority(localhost,7275); context.registerReceiver(mBroadcastReciever, intentFilter); intentFilter = new IntentFilter(); intentFilter.addAction(Intents.WAP_PUSH_RECEIVED_ACTION); try { intentFilter.addDataType(application/vnd.omaloc-supl-init); } catch (IntentFilter.MalformedMimeTypeException e) { Log.w(TAG, Malformed SUPL init mime type); } context.registerReceiver(mBroadcastReciever, intentFilter); //...省略部分代码 // wait until we are fully initialized before returning mThread = new GpsLocationProviderThread(); mThread.start(); while (true) { try { mInitializedLatch.await(); break; } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } 这里注册了广播接受者 mBroadcastReciever ,用于接收广播消息,消息过滤在 intentFilter 中定义。下面看它接收广播消息时的动作: view plain copy private final BroadcastReceiver mBroadcastReciever = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ALARM_WAKEUP)) { if (DEBUG) Log.d(TAG, ALARM_WAKEUP ); startNavigating( false ); } else if (action.equals(ALARM_TIMEOUT)) { if (DEBUG) Log.d(TAG, ALARM_TIMEOUT ); hibernate(); } else if (action.equals(Intents.DATA_SMS_RECEIVED_ACTION)) { checkSmsSuplInit(intent); } else if (action.equals(Intents.WAP_PUSH_RECEIVED_ACTION)) { checkWapSuplInit(intent); } } }; 当接收 ALARM_EAKEUP 时,执行 startNavigating 函数,当接收到 ALARM_TIMEOUT 广播时,执行 hibernate 函数。这两个函数很关键,下面看他们的实现: view plain copy private void startNavigating( boolean singleShot) { //...省略部分代码 if (!native_set_position_mode(mPositionMode, GPS_POSITION_RECURRENCE_PERIODIC, interval, 0 , 0 )) { mStarted = false ; Log.e(TAG, set_position_mode failed in startNavigating() ); return ; } if (!native_start()) { mStarted = false ; Log.e(TAG, native_start failed in startNavigating() ); return ; } //...省略部分代码 } 看到没有,这里调用了 native_set_position_mode 和 native_start 方法,而这些方法正是我们之前在 JNI 适配层提到的注册的本地方法。同样的, hibernate 函数调用了 JNI 提供的 native_stop 方法。我们再看 GpsLocationProvider 的内部私有函数: 可以看到所有这些本地方法,都是在 JNI 层注册的, GpsLocationProvider 类是从 JNI 层到 Framework 层的通道。 下面回到 LocationManagerService ,分析如何获取最新的位置信息 (Location) ,获取最新的 location 的函数是 getLastKnownLocation ,其实现如下: view plain copy private Location _getLastKnownLocationLocked(String provider) { checkPermissionsSafe(provider); LocationProviderInterface p = mProvidersByName.get(provider); if (p == null ) { return null ; } if (!isAllowedBySettingsLocked(provider)) { return null ; } return mLastKnownLocation.get(provider); } 这里 mLastKnownLocation 类型为 HashMapString,Location ,所以 mLastKnownLocation.get(provider) 表示通过 provider 的名称在哈希字典中获取相应的 location ,那么这些 location 是什么时候被存入到哈希字典中的呢? 我们回到 LocationManagerService 的 run 函数: view plain copy public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Looper.prepare(); mLocationHandler = new LocationWorkerHandler(); initialize(); Looper.loop(); } 这里对类型为 LocationWorkerHandler 的变量进行初始化, LocationWorkerHandler 是在 LocationManagerService 的一个内部类,它继承自 Handler 类, Handler 是 Android 系统用于应用程序内部通信的组件,内部通信指同个进程的主线程与其他线程间的通信, Handler 通过 Message 或 Runnable 对象进行通信。我们继续看 LocationWorkerHandler 的实现: view plain copy private class LocationWorkerHandler extends Handler { @Override public void handleMessage(Message msg) { try { if (msg.what == MESSAGE_LOCATION_CHANGED) { // log(LocationWorkerHandler: MESSAGE_LOCATION_CHANGED!); synchronized (mLock) { Location location = (Location) msg.obj; String provider = location.getProvider(); boolean passive = (msg.arg1 == 1 ); if (!passive) { // notify other providers of the new location for ( int i = mProviders.size() - 1 ; i = 0 ; i--) { LocationProviderInterface p = mProviders.get(i); if (!provider.equals(p.getName())) { p.updateLocation(location); } } } if (isAllowedBySettingsLocked(provider)) { handleLocationChangedLocked(location, passive); } } } else if (msg.what == MESSAGE_PACKAGE_UPDATED) { //...省略部分代码 } } } catch (Exception e) { // Log, don't crash! Slog.e(TAG, Exception in LocationWorkerHandler.handleMessage: , e); } } } 这里重写 Handle 类的 handleMessage 方法,处理用 Handle 接收的 Message 对象消息。当接受到位置信息变化的消息 MESSAGE_LOCATION_CHANGED 时,调用 p.updateLocationhandleLocationChangedLocked 方法,其实现如下: view plain copy private void handleLocationChangedLocked(Location location, boolean passive) { //...省略部分代码 // Update last known location for provider Location lastLocation = mLastKnownLocation.get(provider); if (lastLocation == null ) { mLastKnownLocation.put(provider, new Location(location)); } else { lastLocation.set(location); } //...省略部分代码 } 可以看到是在 handleLocationChangedLocked 函数中实现对 lastknownlocation 的更新的,那么在 LocationWorkerHandler 类中处理的 MESSAGE_LOCATION_CHANGED 消息是谁发送出来的呢?答案是在 LocationManagerService 类的 reportLocation 函数中: view plain copy public void reportLocation(Location location, boolean passive) { if (mContext.checkCallingOrSelfPermission(INSTALL_LOCATION_PROVIDER) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException( Requires INSTALL_LOCATION_PROVIDER permission ); } mLocationHandler.removeMessages(MESSAGE_LOCATION_CHANGED, location); Message m = Message.obtain(mLocationHandler, MESSAGE_LOCATION_CHANGED, location); m.arg1 = (passive ? 1 : 0 ); mLocationHandler.sendMessageAtFrontOfQueue(m); } 此处构造了新的 Message 对象,然后发送到消息队列的首位置。在 GpsLocationProvider 类的 reportLocation 函数中,有这样一段代码: view plain copy try { mLocationManager.reportLocation(mLocation, false ); } catch (RemoteException e) { Log.e(TAG, RemoteException calling reportLocation ); } 所以实际是由 GpsLocationProvider 主动调用 LocationManagerService 的 reportLocation 方法,从而更新最新的位置信息。 实际上, GpsLocationoProvider 的 reportLocation 对应了硬件适配层中的 GpsCallbacks 结构体中的回调函数 gps_location_callback view plain copy /** Callback with location information. 向上层传递GPS位置信息 * Can only be called from a thread created by create_thread_cb. */ typedef void (* gps_location_callback)(GpsLocation* location); 那么 GpsLocationProvider 中的 reportLocation 函数是如何与 GpsCallbacks 的 gps_location_callback 挂钩的呢?我们回到 JNI 适配层的代码文件: frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp 其中定义的 GetGpsInterface 函数: view plain copy static const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) { // this must be set before calling into the HAL library if (!mCallbacksObj) mCallbacksObj = env-NewGlobalRef(obj); if (!sGpsInterface) { sGpsInterface = get_gps_interface(); if (!sGpsInterface || sGpsInterface-init(sGpsCallbacks) != 0) { sGpsInterface = NULL; return NULL; } } return sGpsInterface; } 这里面的 sGpsInterface-init(sGpsCallbacks) 调用了 GpsInterface 的 init 回调函数,即初始化 GpsCallbacks 结构体变量 sGpsCallbacks , sGpsCallbacks 定义如下: view plain copy GpsCallbacks sGpsCallbacks = { sizeof (GpsCallbacks), location_callback, status_callback, sv_status_callback, nmea_callback, set_capabilities_callback, acquire_wakelock_callback, release_wakelock_callback, create_thread_callback, }; 我们再次看 GpsCallbacks 的定义(其代码文件在硬件适配层的头文件 gps.h 中): view plain copy typedef struct { size_t size; gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb; gps_nmea_callback nmea_cb; gps_set_capabilities set_capabilities_cb; gps_acquire_wakelock acquire_wakelock_cb; gps_release_wakelock release_wakelock_cb; gps_create_thread create_thread_cb; } GpsCallbacks; 比较 sGpsCallbacks 与 GpsCallbacks ,可以看到 location_callback 与 gps_location_callback 对应。再看 location_callback 函数的定义: view plain copy static void location_callback(GpsLocation* location) { JNIEnv* env = AndroidRuntime::getJNIEnv(); env-CallVoidMethod(mCallbacksObj, method_reportLocation, location-flags, (jdouble)location-latitude, (jdouble)location-longitude, (jdouble)location-altitude, (jfloat)location-speed, (jfloat)location-bearing, (jfloat)location-accuracy, (jlong)location-timestamp); checkAndClearExceptionFromCallback(env, __FUNCTION__); } 这里面利用 JNI 调用了 Java 语言的方法 method_reportLocation , method_reportLocation 是一个 jmethodID 变量,表示一个由 Java 语言定义的方法。下面我们看 method_reportLocation 的赋值代码: view plain copy static void android_location_GpsLocationProvider_class_init_native(JNIEnv* env, jclass clazz) { method_reportLocation = env-GetMethodID(clazz, reportLocation , (IDDDFFFJ)V ); //...省略部分代码 } 这里表示 method_reportLocation 指向 Java 类 clazz 里的方法 reportLocation ,那么这个 Java 类 clazz 是不是表示 GpsLocationProvider 呢?我们找到注册 JNI 方法的方法表: view plain copy tatic JNINativeMethod sMethods view plain copy static { class_init_native(); } 说明是在 GpsLocationProvider 中调用了 class_init_native 方法,从而说明 GpsLocationProvider 的 reportLocation 函数是 GpsCallbacks 的回调函数,即当 Gps 设备的位置信息发生变化时,它调用 GpsLocationProvider 的回调函数 reportLocation ,继而调用 LocationManagerService 的 reportLocation 函数,从而更新应用层的位置信息。
4726 次阅读|0 个评论
安卓(Android)手机运行Scilab做科学计算
热度 2 outcrop 2013-8-17 19:51
Scilab是一款强大的免费科学计算软件,语法和matlab类似;足够应付一般科学计算。这次我尝试在安卓手机上安装起来。 博文《 给安卓(Android)手机装上Linux系统 》简单介绍了安装Debian Linux的过程,Debian中安装Scilab就很简单:apt-get install scilab-cli就行。 特别的,考虑到手机不适合运行scilab的图形界面版本,因此只安装命令行版本的Scilab——scilab-cli。 运行效果: ============================= 关于博主 ============================= 博主的主要兴趣是:知识管理;相关兴趣有:语义网、机电及DIY、哲学与心理、信息安全、科幻等。 我的常用博客在科学网 (访问可点链接,下同); 新浪微博是@outcrop ,欢迎互粉;建了一个超级QQ群:17662971,希望能闲聊无白丁,欢迎加入;自己打理着一个 机电工程师 小网站,欢迎来玩。最近在科学网关注“ 科学网大学 ”,欢迎加入 科学网大学群组 讨论、尝试。
个人分类: 计算机应用技术|8830 次阅读|8 个评论
给安卓(Android)手机装上Windows系统
热度 1 outcrop 2013-8-17 09:40
《 给安卓(Android)手机装上Linux系统 》博文中提到Android手机运行Linux的思路,通过chroot实现的linux,性能还是不错的。 要在Android手机上运行Windows,就比较折腾了,需软件模拟X86指令才能运行WindowsXP等系统;还好有Bochs这个模拟器,也有大侠尝试过安装运行,直接给地址: http://bbs.gfan.com/forum.php?mod=viewthreadtid=3565691 没有安装测试,不知道效果如何,先记录分享下。 ============================= 关于博主 ============================= 博主的主要兴趣是:知识管理;相关兴趣有:语义网、机电及DIY、哲学与心理、信息安全、科幻等。 我的常用博客在科学网 (访问可点链接,下同); 新浪微博是@outcrop ,欢迎互粉;建了一个超级QQ群:17662971,希望能闲聊无白丁,欢迎加入;自己打理着一个 机电工程师 小网站,欢迎来玩。最近在科学网关注“ 科学网大学 ”,欢迎加入 科学网大学群组 讨论、尝试。
个人分类: 计算机应用技术|10253 次阅读|4 个评论
给安卓(Android)手机装上Linux系统
热度 1 outcrop 2013-8-17 09:12
手机装上一个Linux系统可以干很多事情,也许是因为比较习惯linux的应用环境。之前在手机上装过一次ubuntu,后来因为是常用的手机,空间有限,就删除了。 昨天发现手机安装linux脚本已经自动化了,直接下载一个应用即可全自动安装,就在闲置的手机上安装了下;像: Complete Linux Installer https://play.google.com/store/apps/details?id=com.galoula.LinuxInstallhl=zh_CN Linux Installer https://play.google.com/store/apps/details?id=com.zpwebsites.linuxonandroid 都是不错的App;当然,手机都需要 root 。尝试了下Linux Installer,教程比较详细 http://android.galoula.com/en/LinuxInstall/ 需要注意一个地方是,最后install linuxchroot script时,注意设置linuxinstaller的系统可写权限,不然安装无响应或者提示写权限出错。 我装的是Debian Linux的arm发行版,apt-get用起来很方便。 ============================= 关于博主 ============================= 博主的主要兴趣是:知识管理;相关兴趣有:语义网、机电及DIY、哲学与心理、信息安全、科幻等。 我的常用博客在科学网 (访问可点链接,下同); 新浪微博是@outcrop ,欢迎互粉;建了一个超级QQ群:17662971,希望能闲聊无白丁,欢迎加入;自己打理着一个 机电工程师 小网站,欢迎来玩。最近在科学网关注“ 科学网大学 ”,欢迎加入 科学网大学群组 讨论、尝试。
个人分类: 计算机应用技术|37440 次阅读|2 个评论
[转载]教大家Android安卓手机怎么上facebook上twitter等国外网站
dubo 2013-8-13 11:46
今天我就来教教大家怎么用手机绕过国内的防火墙上国外的网站! 安卓设置虚拟教程: 以下为PPTP模式设置步骤,如果您的网络不能使用PPTP模式连接,再选择l2tp模式连接。查看Android PPTP设置 第一步: 打开手机主菜单,选择“设置”,然后选择“无线和网络” 第二步:选择“VPN设置”(设置虚拟专用网络) 第三步:添加“VPN”(虚拟专用网络) 第四步:选择“添加PPTP VPN” 如果设置pptp连接不成功的情况下,建议更换“l2tp”进行连接 第五步:点击输入虚拟专用网名称“i7vpn”(此名称可自己随便定义) 第六步:填写服务器地址(可联系i7vpn客服索取) 第七步:启用加密的勾去掉 第八步:DNS搜索范围可不填,也可选填如“8.8.8.8”,然后返回 第九步:选择刚创建的VPN连接登录,输入账号和密码.然后点击“连接 输入账号和密码.然后点击“连接 这样就设置完毕了. 接下来就可以直接登录facebook youtube 了 希望对大家有所帮助啦.! --
个人分类: 安卓|0 个评论
初识Android
Tmraz 2013-7-31 17:04
​ 1 Android Android 的主题思想:随时随地为每个人提供信息。 1.1 Android 与 iPhone 之间的对比 1.1 Android 四层架构体系 说明:(从上往下调用) Application 关键应用程序 Android 平台的应用程序有两个来源,一是本身包含的关键应用程序,如短信收发程序、网页浏览、日历等;二是由开发者自行开发的具有特色的应用程序。 ApplicationFramework 应用程序框架及组件(提供手机开发的基本 API ) 框架和组件是开发 Android 应用程序的基础。开发者在使用 Android 开发应用程序时,可以调用 Android 框架中本身已经存在的组件,也可以在开发过程中开发新的组件,并将此新组件存入 Android 的应用程序框架,以备应用程序进行调用。 Librariesand Android Runtime C/C++ 函数库和 Java 程序运行环境 Libraries: C/C++ 函数库由标准 C 函数库、媒体功能库、浏览器引擎、 2D 和 3D 图形库及 SQLite 引擎等组成,位于 Android 应用程序框架之下。开发者不能直接使用这套函数库的功能,必须通过 Android 应用程序的相关组件间接调用。 Java 程序运行环境: Android 下 Java 程序的运行过程得到了优化,这完全得益于程序运行环境中的一组 Java 核心函数库及 Dlavik 虚拟机。 LinuxKernel Linux 内核 Android 系统平台基于优化的 Linux 内核,它提供诸如内存管理、进程管理、设备驱动 等服务,同时也是手机软硬件的连接层。 1.2 Android 应用程序组成 Android 平台下所有的应用程序都由两部分构成:功能代码和资源 1.3 Android 系统的四个重要组件 Activity (构造界面) Intent ( Activity 之间,应用程序之间传递数据,消息) Service (后台运行,为整个应用程序运行提供服务支持) ContentProvider (为应用程序提供数据,数据接口) 所有的组件都要在 AndroidManifest.xml 文件中进行声明,它负责将这些组件有机的组合在一起。各组件的结构关系如下图: 1.4 Android 开发使用的开发工具 Android SDK , Eclipse 以及 Google 专门为开发 Android 应用程序的插件 ADT 。 2 GoogleMap API for Android 2.1 GoogleMap API 的使用 Creating anew Android application that uses the Google Maps Android API v2 requiresseveral steps. Many of the steps outlined in this section will only have to beperformed once, but some of the information will be a handy reference forfuture applications. The overall process of adding a map to an Androidapplication is as follows: Download and configure the Google Play servicesSDK. The Google Maps Android API is distributed as part of this SDK. Obtain an API key. To do this, you will need toregister a project in the Google APIs Console, and get a signing certificatefor your app. Specify settings in the Application Manifest. Add a map to a new or existing Android project. Publish your application! GooglePlay Service 下载、 Key 获取、 Google 类简介可参照官方的开发者指南 https://developers.google.com/maps/documentation/android/start 部分中文翻译参照博客: http://www.cnblogs.com/mengdd/archive/2013/01/01/2841390.html 2.2 GoogleMap API 开发 Google Maps API 提供的最重要的类是 GMap, 它代表页面上的地图对象,用户可以根据需要在页面上使用多个 GMap 的实例。开发包提供给用户的动态函数库让开发者可以为每个实例提供一些指定的事件,并利用静态方法 GEvent.addListener 或 GEvent.bind 监视这些事件。此外 API 还提供 GMarker 、 GIcon 、 GPolyline 、 GLargeMapControl 等类来分别实现标注、标记、折线、控件等功能。 因为 Google 地图服务缺乏专业制图、空间分析和空间查询等 WebGIS 必备功能 , 故并不是严 格意义上的专业 WebGIS, 暂时只能称为网络地图服务。反过来如果可以将 GIS 知识与 GoogleMap 、 Android 的移动便携以及 GPS 的随时定位结合起来,将有可能形成具有更高价值的地图服务。为生活提供更加准确、便捷专业的移动服务。 3 参考资料 公磊 , 周聪 . 基于 Android 的移动终端应用程序开发与研究 . 计算机与现代化 ,2008,08:85-89. 耿庆斋 , 缪纶 , 段媛媛 , 李江华 . 基于 GoogleMaps API 的 Web 地图服务系统研究及应用 . 中国水利水电科学研究院学报 ,2009,01:62-66. 彭璇 , 吴肖 .GoogleMap API 在网络地图服务中的应用 . 测绘信息与工程 ,2010,01:25-27. 吴肖 , 彭璇 , 朱明磊 . 基于 GoogleMap API 的校园电子地图开发 . 测绘工程 ,2010,03:35-38. 曲桂婷 . 基于 Android 移动式地理信息终端的开发与研究 . 导师 : 袁赣南 ; 罗维 . 哈尔滨工程大学 ,2012. 隆志坚 .Android 平台基于 GoogleMap API 的导航应用技术研究和实现 . 办公自动化 ,2011,16:46-48+57. http://developer.android.com/index.html https://developers.google.com/maps/documentation/android/ http://www.apkbus.com/
个人分类: StudyNote|3610 次阅读|0 个评论
关于android手机开发,与一个学生的对话
lixiangdong 2013-7-30 19:07
李向东 2013-07-29 14:56:59 我是李向东老师,从XXX老师那儿知道你在做手机开发,想跟你了解一些情况,聊聊 Pengzhang 18:16:43 李老师,你好,我才上qq 李向东 18:26:57 你好 你在家吗 Pengzhang 18:27:11 在家 李向东 18:27:18 家是哪里啊 Pengzhang 18:27:24 周口 李向东 18:27:37 周口学生好多啊 Pengzhang 18:27:48 人多,, 李向东 18:27:54 哈哈 Pengzhang 18:28:07 嘿嘿 李向东 18:28:24 你现在基本掌握了android手机开发的主要技术了吧 Pengzhang 18:28:39 常用的是都会些 李向东 18:28:48 听说你们在杭州比赛得奖了 Pengzhang 18:29:01 3等,算是个安慰奖吧 李向东 18:29:27 那别人比我们强在哪里啊,人情关系,还是技术? Pengzhang 18:29:45 学校好,东西有特色 Pengzhang 18:29:54 技术也就那样 李向东 18:30:05 噢,学校名声大 你做这个,从开始到现在有多久了 Pengzhang 18:30:58 安卓算是接触了一年多,但是感觉学的不是太好 李向东 18:31:33 你学习的过程大概描述一下, Pengzhang 18:32:05 一开始自己找书,照着书上的步骤大致过了一遍 重要的东西都看了一些 Pengzhang 18:32:24 然后就自己做东西,跟老师做东西 不会的在网上找 李向东 18:33:09 你觉得比较有帮助的参考书或网站有哪些 Pengzhang 18:33:26 csdn,cnblog。。 书 记不清了,感觉安卓的书都一个样 李向东 18:33:56 嗯 Pengzhang 18:34:09 eoe 李向东 18:35:03 嗯,练习过哪些项目 Pengzhang 18:35:47 跟老师做一个webservice的项目 自己做的一个关于后台提醒的东西 反正都是应用层的东西 李向东 18:37:31 你们参赛的那个作品,是我们学校OA的手机版吗 Pengzhang 18:37:42 不是 是个课表 李向东 18:38:02 供学生用的,还是老师用的? Pengzhang 18:38:08 学生 李向东 18:39:08 就是先把自己的课表设置进去,然后它会到时提醒之类的 Pengzhang 18:39:33 嗯,还会自动调整手机状态,自动回复来电短信 李向东 18:39:37 老师也可以用吧 Pengzhang 18:39:42 可以啊 李向东 18:39:52 回头你发我一个试试 Pengzhang 18:39:55 只是没有特别为老师加什么功能 那个程序有bug。。 现在还没改好 我也不太想动它了,当初代码写的太混乱了 李向东 18:40:26 有没有单双周、第几周这些功能 Pengzhang 18:40:32 有 李向东 18:41:05 你说的webservice的项目,是OA吗? Pengzhang 18:41:15 不是 是别的 李向东 18:46:01 ok 你对后来的android学习者,有什么建议 Pengzhang 18:47:04 按步骤来,先找一本书看完 多动手 多百度 李向东 18:48:03 先要有基本的java基础吗, Pengzhang 18:48:18 java基础倒不是太重要 有任何一门语言基础就行 李向东 18:48:51 噢,那好。然后找本《android从入门到精通》 Pengzhang 18:49:14 嗯 李向东 18:49:17 从头到尾,看看,做做例子 Pengzhang 18:49:43 重要章节做做例子 其他的看看就行了。。 主要还是以后要多练习 李向东 18:50:03 那大概也就几个月时间 Pengzhang 18:50:23 这个我不知道,要看个人了,, 李向东 18:50:55 嗯,那是 李向东 18:52:36 那你以后有什么打算吗,我有个从前的学生,他想从咱学校找几个人,业余时间做点东西,他没说有没有报酬,你有兴趣吗 他现在XX市一个软件公司做开发 Pengzhang 18:53:19 我在老师这有项目,,大三专业课也比较多,感觉时间不太够。。 李向东 18:54:17 好的。那你知道咱计算机学院还有哪些同学有这方面的开发基础 Pengzhang 18:55:19 做java的有一些,,安卓的还真不多,,我想想 李向东 18:56:23 你问一下也行,看有的话,回头告诉我 Pengzhang 18:56:28 嗯,好的 那我问问吧 李向东 18:56:36 好 Pengzhang 18:56:43
个人分类: 文化教育|3202 次阅读|0 个评论
[转载]专利之殇:微软要把Android变成一个悲剧
mathmhb 2013-4-27 09:56
我的阅读提示: 1.中兴的安卓手机为何要向微软交专利费?谷歌不是安卓的开发者吗? 2.在 IT行业 等技术领域,从来离不开 技术 ,但技术从来不是最重要的。 http://www.36kr.com/p/160876.html 专利之殇:微软要把Android变成一个悲剧 马超 发表于 2011/07/08-17:26 Android / 微软 快成为第一个 分享 的人吧! 分享到 不知道 大家有没有听过这样一个故事:上个世纪 80 年代初的时候,Sun Microsystems 还只是一个创业性的科技公司。某一天,一小撮 IBM 员工突然出现在了 Sun 总部大楼内,声称 Sun 侵犯了 IBM 7 项专利并要求支付赔偿。Sun 的员工在认真查阅了涉案的 7 件专利后发现其中 6 件很可能是无效的,而且 Sun 很明显也没有侵犯 IBM 所提到的第 7 件专利。在 Sun 阐明这一结果后,场面突然非常的尴尬。不过很快领头的 IBM 员工发话了: 好吧,也许你们真的没有侵犯我们刚刚提到的那 7 件专利,但是我们在美国有 1 万件专利,你难道真的想让我们空手回去再查查看你们是不是侵犯了我们的其他专利吗?还是你们小小的表示一下,花个 2000 万美元私了了此事? 后来的结果是,经过一番讨价还价,Sun 给 IBM 开了一张支票。而 IBM 则继续去到了下一家目标公司收取“专利保护费”。 为什么提到这个故事呢?因为 Google 的 Android 现在就面临着微软给出的一个类似的难题。 微软最近就到处在要求生产Android移动设备的公司向他们支付专利侵权费用 。可能许多人会说不公平,微软最近在移动领域的创新显然不如 Google,它凭什么去收取专利侵权费? 这样说 的人大多忽视了一个重要的原因,那就是 微软手握海量专利(约18000) ,甚至其单在过去的 4 个月时间里就获得了 700 项专利。而对比来说 Google 却总共只拥有 700 多项专利。 事实上,申请软件专利也不是一件容易的事,而且远远超出工程师的努力范围。另外软件的复杂性和低标准又意味着工程师随时都可能生产出来一个可以申请专利的点子。但是大部分工程师都不会认为这类点子值得申请专利,那么公司就有必要对这些工程师进行重新培训帮助他们写出这类点子然后通过专业的法律手段来为其申请专利。 对于正处于高增长期的科技公司来说,显然不具备资源去打类似的法律战,而且还可能付出很高的机会成本。因为你既要花费巨资聘请律师,又要抽调你极为宝贵的工程师资源来协助律师们合理规范的编写能够申请的软件专利。 但对于更加成熟的公司比如微软或者 IBM 来说,情况却是不同的,它们付出的机会成本要低得多。事实上他们有许多未能充分利用起来的工程师和金钱资源可以被抽调去和法务部门合作编写专利申请。此外由于机构臃肿,他们本身的产品开发过程也比较满,因而在这个开发过程中增加一个专利申请编写过程也对他们的生产力不会构成很大的消极影响。 而且 这一差别还因为申请专利和专利获批间巨大的时间差进一步加大了。比如微软本周获得的 52 项专利其中很大一部分是其在 06 年到 08 年之间申请的,甚至最早的一项是在 03 年申请的。早在 06 年之前,微软就一直在不断的调配大量的资源申请专利了,而 Google 却刚刚才开始在这方面严肃对待并投放资源。考虑到申请和获批间巨大的时间差,就算 Google 从今年开始向微软般的疯狂开动专利申请机器,它们或许也要到 2015 年才能看到效果。 或许,你认为 Google 可以采取绝招直接避免侵犯微软的专利。但是在软件领域要做到这一点很难。Android 大约有 1 千万行代码,要 Google 将其一一对照看是否侵犯了微软的 18000 项专利几乎是一个不可能完成的任务。而且在微软正式提起诉讼之前,专利侵权的涵义也非常难以界定。因而大部分的硅谷科技公司的常态做法是不采取任何措施避免专利侵权,而是寄希望说当官司真要打起来的时候他们能够有足够的钱雇到好律师。 因此,和其他许多的大型软件一样,Android 不可避免的会侵犯诸多微软的专利。所以你现在看到的微软正和当年的 IBM 一样到处找 Android 设备生产商收取专利侵权费。也正是和当年的 Sun Microsystems 一样,许多公司都乖乖的写下了赔偿支票。 那么最后的结果出来了,财富由创新的科技公司大量的流向了成熟的臃肿不堪的行业巨头。难道没有人会觉得很讽刺吗?因为专利制度原本是用来保护创新者的利益的。看来 北电6000件专利竞购失败的Google 真的是伤不起啊。
个人分类: 创新随想|1478 次阅读|0 个评论
给科学网新的客户端做个广告——Android、iPad、iPhone三版都有
热度 1 sincos 2013-3-25 21:29
希望科学网客户端越办越好。 软件下载地址: http://www.sciencenet.cn/upload/app/
5254 次阅读|2 个评论
[转载]神经网络使人机对话更自然How Google Retooled Android With NN
lixiangdong 2013-2-19 17:22
How Google Retooled Android With Help From Your Brain BY ROBERT MCMILLAN02.18.136:30 AM http://www.wired.com/wiredenterprise/2013/02/android-neural-network/ A picture of the human voice, courtesy the AndroSpectro app. Photo: Ariel Zambelich/Wired When Google built the latest version of its Android mobile operating system, the web giant made some big changes to the way the OS interprets your voice commands. It installed a voice recognition system based on what’s called a neural network — a computerized learning system that behaves much like the human brain. For many users, says Vincent Vanhoucke, a Google research scientist who helped steer the effort, the results were dramatic. “It kind of came as a surprise that we could do so much better by just changing the model,” he says. Vanhoucke says that the voice error rate with the new version of Android — known as Jelly Bean — is about 25 percent lower than previous versions of the software, and that this is making people more comfortable with voice commands. Today, he says, users tend to use more natural language when speaking to the phone. In other words, they act less like they’re talking to a robot. “It really is changing the way that people behave.” It’s just one example of the way neural network algorithms are changing the way our technology works — and they way we use it. This field of study had cooled for many years, after spending the 1980s as one of the hottest areas of research, but now it’s back, with Microsoft and IBM joining Google in exploring some very real applications. When you talk to Android’s voice recognition software, the spectrogram of what you’ve said is chopped up and sent to eight different computers housed in Google’s vast worldwide army of servers. It’s then processed, using the neural network models built by Vanhoucke and his team. Google happens to be very good at breaking up big computing jobs like this and processing them very quickly, and to figure out how to do this, Google turned to Jeff Dean and his team of engineers, a group that’s better known for reinventing the way the modern data center works. Neural networks give researchers like Vanhoucke a way analyzing lots and lots of patterns — in Jelly Bean’s case, spectrograms of the spoken word — and then predicting what a brand new pattern might represent. The metaphor springs from biology, where neurons in the body form networks with other cells that allow them to process signals in specialized ways. In the kind of neural network that Jelly Bean uses, Google might build up several models of how language works — one for English language voice search requests, for example — by analyzing vast swaths of real-world data. “People have believed for a long, long time — partly based on what you see in the brain — that to get a good perceptual system you use multiple layers of features,” says Geoffrey Hinton, a computer science professor at the University of Toronto. “But the question is how can you learn these efficiently.” Android takes a picture of the voice command and Google processes it using its neural network model to figure out what’s being said. Google’s software first tries to pick out the individual parts of speech — the different types of vowels and consonants that make up words. That’s one layer of the neural network. Then it uses that information to build more sophisticated guesses, each layer of these connections drives it closer to figuring out what’s being said. Neural network algorithms can be used to analyze images too. “What you want to do is find little pieces of structure in the pixels, like for example like an edge in the image,” says Hinton. “You might have a layer of feature-detectors that detect things like little edges. And then once you’ve done that you have another layer of feature detectors that detect little combinations of edges like maybe corners. And once you’ve done that, you have another layer and so on.” Neural networks promised to do something like this back in the 1980s, but getting things to actually work at the multiple levels of analysis that Hinton describes was difficult. But in 2006, there were two big changes. First, Hinton and his team figured out a better way to map out deep neural networks — networks that make many different layers of connections. Second, low-cost graphical processing units came along, giving the academics had a much cheaper and faster way to do the billions of calculations they needed. “It made a huge difference because it suddenly made things go 30 times as fast,” says Hinton. Google’s Jeff Dean did the computing work to spruce up Android’s voice recognition. Photo: Ariel Zambelich/Wired Today, neural network algorithms are starting to creep into voice recognition and imaging software, but Hinton sees them being used anywhere someone needs to make a prediction. In November, a University of Toronto team used neural networks to predict how drug molecules might behave in the real world. Jeff Dean says that Google is now using neural network algorithms in a variety of products — some experimental, some not — but nothing is as far along as the Jelly Bean speech recognition software. “There are obvious tie-ins for image search,” he says. “You’d like to be able to use the pixels of the image and then identify what object that is.” Google Street View could use neural network algorithms to tell the difference between different kinds of objects it photographs — a house and a license plate, for example. And lest you think this may not matter to regular people, take note. Last year Google researchers, including Dean, built a neural network program that taught itself to identify cats on YouTube. Microsoft and IBM are studying neural networks too. In October, Microsoft Chief Research Officer Rick Rashid showed a live demonstration of Microsoft’s neural network-based voice processing software in Tianjin, China. In the demo, Rashid spoke in English and paused after each phrase. To the audience’s delight, Microsoft’s software simultaneously translated what he was saying and then spoke it back to the audience in Chinese. The software even adjusted its intonation to make itself sound like Rashid’s voice. “There’s much work to be done in this area,” he said. “But this technology is very promising, and we hope in a few years that we’ll be able to break down the language barriers between people. Personally, I think this is going to lead to a better world.”
个人分类: 科学新闻|1596 次阅读|0 个评论
在安卓平板上运行LaTex、gcc和Python等等等等:)
热度 5 yanxiaoyong 2013-2-6 21:08
过年买了个7寸安卓平板,这玩意有1.6G的CPU,1G的内存,配置比我家那台06年的老笔记本高多了(CPU 1.2G,内存512M),但价格只有当时买这台笔记本的1/10左右,由衷赞叹计算机技术的进步和3c产品的贬值速度:) 这么强的配置,只用来上网打游戏看电影,实在是太浪费了。于是我花了一天时间,把它打造成了一个便携工作站。我平常主要的工作不外乎是看看文献,编编代码,写写论文,这些要是都能在平板上干,很多无聊的时间,比如等车坐车开会听听不懂的报告什么的,就有的打发了。 看文献好办,安卓上的pdf阅读器太多了。我常用的是智器阅读,在手机上就一直用这个,比较方便。美中不足是批注有点小问题,不如ezpdf的批注功能好,但比ezpdf流畅一些,特别是切边和调整亮度功能很实用。我两个都装了,再装个WPS,一般的文档阅读就都没什么问题了。 难点是写代码和latex。一开始装了个c4droid,但gcc怎么鼓捣都装不上,只能写c(c对我来说太繁琐了),被我扔一边去了。python倒是能用(可以装SL4A,支持多种脚本语言),但是只能调用一些android的包,我常用的numpy、matplotlib、networkx等没法安装,不怎么实用。至于latex,android上有个TeXPortal能编译tex文档,但只能在Google Play上下载,我进不去Google Play,只能作罢。 android用了linux的核,但linux下积累的那么多优秀应用在android上都用不了,这让人有点郁闷。好在有牛人们开发了linuxonandroid这个项目(见linuxonandroid.org),能在平板上运行ubuntu!这个有点厉害,赶紧下载一个,照着http://android.d.cn/news/4018.html里的方法装上,再在ubuntu里apt-get上texlive、gcc、mono-gmcs以及各种python的包。呵呵,现在这个平板不仅能编程,还能写论文呢,正儿八经的………… 后面是一些技术细节,供感兴趣的朋友参考。 1、系统必须得获取root权限,这个不同机器的root方法不同,网上一般都有教程,照猫画虎,几分钟就能搞定。(当然也可能几分钟就变砖,看rp了) 2、ubuntu的安装步骤参考http://android.d.cn/news/4018.html,很详细。但有一些需要注意的地方,linuxonandroid上的ubuntu有三个版本:core,small和full,分别是无X桌面,LXDE桌面和Gnome桌面的。其实干上面的这些事情并不需要启动X,命令行下就足够了。但是core版本的映像文件里剩余空间只有400m,根本不够装texlive的(texlive实在太庞大了!就没人出个精简版的?),所以要编译latex至少得下载small版本的,这个剩余空间有1G。但full版本实在没必要装,我连VNC viewer都没装,就没想着在平板上运行ubuntu的图形界面。因为上网、娱乐方面的应用,android已经做得足够好了,这方面ubuntu并没有任何优势。 3、http://sourceforge.net/projects/ubsh上的ubuntu.sh脚本有点小问题,第17行then前边多个空格,运行的时候会报错synatx error: 'If' unmatched ,删掉这个空格就行了。bootscript.sh里也有点小问题,在我机器上退出ubuntu时显示不能卸载某些设备,原因是我的busybox里没有lsof这个命令,但ubuntu里有,所以只要把228行的注释换到229行就行了。 4、进入ubuntu时,先在终端模拟器里su,再sh /sdcard/ubuntu/bootscript.sh。而退出ubuntu时一定要用exit,不要直接关闭终端模拟器,那样做会导致sdcard无法卸载,往PC上连平板时会无法挂载SD卡,必须得重启android才行。所以,正确的做法是敲exit,然后耐心等5秒(可以修改bootscript.sh的第230行,sleep 5是等5秒,少一点似乎也没事,我改成2秒了)。 5、ubuntu根目录下有一个sdcard目录,这个目录和android是共享的,代码文件可以存放在里边。然后,在android里编辑代码,保存后在ubuntu里编译,挺方便的。 6、代码编辑器我用的是droidedit,支持C、C++、C#、Python和latex代码的语法高亮显示(还支持很多其他的语言,不过我只用这几种),比较好用。当然,也可以用ubuntu里vi之类的编辑器,但我不会,就不说了。 7、编代码,找一个好的输入法太重要了!太重要了!因为,输入的符号实在是太多了!太多了!我机器里预装的google输入法,输入符号实在是痛苦,特别是每次输入{ }都是一个巨大的挑战,需要按三次切换键才能找到它们!我试用了好几个输入法,最后发现还是百度输入法for pad版最好用!这个输入法有两个非常nb的地方:第一、他的符号不是固定在键盘上的,而是根据使用频率动态排序的,这样常用的符号一般切换一次就能找到;第二,这个输入法带方向键,用linux的人都知道上下方向键的重要性,省太多事了!不过百度输入法的缺点是,竖屏时拼音是9键的,让我有点不习惯,好在编代码时也不怎么输入汉字。 8、我的ubuntu里,xetex编译有点问题,总是不成功,但pdflatex是好用的,latex+dvipdf也没问题。另外,由于只有1G的自由空间,我只装了texlive基本包,publisher之类的扩展包都没装,投哪个期刊就去下载它们的模板文件吧。 9、编译matplotlib时一定要记着加dAgg选项,类似这样:python plot_demo.py -dAgg,不然不能成功出图。出图建议用pdf格式,因为我不知道在android上怎么打开eps格式的图:) 其他的,想起来再说吧。安装或运行有问题的,别来问我,内事不决问百度,外事不决问周瑜吧 %¥@#*…
个人分类: 资源共享|31585 次阅读|10 个评论
当当上买了三本入门书
lixiangdong 2013-1-4 11:42
今天买了三本书: 1)机器学习,米歇尔Mitchell著;曾华军等译,机械工业出版社,2008年 2)统计学习方法,李航著,清华大学出版社,2012年 3)Android从入门到精通(配光盘),明日科技编著,清华大学出版社,2012年 都是入门的书,先看看。电子书总是看几页就给忘接着看了。 看了当当全年的订单,将近2000元。
个人分类: 机器学习|2728 次阅读|0 个评论
StartOS让人很失望......
Toapollo 2012-12-8 04:10
因为研究的需要,准备从Windows迁移至Linux,先后仔细对比了许多版本,凭着对YLMF莫名的好感,刚开始很为StartOS心动的,但在仔细查阅了相关的说明之后,对StartOS很是失望,个人认为,StartOS正在沿着一条错误的道路前进: 1。Linux最大的优点是稳定、高效、安全,在个人娱乐性或易用性方面它是很难与Windows、Mac OS、Android等抗衡的,而StartOS把这一点作为出发点(或最大的卖点),此为定位失败。想象一下,对于无什么基础的人,无论StartOS的界面有多炫,它需要的技术门槛仍然远高于其他几个操作系统。对于小白(比如本人之类的),一旦出现问题往往就是灾乱性的,迁移的成本太高。而对于应用牵引型(亦或如本人或有一定的基础的人),迁移成本更是不可估量,得不偿失,原因如下2。 2。众所周知,Linux最流行的文件包格式是红帽的rmp和大便的deb,各有千秋,不相上下。StartOS不支持这两个目前最重要的文件包格式,而是另起炉灶搞了一套,等于就是放弃了前人所有成功的经验,要想重新建立全面的软件包库并经过大量反复的检验,绝非短期之功。为了应用而迁移Linux的人,如果选择StartOS,最终发现什么重要的工作都做不了,前期投入几乎都成无用功,还得重新选择其他的版本,懊恼之情可想而知。 3。用户群基数太小,生态环境恶劣。不是因为刚起步的原因,而是因为自我封闭。对比目前流行的几大操作系统版本,都有无数的程序员在围绕着它们做各种各样的开发,支持的软件群体数量决定着软件生态,决定着未来,Windows、Mac OS、Android等无不各尽所能吸引开发者加入。StartOS一开始就选择了自我封闭,单靠一己之力想成就一个软件生态,难以想象!现在早不是苹果、微软发家的时候了。 简而言之,StartOS易用和全面支持性不如目前流行的Ubuntu、Mint等,稳定和可靠可性不如RH、SL、CO、GT等,仅剩中文支持做卖点,如不更改技术路线,失败恐怕是早晚之事,只可惜了当年的YLMF了...
个人分类: 计算机软件|7896 次阅读|0 个评论
[转载]SD卡分区
gosci 2012-11-19 10:51
最近折腾android系统比较多,也有了些心的,故有了这篇文章。   android的swap分区与linux相同,都是用于数据交换的,类似于windows上的虚拟内存。合理设置swap能提升系统的速度,降低系统因内存不足而关闭后台程序的频率。但如果设置不当,反而会拖慢系统速度,影响使用体验。   本文就从android内存管理机制出发,介绍合理设置swap的方法。由于本人并不是开发者,对android的内存管理机制的理解可能有偏差的地方,欢迎指证,废话不多,lets go。   一、android的内存管理机制   我们知道android的程序都是没有关闭键的,所有大部分程序推出后还是有一部分数据驻留在内存里。但内存不可能无限大,打开程序一多,又都不完全退出,时间一长,再大的内存也是不够用的,更何况hero的可用内存仅192mb(总内存288mb,96mb被radio占用,另外的192mb系统可用),去掉os占掉的部分,真正可获得的内存不到140mb,随便用用,内存就耗完了。   当系统内存不足时内存管理机制就开始起作用了,会在程序列表里选择长时间空闲的程序予以关闭,以保证系统的运行速度。这种机制在大部分时间里都运行得不错。但有些比较让人恼火的地方在于,并不是所有的程序被关闭时都保存现场的,比如浏览器。   在最坏的情况里,你正在浏览器里更新你的博客,这时突然来了个电话,打完电话后你发现浏览器因为内存不足而被强制关闭了,当你再打开浏览器时,赫然出现的是浏览器主页的时候,那真是叫天天不应,叫地地不灵了。当然这种情况不会经常发生,即便发生了有时你的损失也仅仅是那些打开的标签页,但这种问题是切实存在的。   二、什么是swap?swap有什么用?   前文说道,swap分区类似于windows的虚拟内存,是将sd卡上的空间作为系统内存的补充。它的优缺点也跟虚拟内存类似,可以让系统同时运行很多的程序或者对内存需求更大的程序,但读写的速度大大低于物理内存。   由于sd卡的速度较慢,在卡内的swap主要作用是建立一个交换空间,当有较大内存需求的软件(如电话、相机等)突然运行时,可以将后台程序先暂存在swap分区里,待该软件使用完毕,内存又有空余的时候,再将swap内的程序数据转到内存里,以降低程序被关闭的可能。    有一点需要注意的是,开启swap后,并不是说程序不会被关闭了,而是说被关闭的几率变小了。   三、给sd卡分区   使用swap的花需要给sd卡分区,1.5.2的RA Recovery就自带给sd卡分区的功能,直接选择Partition sd,并一路按home即可。   recovery主界面,选择Partition sd即可对sd卡进行分区   在子菜单里,选择Partiton SD即开始对SD卡分区操作   第一个Swap-size的大小即Swap分区的大小,可用上下音量键调节大小,设置为0即不分此分区。一般使用默认即可。   第二个Ext2-size即ext分区的大小,用来将程序装在卡上,也可以用轨迹球上下滚动调节大小,一般也是默认即可。   分区完成后,选择ext2 to ext3升级拉的文件系统,以加快卡的读取速度。    注意不要升级到ext4分区,1.5.2的recovery对ext4的支持不好,会导致手机无法通过nand备份和恢复系统,所以只要升级到ext3即可   升级结束后,选择reboot system now重启系统即可。    swap分区不宜过大,因为sd卡的读取速度实在太慢,设置太大的话,会有太多数据滞留在卡内,拖慢慢系统速度。    笔者曾经就设置过288mb的swap,应用程序是很少关闭了,但使用时间一长,会导致机器卡到完全无法操作,因为太多数据滞留在SD卡里,SD卡的读卡速度是系统的最大瓶颈,这时必须手动关闭程序释放内存才能正常使用,这样就得不偿失了,所以大家还是要按照自己的使用需求,合理设置swap大小和swappness的数值。 recovery2.0版本 其他版本请绕道! 1、Reboot system now ——重启 2、USB-MS toggle ——在recovery 模式下直接连接USB而不需要退出该模式 3、Backup/Restore ——备份和还原 3-1、Nand backup——Nand 备份 3-2、Nand + ext backup——Nand 备份(系统 和ext 分区一同备份) 3-3、Nand restore——还原(就是还原3-1、3-2 的最后一次备份) 3-4、BART backup——BART 备份 (包括系统和ext 分区) 3-5、BART restore——还原最后一次的BART备份 Nand 备份类似于系统的备份 而BART 则像是PC 上ghost 的备份。 Nand 备份 它不会备份ext 分区(就是第二分区 没有分区的可以不管这个) 所以你的如果app2sd 了 那么装在第二分区的程序用Nand 恢复是办不到的 BAR T则可以备份到ext 分区 用BART 恢复则可以恢复整个系统 可以使它和你备份前一模一样,不会有一点文件信息的丢失(包括联系人、短信、图片、影音等,所以如果你装的东西比较多,那么备份和恢复会比较慢) 4、Flash zip from sdcard——从sd卡根目录的.zip ROM 刷机包刷机 5、Wipe ——清除 5-1、Wipe data/factory reset——清除内存数据和缓存数据 5-2、Wipe Dalvik-cache——清除缓存数据 + ext 分区内数据 5-3、Wipe SD:ext partition——只清除ext 分区内数据 5-4、Wipe battery stats——清除电池数据 5-5、Wipe rotate settings——清除传感器内设置的数据 6、Partition sdcard ——分区sd 卡 6-1、Partition SD——自动为sd 卡分区 6-2、Repair SD:ext——修复ext 分区 6-3、SD:ext2 to ext3——将ext2 分区转换为ext3 分区(推荐) 6-4、SD:ext3 to ext4——将ext3 分区转换为ext4 分区(C4 卡不推荐,C6 卡推荐) 7、Other ——其它 7-1、Fix apk uid mismatches——修复apk 程序 7-2、Move apps+dalv to SD——移动程序和虚拟缓存到sd 卡(这个可不是 app2sd) 7-3、Move recovery.log to SD——移动刷机日志文件到sd 卡(执行此操作后,sd 卡根目录会出现一个“recovery.log” 文件 即为刷机日志文件) 8、Power off ——关机 用到以上大红部分! PS:分区后卡上内容全部丢失! 请在分区前备份需要备份的! PS : 沒分过区。或者新卡 请直接跳到第二步!!! 用读卡器把卡插在电脑上 1.右击我的电脑 管理磁盘管理找到可移动磁盘删除以前的EXT2或者3/4分区 电脑上这时显示的是未知分区!. 2.打开我的电脑 找到可移动磁盘 格式化选FAT32默认! 3.然后到把卡装回手机!先不开机 关机状态下,同时按住 "电源键"+"音量-",开机进入boot loader模式,选中进入recovery。 4.滑动光感键,选 Partition sdcard 进入SD卡分区界面。(有人在问光感键是什么- -!就是G7 下面一排按键 第三个键 圆的 中间黑黑的 手指在上面轻轻滑动就好) 5.继续选中 Partition SD 6.首个进行Swap-size,swap分区的大小,建议选取0MB。 7.继续选Ext2-size:建议1024MB。此分区将会成为第二分区。 8.一碗茶功夫分区完毕,返回到如图的界面,然后再依次选中 SD:ext2 to ext3 , SD:ext3 to ext4。 9.手动升级可免除一些意外发生,建议不要节省ext2升级到ext4的步骤。(其实EXT3也很好) 完成后 返回到主页面 Power off ——关机 把内存卡用读卡器插电脑上这时候沵的卡容量小了刚好1GB (EXT格式在win XP/7/2003 下是显示不出来的!) 把重要的东西复制回去 如果沵要重新刷机.开头的文件夹可以不要了!
个人分类: 杂项|574 次阅读|0 个评论
[转载]Android下结束进程的方法
mafei863 2012-11-13 06:27
Android下结束进程的方法 http://blog.csdn.net/ramondlee/article/details/6840161 2011-10-02 10:35 337人阅读 评论 (0) 收藏 举报 Android下结束进程的方法   最近在做一个类似与任务管理器的东西,里面有个功能,可以通过这个管理器结束掉其他的进程。   在Android平台下,结束进程的方法还是比较多的。首先指明,此处的“结束进程”,包含了结束自身进程和结束其他进程两个方面。通过查阅SDK文档和网上的一些资料,自己找到一些结束进程的方法。在这里做一些归纳和总结,文章的部分信息有可能来自网上已有的文章和帖子,由于过了比较长时间,所以若发现本文与其他文章雷同,请谅解。 一、结束一个活动Activity   要主动的结束一个活动Activity,( 先强调一下,是结束一个活动,而不是进程 )众所周知,肯定是finish方法啦,这个就毋庸置疑了,而且这个方法最后会调用Activity的生命周期函数onDestroy方法,结束当前的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish系列方法,我们不在这里做详细讨论,有兴趣的同学可以自己查阅一下SDK 的文档。 二、强制结束当前的进程   强行结束当前进程有两个方法。(呵呵,这里就是结束进程了)   1、killProcess(int pid) 例子: android.os.Process.killProcess(android.os.Process.myPid());   对于这个方法,需要详细解释一下。在SDK的文档中,解释如下: Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes. 英语不好,不能准确翻译,所以希望大家自己理解,免得对大家造成误解。我个人对这句话的解释就是,这个方法使用是有条件的: a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中; b、将被杀掉的进程 是由当前应用程序所创建的附加进程; c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)   2、 System.exit(int code) 例子: System.exit( 0 );   该方法只能用于结束当前进程自身,个人觉得在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。   需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候! 三、结束另一个进程   要通过一个进程去结束另一个进程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc. ),所以建议大家使用一个新的方法:    void killBackgroundProcesses ( String packageName)   由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。 四、退出到主屏幕(记得是对当前进程的处理)   这个方法,也是退出当前进程的一个方法。如果我们在进程中创建了很多的Activity,但是又不想关闭时去退出不在任务栈顶的Activity,那么就可以直接使用这个方法了。这个方法是通过查阅网上资料看到的。在此先感谢 追梦人 了(他的博客地址: http://www.cnblogs.com/yunfei181/archive/2011/01/24/1943128.html ,欢迎大家去看看他的博客)。 功能:当按下返回键时,就返回到主屏幕,并带有参数FLAG_ACTIVITY_CLEAR_TOP,会清理掉当前的活动。 1 @Override 2 public boolean onKeyDown( int keyCode, KeyEvent event) { 3 if (keyCode == KeyEvent.KEYCODE_BACK event.getRepeatCount() == 0 ) { // 按下的如果是BACK,同时没有重复 4 Intent home = new Intent(Intent.ACTION_MAIN); 5 home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 6 home.addCategory(Intent.CATEGORY_HOME); 7 startActivity(home); 8 } 9 return super .onKeyDown(keyCode, event); 10 }   此方法确实结束了当前进程,但是通过Android平台的App Manager工具去查看的话,使用2.3.3的模拟器,会发现刚刚被结束的进程会以Cached background Process的形式存在,并且模拟器给出了解释,说是为了下一次更快捷的启动这个进程。
个人分类: Android|2557 次阅读|0 个评论
2013:告别MSN,告别苹果,告别鼠标
热度 3 sunsong7 2012-11-10 21:31
2013:告别MSN,告别苹果,告别鼠标
几年前,MSN曾是白领阶层钟爱的即时通讯工具,如今小绿人凄然躲在QQ和微博身后哭泣... 几月前,苹果还让果粉疯狂不已,如今iPad越做越小,iPhone的脸越拉越长,iOS越来越不争气... 几天前,有尾巴没尾巴的鼠标还在桌子上乱窜,如今却正在被Android,Windows 8无情抛弃了... 【相关报道】 告别小绿人:微软确定将停止MSN服务 微软于本周二证实,将于2013年第一季度以Skype替换MSN,后者将停止服务。Skype CEO托尼·贝茨表示,全球各国都将停用MSN,但中国大陆除外。不少网友先行送别MSN,其中有不舍,也有的是恨其不争。   “MSN再见,回忆再见,请加我的QQ和微博。”昨日,在部分网友获知微软即将在明年第一季度关闭MSN,将业务转移至Skype后,不少国内用户纷纷在自己的MSN状态栏标注新的联系方式,以转移人脉关系。为此,昨日午后,MSN中国发出郑重声明称,MSN中国产品并不会整合,服务也不会受到任何影响。   从7日凌晨微软宣布在全球内将暂停MSN服务开始,一些MSN粉丝或老用户们就纷纷发布帖子、博客,纪念这一在中国走过了7个年头的即时通讯产品“元老”。“在当时电脑和互联网还未像今天这般普及,以至于一看到谁名片上印着MSN的账号,就觉得此人很‘高级’。当时坐办公室的白领每天上班前三件事——开电脑、倒茶、上MSN。”一位网友很不舍地说道,在她看来,MSN似乎代表着一种回忆,还有一种习惯。   不过,虽然MSN即将在全球成为过去式,但是中国除外。对此,昨日MSN中国发出声明以撇清这场“惜别”的误会。MSN中国表示,在中国市场,MSN产品将不会发生整合,服务不会受到任何影响。此外,即便用户的海外好友已经使用了支持MSN账户登录的Skype,中国的MSN用户依旧可以正常和海外好友保持通话。   不过记者昨日发现,尽管MSN中国还在为了保住市场而努力,但依旧有一部分网友准备将MSN上的好友资源进行转移。 http://jingji.cntv.cn/2012/11/09/ARTI1352425805032309.shtml 果粉致信苹果CEO宣布告别苹果产品 Sky News金融编辑、The Real Economy一书作者Ed Conway在自己的博客中写给苹果公司CEO蒂姆·库克(Tim Cook)的 一封公开信 成为 热门话题 。Conway批评了苹果公司的最新产品,并宣布“亲爱的苹果,我要离开你”。这封公开信被Business Insider 转载 后,点击量接近19万次。 他在信中说,自己从10几岁时就开始与苹果相伴,但苹果最新的iOS6非常糟糕,新应用软件也十分垃圾。他问道,“苹果三年前推出 iPad之后还推出过什么新产品吗”,并说,iCloud功能十分复杂,且没有dropbox好,而FaceTime和Skype相比稍显逊色。特别是 iMessages是让人烦心的,浏览器Safari也没有Chrome或Firefox好用。 http://www.cnbeta.com/articles/212977.htm 苹果的沦落 http://dzh.mop.com/whbm/20121110/0/O8g5SzI2b0031aF5.shtml 苹果说:我的CPU高,小米笑了! 苹果说:我的质量好,诺基亚笑了! 苹果说:我的超时尚,魅族笑了! 苹果说:我的音乐效果好,索爱笑了! 苹果说:我的屏幕分辨率高,三星笑了! 苹果说:我的机身薄,摩托笑了! 苹果说:我的功能强大,山寨机笑了! 苹果说:我的价格最贵,大家都沉默了..... http://tieba.baidu.com/p/1819963878 鼠标或成过去式 笔记本迎来触摸式变革 http://www.enet.com.cn/notebook/ 2012年10月18日11:30 来源:中关村在线 !--字号:小 | 大 【文章摘要】Windows 8 操作系统已经蓄势待发,而各大品牌厂商也开始积极推出带有触控功能的创新性变形笔记本。由于 Windows 8 最核心强调的就是触控设计,因此也激发了触控市场的活跃度。随着全球首款可翻转 360° 的 Yoga 超极本发布后,不少用户已经开始将购机的重点放在了变形触控本上,Yoga 13 目前的售价是 6999 元,相比超极本去年上市的平均价格实惠不少。   Windows 8 操作系统已经蓄势待发,而各大品牌厂商也开始积极推出带有触控功能的创新性变形笔记本,最近的一些新品消息无一例外也都围绕触控变形大做文章。由于 Windows 8 最核心强调的就是触控设计,因此也激发了触控市场的活跃度。 随着全球首款可翻转 360° 的 Yoga 超极本发布后,不少用户已经开始将购机的重点放在了变形触控本上,Yoga 13 目前的售价是 6999 元,相比超极本去年上市的平均价格实惠不少,但这个价格相信并不是大家最终能欣然接受的。   那么最终什么样的价格区间才能打动消费者呢?会不会像超极本那样一年后会有大幅下调的空间? 据了解,目前市场预估 2013 年触控笔记本出货将有大幅增长,全年渗透率可上升 15%,市场出货规模约 3000 万台。触控笔记本相关供应链包括品牌厂宏碁、华硕、布局触控的仁宝、纬创、以及面板及触控零组件的友达、奇美电、F-TPK、胜华、IC 设计义隆电、禾瑞亚,这些代工厂商也将在 Windows 8 的带动下获利。 触摸本如何改变 PC 未来   此外,品牌厂商透露,英特尔近期向品牌厂提供一份市场调研报告,指出北美消费者愿意多花 100 美元采购触控笔记本,微软在 Win8 营销策略也会主打触控笔记本和变形平板,凭借触控方面的优势来游说品牌厂一同推广触控笔记本。 因此,包括之前持反对意见的宏碁也将在首批 Win8 推广期内推出 3 个系列的触控笔记本;联想也已在 12 日上海举行的发布会上连推四款全新变形本,亮点均已触控为主。其中 Yoga 和 Twsit 两款触控笔记本将成为今后的主要卖点。 · 到底贵在哪?触摸屏机型成本独家揭秘    触控本贵在哪里? 这个问题其实就是触控屏本身造价高所导致的。 品牌厂商指出,目前简单估算 1 英寸触控感应器的成本约 3~4 美元,再加上保护玻璃、LCD 面板等,以主流 13.3 英寸笔记本为例,BOM 表成本约增加 50~60 美元,到了终端售价约增加 100 美元。同样是购买一款笔记本,如果使用触控面板,消费者就将多支出 600~800 元,这对于主流用户群还是有一定负担的。因此市场推估 13 英寸触控笔记本市售价约落在 800 美元以上,价格略微偏高,短时间触控本下调到 5000 元以下还不太可能。 触控本价格为何高?   目前再加上 Windows 8 在 10 月底上市,今年仅剩 2 个月可销售,而且大家对 Windows 应用软件程序匮乏的问题较为担忧,消费者大都会先观望后才下手,因此触控笔记本膨胀期会在明年体现,预估占整体笔记本出货比重 1~1.5 成,全年出货量约 2000~3000 万台。   据悉,为了因应触控笔记本的需求,代工厂仁宝及纬创去年就已布局单片玻璃式触控面板(OGS),OGS 将成为明年触控产业的主导技术方向。OGS (One Glass Solution),即一体化触控)的好处有三点:(1)节省了一层玻璃成本和减少了一次贴合成本(2)减轻了重量(3)增加了透光度。OGS 能够较好的满足智能终端超薄化需求,并提升显示效果,是明年高端品牌终端的必然选择。 先化强再切割的 OGS 制程   造成触控本价格高的主要原因还是贴合率的问题,目前大尺寸触控屏的贴合良品率为 60%~70%,最大的“杀手”就是气泡所导致的。只有贴合良品率上升至 80% 以上,整体的价格才会降低。预计明年下半年将有一批低价产品推向市场,消费者所购买到的触控本有望下调 500 元左右。   大厂仁宝表示,今年 9 月已针对触控笔记本开始出货,预估 2013 年第 1 季的产能利用率将达到 40~50% 。另外,纬创表示,负责触控的泰州厂已在打样投产,今年底将开始交货。此外,随大尺寸触控应用提升,触控零组件厂明年业绩相对有支撑,触控模块的 F-TPK、胜华、友达、奇美电受惠最深,其它还有 IC 设计义隆电、禾瑞亚等,其中义隆电的触控芯片已获宏碁、联想等品牌采用。 · 鼠标键盘被奚落,多点触控屏已成主流   从上述的各种新闻和行业走势来看,触控屏在今后用户的终端使用中作用会越来越凸显,传统笔记本并不完全依赖屏幕,屏幕只是用来观看和获得信息的一个部件,物理键盘也分担了不少录入的操作。然而 Windows 8 触控笔记本却将用户手指转移到了屏幕上,更多操作将以点击、滑动、拖拽等等手势代替鼠标功能。未来所有的操控动作将会慢慢远离物理键盘和鼠标,触控屏会彻底改变用户的使用习惯。   下面我们来了解一些关于触控屏的小知识,对大家今后使用触控本时会有所帮助的。 目前触控技术可谓是五花八门,除了 in-cell 技术来势汹汹外,薄膜式(Film Type)架构以及单片玻璃式(OGS)都将大幅应用于智能移动设备以及笔记型电脑领域,整体触控产业将朝更多元的模组架构发展。 苹果 iPhone 采用的 in-cell 面板   当前智能手机中,玻璃式电容最主要的代表品牌就是 Apple,除了苹果 iPhone 选择双片玻璃式触控模组外,绝大多数产品都采用双片薄膜式架构, 采用薄膜式电容的典型就是 Samsung。 薄膜式投射电容触控面板阵营由于可拥有较低的成本,待 Windows 8 普及之后,无论 AIO PC 还是 Ultrabook,几乎均采用了投射式电容触控面板,多点触控的最佳选择方案应当会落到薄膜式投射电容触控技术上。 英特尔已经宣示将与台湾几家投射式电容触控面板大厂宸鸿、达鸿、胜华及和鑫合作对于投射式电容的传感器结构。   相较于过去的 Windows 操作系统版本,整合触控功能的 Windows 8 可以说是最大突破点。升级 Windows 8 之后,除触控点增加到至少 5 点、一般需要 10 点外,针对应用的各项触控特性标准也更加严格,因此投射电容触控技术的应用是必然选择。在原有的笔记型电脑上加上触控功能,除了整机重量不能增加太多外, 更重要的当然是成本不能提高太多,在这样的条件下,结构相对单纯的单片玻璃式触控面板自然更符合品牌客户的需求。 多点触控屏已经成为趋势   无论是超极本还是变形后的触控本, 价格依然是消费者考虑的重点,这也是新产品是否让大家快速接受的最直接因素。从产业链的角度看,触屏成本是 Windows 8 触控板广泛普及的瓶颈。大家可以对比发现,变形触控本刚一上市,似乎吸取了超极本推广不利的经验教训,初期定价并未高得让人却步,而是更加亲民的拉到了 7000 元以内,这个价位虽 然比目前主流超极本高出 2000 元左右,但比起第一代超极本当时的价格显然要更有诚意。同时也从一个侧面表明触控本占有市场的迫切性。    坦白地讲,联想 Yoga 所处的价格段的确已经让不少想尝鲜用户心动了。不过笔者个人认为,今年并不是入手 Windows 8 变形触控本的最佳时期。主要原因有两个方面:一是 Windows Store 应用商店,目前支持中文应用程序还并不丰富,尽管微软乐观的认为 90 天之内提供 10 万个 Windows 8 应用,但还需要大家耐心等待 3 个月时间。二是就是价格问题,尽管目前 7000 元对于预算充足的用户是可以接受的,但是主力消费群更愿意考虑价格更低的超 极本产品,大都对变形触控本持观望态度。当然,如果可以控制在 5000-6000 元,相信有不少消费者会为之买账。 · 鼠标未来会消失吗?看孩子们都在用什么   图形界面的产生是人机界面发展上的里程碑,计算机的易用性因此大大加强,真正走向了大众。与图像界面相伴而生的,就是我们最熟悉的计算机配件:鼠标。不过,随着平板逐渐走向主流化,传统的 PC 市场正在萎缩。Windows 8 的到来是一个标志性事件,PC 厂商开始在曲折中转型,微软推出的 Surface 平板可以看做是一种指导性产品。   为了方便起见,我们不妨以生产力工具为标准来区分 PC 和平板,平板应该是便携的(7 寸、10 寸)、触控导向的(虚拟键盘、无鼠标,这与便携性也相关);而 PC 应该是适合工作的(13 寸、14 寸)、效率导向的(物理键盘、鼠标,便携性上的妥协,换取了精确的操作和手感)。以此为基点,我们可以判断,做为生产力工具的 PC,将会逐渐成为少数专业人士手中的工具。   那么,曾经与 PC 相随相伴的鼠标,是否也会从大众的手中逐渐消失?近日,华盛顿邮报针对这个问题,进行了一些采访:在圣何塞地区的一家学校里,平板已经成为学生们常用的学习工具。5 年级学生 Josephine Nguyen 在 iPad 上查找动词的意思,手势飞快划过屏幕,其它的学生同样在平板上做着类似的事情。在高科技的学习氛围中,没有鼠标的存在。   10 岁的 Nguyen 说自己使用过鼠标,但是桌面电脑/屏幕/键盘/鼠标的组合显得过于笨重了。“它很慢”,她回忆说,“而且部件太多了”。6 岁的 Gilbert Vasquez 则对一个以“老鼠”命名的外部点击设备感到困惑。“我不知道那是什么”,他耸耸肩说。投资研究机构 NeedhamCo 的分析师 Charles Wolf 告诉华盛顿邮报,从今年秋天开始,iPad 第一次开始蚕食 PC 在学校的销量,另外,与计算机交互的新方式,比如 Leap Motion、可以读取手势的 Vaio 笔记本以及语音辨识服务(Siri)已经开始在商业市场获得进展。 鼠标未来会消失吗?   John Underkoffler 是 MIT 前研究员,他曾设计过《少数派报告》中著名的手势界面。在他看来,计算机交互方式的转变不可避免。现在,UnderKoffler 是 Oblong 公司的首席科学家,为计算机系统构建手势控制界面。他说,几十年来,鼠标是通向虚拟世界的主要桥梁,而这并不总是最优的方式。“如果你能够向在物理世界中一样,将人类的双手和声音运用到电子世界,那将是非常有表现力的”他说,“如果你抛开鼠标这个塑料块,你将能够以非常不同的、高带宽的方式,在自身和机器之间传输信息”。   1963 年,第一个计算机鼠标由 Douglas Englebart 和 Bill English 在斯坦福研究院完成。Englebart 的女儿 Christina 说,她的父亲曾预测过许多科技趋势,但是他所感到惊呀的是,鼠标竟然持续了这么长时间,“他从未想过那会是鼠标。他经常想的是,会有新的方式来探索计算机”。当 Englebart 发明鼠标的时候,Christina 8 岁。如今,她已经 57 岁了。她说自己终于瞥见计算机的下一步了。她的两个孩子已经不再使用鼠标。   距离 Englebart 发明鼠标的研究院不远处,是 San Antonio 和 LUCHA 初等小学。这里的学生配备的是 iPod Touch 和 iPads,教师们使用的是带触控板的 Macbook Air。“这里的许多孩子从未见过计算机鼠标”,San Antonio 一位幼儿园老师这样说。四岁的孩子使用 iPod Touch 学习单词发音,年龄较大的学生使用 iPad 学习,或准备多媒体演讲稿。初等小学的校长说,触控界面的直观使低年龄段的孩子也可以使用计算机,这在过去是不可能的。   John Underkoffler 认为,桌面计算机激活孩子的语言和抽象思维能力,而新界面则帮助他们打开了空间思维,“一旦用户界面开始以那种方式和我们交谈……从某种程度上说,我们在如何学习上实现了突破”。这或许可以解释,为什么 iPad 在学校如此受欢迎。San Antonio 初等小学在去年的时候,开始了 3 万台 iPad 和 iPod 的实验,根据学校董事会主席的说法,他对实验的结果感到满意,学生的成绩上升,而学习的热情也增强了。   现在,学校在考虑如何处理手中大量的桌面电脑,是否需要教授学生在屏幕上移动光标。“事情发展的非常快”,LUCHA 的校长说,“我们无法确定,当他们成长到可以真正使用计算机和鼠标的时候,这些东西是否还会存在。”虽然无法确定这种趋势何时能够扩展开来,但是新的交互方式消灭鼠标,可能比我们想象的要早。当孩子们伴随着平板长大的时候,他们对人机交互方式的理解已经和我们截然不同。这将是脱离鼠标的一代人。 http://www.enet.com.cn/article/2012/1018/A20121018176811_4.shtml 苹果好?还是小米好? 小米2 于2012年8月16日发布:4.3 吋屏(1280*720),四核处理器,主频1.5GHz,搭配2GB RAM,16GB ROM,800万像素摄像头。 iPhone5 于2012年9月13日发布:4吋屏(1136*640),双核处理器,主频1.2GHz,搭配1GB RAM,16GB ROM,800万像素摄像头。 苹果小米粥简介 1、小米具有益肾和胃、清火的作用,对脾胃虚热、体虚的人有益,也是很好的安眠的食品。 2、苹果有调整肠胃之作用,对治疗便秘颇有功效。同时,苹果中的果胶能防止胆固醇增高,减少胆结石发生的几率。皮肤过敏时,用去皮的苹果片轻轻磨擦即能改善。 3、此款粥对改善食欲不振、身体消瘦有一定的功效。 http://www.haodou.com/recipe/241903
5042 次阅读|3 个评论
Android系统和linux内核的关系详解
andrewwang 2012-10-25 21:40
Android系统和linux内核的关系详解 大家都知道Android是基于Linux内核的操作系统,也曾经和Linux基金会因为内核问题产生过分歧( 可以参考本文 后面的“参考阅读”)。这里主要对android和linux的关系进行分析,参 考http://www.itbenet.net/Article/HTML/1344.html。但对其中的部分观点不敢苟同,做了一些修改如 下。 虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了 自己所特有的驱动程序。下面我们就来分析一下它们之间究竟有什么关系? 一、Android为什么会选择Linux 成熟的操作系统有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,这也是很多 教材反复讲到的linux的重要特点。比如: 1、强大的内存管理和进程管理方案 2、基于权限的安全模式 3、支持共享库 4、经过认证的驱动模型 5、Linux本身就是开源项目 更多关于上述特性的信息可以参考Linux 2.6版内核的官方文档,这便于我们在后面的学习中更好地理解Android 所特有的功能特性。接下来分析Android与Linux的关系。其实实际上选择linux内核的手机系统很多,记得前几年 就见过三星的一款linux内核的手机,并且那款手机保持了linux系统的大部分特征,所以用起来感觉就像一个小巧 的linux系统。 二、Android对Linux的改动 原文作者说是“Android不是Linux”,关于这个观点,要看读者自己怎么看了,如果说Linux是说的内核,那 Android自然不是Linux。如果Linux是指Linux发行版,那Android当然是Linux,否则ubuntu,Fedora等都不是 linux了。 Android对linux系统的改动主要有以下几个方面: 1.它没有glibc支持 由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为 C库,而是Google自己开发了一套Bionic Libc来代替glibc。 2.它并不包括一整套标准的Linux使用程序 Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM 构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统(如果学习了嵌入式的话就会知道yaffs2 FLASH文件系 统已经在基于linux的很多嵌入式设备上采用了,技术已经非常成熟)等。 3.它没有本地基于X服务的窗口系统 什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统 的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统(对原作者的这个观点不是很赞 同,原文章这一点放在第一条,并说“这是Android不是Linux的一个基本原因”,这个不敢苟同,由于作者 没有 指明android用的什么显示系统,我也不好说)。 4.Android专有的驱动程序 除了上面这些不同点之外,Android还对Linux设备驱动进行了增强,主要如下所示。 1)Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。 2)Android电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做 了很多优化。源代码位于: kernel/power/earlysuspend.c kernel/power/consoleearlysuspend.c kernel/power/fbearlysuspend.c kernel/power/wakelock.c kernel/power/userwakelock.c 3)低内存管理器(Low Memory Killer) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要 杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。 4)匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于 mm/ashmem.c。 5)Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物 理内存上。源代码位于drivers/misc/pmem.c。 6)Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于 drivers/staging/android/logger.c。 7)Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于drivers/rtc/alarm.c。 8)USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框 架的。源代码位于drivers/usb/gadget/。 9)Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备 里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。 10)Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于 drivers/staging/android /timed_output.c(timed_gpio.c)。 11)Yaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。 Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比, Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表 现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。 上面这些要点足以说明Android不是Linux。学习应用Android一般围绕Android的这些特有的部分展开,建议大家先复习一下Linux内核的基本知识。在具体学习之前,先来总体浏览一下 Android对Linux内核进行了哪些改动,在移植时就需要对这些改动加以调整。 参考阅读: 《 Android对Linux内核的改动你知道多少?》 from 特酷吧
4603 次阅读|0 个评论
[转载]Android系统知识普及
ChinaAbel 2012-10-2 11:14
Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过 塞班系统 , 跃居全球第一。 2012年2月数据,Android占据 全球智能手机操作系统市场52.5%的份额,中国 市场占有率为68.4%。 名称来源  :  Android 一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的 科幻小说 《 未来夏娃 》( L'ève future )中。他将外表像人的机器起名为Android。 Logo来源   Android的 Logo 是由Ascender公司设计的。其中的文字使用了Ascender公司专门制作的称之为“ Droid ”的字体。   Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的 品牌 象徵。有时候,它们还会使用纯文字的Logo。 版本命名规则    Android 用甜点作为它们系统版本的代号的命名方法开始于 Android 1.5 发布的时候。作为每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序: 纸杯蛋糕 , 甜甜圈 , 松饼 , 冻酸奶 , 姜饼 , 蜂巢 , 冰激凌三明治 ,根据最新消息新一代Android版本将命名为 果冻豆 (Jelly Bean)。 发行版本: 版本 备注 Android1.1 2008 年9月发布的Android第一版 Android 1.5 Cupcake (纸杯蛋糕) 2009年4月30日,官方1.5版本(Cupcake 纸杯蛋糕)的Android发布。主要的更新如下: 1、拍摄/播放影片,并支持上传到 Youtube 2、支持立体声 蓝牙 耳机,同时改善自动配对性能 3、最新的采用 WebKit 技术的浏览器,支持复制/贴上和页面中搜索 4、 GPS 性能大大提高 5、提供屏幕虚拟键盘 6、主屏幕增加音乐播放器和相框widgets 7、应用程序自动随着手机旋转 8、短信、Gmail、日暦,浏览器的用户接口大幅改进,如Gmail可以批量删除邮件 9、相机启动速度加快,拍摄图片可以直接上传到 Picasa 10、来电照片显示 Android 1.6 Donut (甜甜圈) 2009年9月15日,1.6(Donut 甜甜圈)版本 软件开发工具包 发布。主要的更新如下: 1、重新设计的Android Market手势 2、支持 CDMA 网络 3、文字转语音系统(Text-to-Speech) 4、快速搜索框 5、全新的拍照接口 6、查看应用程序耗电 7、支持 虚拟私人网络 (VPN) 8、支持更多的屏幕分辨率。 9、支持OpenCore2媒体引擎 10、新增面向视觉或听觉困难人群的易用性插件 Android2.0/2.0.1/2.1 Eclair (松饼) 2009年10月26日,2.0(Eclair 松饼)版本软件开发工具包发布。主要的更新如下: 1、优化硬件速度 2、"Car Home"程序 3、支持更多的屏幕分辨率 4、改良的用户界面 5、新的浏览器的用户接口和支持 HTML5 6、新的联系人名单 7、更好的白色/黑色背景比率 8、改进 Google Maps 3.1.2 9、支持Microsoft Exchange 10、支持内置相机闪光灯 11、支持数码变焦 12、改进的虚拟键盘 13、支持蓝牙2.1 14、支持动态桌面的设计 Android 2.2 /2.2.1 Froyo (冻酸奶) 2010年5月20日,2.2(Froyo 冻酸奶)版本软件开发工具包发布。主要的更新如下: 1、整体性能大幅度的提升 2、 3G网络 共享功能。 3、 Flash 的支持。 4、App2sd功能。 5、全新的软件商店。 6、更多的Web应用API接口的开发。 Android 2.3 Gingerbread (姜饼) 2010年12月7日,2.3(Gingerbread 姜饼)版本软件开发工具包发布。主要的更新如下: 1、增加了新的垃圾回收和优化处理事件 2、原生代码可直接存取输入和感应器事件、EGL/OpenGL ES、OpenSL ES。 3、新的管理窗口和生命周期的框架。 4、支持VP8和WebM视频格式,提供AAC和AMR宽频编码,提供了新的音频效果器 5、支持前置摄像头、SIP/VOIP和NFC(近场通讯) 6、简化界面、速度提升: 7、更快更直观的文字输入: 8、一键文字选择和复制/粘帖: 9、改进的电源管理系统: 10、新的应用管理方式: Android 3.0 Honeycomb (蜂巢) 2011年2月2日, 3.0(Honeycomb 蜂巢)版本主要更新如下: ·优化针对平板 ·全新设计的UI增强网页浏览功能 ·n-app purchases功能 Android 3.1 Honeycomb (蜂巢) 2011年5月11日在Google I/O开发者大会宣布发布,版本主要更新如下: Honeycomb 蜂巢(改进3.0BUG) 经过优化的Gmail电子邮箱; 全面支持GoogleMaps 将Android手机系统跟平板系统再次合并从而方便开发者。 任务管理器可滚动,支持USB 输入设备(键盘、鼠标等)。 支持 Google TV.可以支持 XBOX 360 无线手柄 widget支持的变化,能更加容易的定制屏幕widget插件。 Android 3.2 Honeycomb (蜂巢) 2011年7月13日发布,版本更新如下: 支持7英寸设备 引入了应用显示缩放功能 Android 4.0 Ice Cream Sandwich (冰激凌三明治) 2011年10月19日 在香港发布, 4.0(Ice Cream Sandwich 冰激凌三明治)版本主要更新如下: 1、全新的ui 2、全新的 Chrome Lite 浏览器,有离线阅读,16标签页,隐身浏览模式等。 3、截图功能 4、更强大的图片编辑功能 5、自带照片应用堪比Instagram,可以加滤镜、加相框,进行360度全景拍摄,照片还能根据地点来排序 6、Gmail加入手势、离线搜索功能,UI更强大。 7、新功能People:以联系人照片为核心,界面偏重滑动而非点击,集成了Twitter、Linkedin、Google+等通讯工具。有望支持用户自定义添加第三方服务。 8、新增流量管理工具,可具体查看每个应用产生的流量。 9、正在运行的程序可以像电脑一样的互相切换 10、人脸识别功能 11、系统优化、速度更快 12、支持虚拟按键,手机可以不再拥有任何按键 13、更直观的程序文件夹 14、平板电脑和智能手机通用 15、支持更大的分辨率 16、专为双核处理器编写的优化驱动 17、全新的 Linux 内核 18、增强的复制粘贴功能 19、语音功能 20、全新通知栏 21、更加丰富的数据传输功能 22、更多的感应器支持 23、语音识别的键盘 24、全新的3D驱动, 游戏支持能力提升 25、全新的谷歌电子市场 26、增强的桌面插件自定义 Android 5.0 Jelly Bean (果冻豆) 继“冰激凌三明治”之后的下一版Android系统。 大事纪    2005年事件   Google收购了成立仅22个月的高科技企业Android。    2007年事件   11月5日, Google 公司正式向外界展示Android操作系统。   11月5日,Google与34家手机制造商、软件开发商、电信运营商和芯片制造商共同创建开放手持设备联盟。 2008年   5月28日,Patrick Brady于Google I/O大会上提出Android HAL架构图。   8月18日,Android获得 美国联邦通信委员会 的批准。   9月22日,谷歌正式对外发布第一款Android手机——HTC G1。   9月23日,谷歌发布Android1.0。   9月24日,全球业界都表示不看好Android操作系统,并且声称最多1年,Android就会被Google关闭。 2009年   4月30日,Android1.5正式发布。   5月10日,HTC G1和HTC G2市场大卖,成为仅次于iPhone的热门机型。   9月25日,Android1.6正式发布。   9月29日,HTC Hero G3广受欢迎,成为全球最受欢迎的机型。   10月28日,Android 2.0 智能手机操作系统正式发布。   11月10日,由于Android的火热,Android平台出现第一个恶意间谍软件: Mobile Spy 。 2010年   1月7日,Google发布了旗下第一款自主品牌手机:Nexus one(HTC G5)。   1月,谷歌与 Linux基金会 就Linux内核的同步和维护意见不一致而产生了矛盾。   2月3日,Linux内核开发者Greg Kroah-Hartman将Android的驱动程序从Linux内核“状态树”上除去。   5月19日,Google正式对外发布Android2.2智能操作系统。   5月20日,Google对外正式展示了搭载Android系统的 智能电视 -Google TV,该电视为全球首台智能电视。   7月1日,Google宣布正式与雅虎、 亚马逊 合作,并且在Android上推出多项Kindle服务和雅虎服务。   7月9日,美国NDP集团调查显示,Android系统已占据了美国手机市场28%的份额,全球17%的市场份额。   8月12日,Android平台出现第一个 木马病毒 :Trojan-SMS.AndroidOS.FakePlayer.a。   9月,Android应用数量超过9万个。   9月21日,Google对外公布数据,每日销售的Android设备的新用户数达到20万。   10月26日,Google宣布Android达到第一个里程碑:电子市场上Android应用数量达到10万个。   12月7日,Google正式发布Android2.3操作系统。 2011年   1月,Google对外宣布Android Market上的应用数量超过20万。   1月,Google对外公布数据,每日Android设备的新用户数达到了30万。   2月2日,Android3.0正式发布。   2月3日,谷歌发布了专用于平板电脑的Android 3.0蜂巢系统,它带来了很多激动人心的新特性。   6月,Android在 日本 的智能手机操作系统市场占有率达到57%。   7月,Android在 欧洲 的智能手机操作系统市场占有率达到了22.3%   7月,Google对外公布数据,Android每天的新用户达到55万,Android设备用户总数达1.35亿。   8月,谷歌收购 摩托罗拉 移动。   8月,Google对外宣布Android Market上的应用数量超过30万。   8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian( 塞班系统 )的霸主地位,跃居全球第一。   8月,Android在 韩国 的智能手机操作系统市场占有率达到了95%。   8月,Android系统在35个国家市场占有率第一,平均市场占有率达到48%。   8月,Android系统成为 亚太地区 第一大系统,市场占有率为亚太地区第一大。   9月,Android在 美国 的智能手机操作系统市场占有率达到43%。   10月19日,谷歌正式发布Android 4.0操作系统。   11月,Android Market上提交审核的应用程序数量达到50万。   11月初,谷歌对Android Market上的应用程序进行了大清理,据统计,此次清理共清理了约18万个应用程序,包括流氓应用、病毒软件、 侵犯版权 、低质量和 滥竽充数 的各种程序,谷歌将这一系列应用删除后,使得Android市场中的 优质 应用程序总数到31.5万。   11月15日,Android在 中国大陆 的智能手机操作系统市场占有率达到了58%。   11月20日,谷歌宣布启动了Android Market应用审核、取缔、清扫行为,定期对电子市场上存在的不合格、低质量、违法恶意的应用程序进行清理。   11月18日,美国NPD数据显示,Android和 iOS 平台上的游戏占有率都首度超过 任天堂 的 DS 掌机和 索尼 的 PSP 掌机,手机游戏玩家也超过了掌机玩家,游戏开发商更倾向于向Android和iOS手机上开发游戏。   11月18日,谷歌报告显示,通过谷歌服务器激活的Android设备用户总数已经超过2亿,每天激活的新用户数超过55万,而这仅仅是通过谷歌服务器激活的用户设备数。   12月9日,Google对外宣布,Android Market的累计下载量已经突破100亿次,平均每月的下载量为10亿次。   12月18日,Google移动事业部副总裁Andy Rubin表示,每天激活的Android设备已达到70万部。   12月26日,Andy Rubin通过Twitter宣布,圣诞节的前两天24日和25日,共有370万部Android设备被激活。 2012年   1月4日,数据显示,Android Market上的应用程序数量突破40万个,每4个月增加10万个应用程序   1月5,数据显示,在谷歌电子市场上登记的Android 开发者 已经达到了10万名。   1月20日,谷歌报告显示,通过谷歌服务器激活的Android设备用户总数已经超过2.5亿,距离去年11月的数量,在短短2个月时间内全球共卖出5000万台安卓设备,平均每秒钟就卖出10台安卓设备。   2月4日,comScore等数据市场研究机构的数据显示,安卓在美国手机市场的占有率达到了47.3%。   2月5日, 美国联邦政府 宣布成立专门的Android 实验室 进行适用于军方的Android第三方 ROM 的定制工作。   2月15日,美国联邦政府总务署宣布已经采购了2万台Android手机供 政府 人员使用。   2月22日,Android在中国大陆的智能手机操作系统市场占有率达到了68.4%。   2月28日,谷歌正式宣布,Android设备每天激活量达到85万台,通过谷歌 服务器 激活的Android设备用户总数突破3亿台,距离2012年1月的数量,在短短1个月时间内全球共卖出5000万台安卓设备,平均每秒钟就卖出15台安卓设备。   2月28日,谷歌官方数据显示,Android电子市场(Android Market)上的应用程序数量已经突破45万个,一年内增加30万个。   3月1日,Google对外宣布,Android Market的累计下载量已经突破130亿次。   3月4日,Android在 印度 的智能手机操作系统市场占有率达到了34%。 系统架构   Android的系统架构和其它操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。   Android是以Linux为核心的手机操作平台,作为一款开放式的操作系统,随着Android的快速发展,如今已允许开发者使用多种 编程语言 来开发Android 应用程序 ,而不再是以前只能使用Java开发Android应用程序的单一局面,因而受到众多开发者的欢迎,成为真正意义上的开放式操作系统。   在Android中,开发者可以使用 Java 作为编程语言来开发应用程序,也可以通过NDK使用C/ C++ 作为编程语言来开发应用程序,也可使用 SL4A 来使用其他各种脚本语言进行编程(如: python 、 lua 、 tcl 、 php 等等),还有其他诸如: Qt (qt for android)、 Mono (mono for android)等一些著名编程框架也开始支持Android编程,甚至通过 MonoDroid ,开发者还可以使用 C# 作为编程语言来开发应用程序。另外,谷歌还在2009年特别发布了针对初学者的Android Simple语言 ,该语言类似 Basic语言 。而在网页编程语言方面, JavaScript , ajax ,HTML5, jquery 、 sencha 、dojo、mobl、PhoneGap等等都已经支持Android开发。   而在Android系统底层方面,Android使用C/C++作为开发语言。 应用程序(部分)   早期的Android应用程序开发,通常通过 Android SDK (Android软件开发包)下使用Java作为编程语言来开发应用程序,但通过不同的软件开发包,则使用的编程语言也不同。   例如开发者可以通过Android NDK(Android Native开发包)使用C语言或者C++语言来作为编程语言开发应用程序。同时谷歌还推出了适合初学者编程使用的 Simple 语言,该语言类似微软公司的 Visual Basic 语言。此外,谷歌公司还推出了Google App Inventor开发工具,该开发工具可以快速地构建应用程序,方便新手开发者。    Java开发方面   Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。 Android结构 其中Activity等同于J2ME的MIDlet,一个 Activity 类( Class )负责创建视窗(Windows),一个活动中的Activity就是在 foreground(前景)模式,背景运行的程序叫做Service。两者之间通过由ServiceConnection和AIDL连结,达到复数程序同时运行效果。如果运行中的 Activity 全部画面被其他 Activity 取代时,该 Activity 便被停止(Stopped),甚至被系统清除(Kill)。   View等同于J2ME的Displayable,程序人员可以通过 View 类与“XML layout”档将UI放置在视窗上,Android 1.5的版本可以利用 View 打造出所谓的 Widgets,其实Widget只是View的一种,所以可以使用xml来设计layout,HTC的Android Hero手机即含有大量的widget。至于ViewGroup 是各种layout 的基础抽象类(abstract class),ViewGroup之内还可以有ViewGroup。View的构造函数不需要再Activity中调用,但是Displayable的是必须的,在Activity 中,要通过findViewById()来从XML 中取得View,Android的View类的显示很大程度上是从XML中读取的。View 与事件(event)息息相关,两者之间通过Listener 结合在一起,每一个View都可以注册一个event listener,例如:当View要处理用户触碰(touch)的事件时,就要向Android框架注册View.OnClickListener。另外还有BitMap等同于J2ME的Image。    C/C++开发方面   早期的Android开发只支持Java作为编程语言开发应用程序,因而使得其他语言开发者只能望而却步。2010年4月,谷歌正式对开发者发布了Android NDK,NDK允许开发者使用C/C++作为编程语言来为Android开发应用程序,初版的NDK使得开发者看到了C/C++在Android开发中的希望。   但是,当前版本的NDK在功能上还有很多局限性:NDK并没有提供对应用程序生命周期的维护;NDK也不提供对Android系统中大量系统事件的支持;对于作为应用程序交互接口的UI API,当前版本的NDK中也没有提供。但是相对于初版的NDK,现在的NDK已经进行了许多重大的功能改进。   由此可见,NDK仍然需要完善和发展,相信未来随着NDK的发展,NDK可以做得更多更好。 中介软件    操作系统 与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同时包含了Webkit,所谓的Webkit 就是Apple Safari 浏览器背后的引擎。Surface flinger 是就2D或3D的内容显示到屏幕上。Android使用工具链(Toolchain)为Google自制的Bionic Libc。   Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、 Codec 、PacketVideo ** Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。   Android 使用skia 为核心图形引擎,搭配OpenGL/ES。skia与Linux Cairo功能相当,但相较于Linux Cairo, skia 功能还只是雏形的。2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,目前Skia 也是Google Chrome 的图形引擎。   Android的多媒体数据库采用SQLite数据库系统。数据库又分为共用数据库及私用数据库。用户可通过ContentResolver类(Column)取得共用数据库。   Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。   Dalvik虚拟机可以有多个实例(instance), 每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到优化。Dalvik 虚拟机并非运行Java字节码(Bytecode),而是运行一种称为.dex格式的文件。 硬件抽像层   Android 的 HAL (硬件抽像层)是能以封闭源码形式提供硬件驱动模块。HAL 的目的是为了把 Android framework 与 Linux kernel 隔开,让 Android 不至过度依赖 Linux kernel,以达成 kernel independent 的概念,也让 Android framework 的开发能在不考量驱动程序实现的前提下进行发展。   HAL stub 是一种代理人(proxy)的概念,stub 是以 *.so 档的形式存在。Stub 向 HAL“提供”操作函数(operations),并由 Android runtime 向 HAL 取得 stub 的 operations,再 callback 这些操作函数。HAL 里包含了许多的 stub(代理人)。Runtime 只要说明“类型”,即 module ID,就可以取得操作函数。 内核   Android 是运行于 Linux kernel之上,但并不是 GNU /Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 userspace,使得Linux driver 与 Linux kernel彻底分开。bionic/libc/kernel/ 并非标准的kernel header files。Android 的 kernel header 是利用工具由 Linux kernel header 所产生的,这样做是为了保留常数、数据结构与宏。   目前Android 的 Linux kernel控制包括安全( Security ),存储器管理(Memory Management),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型(Driver Model)等。下载Android源码之前,先要安装其构建工具 Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。 安全权限机制   Android本身是一个权限分立的操作系统。在这类操作系统中,每个应用都以唯一的一个系统识别身份运行(Linux用户ID与群组ID)。系统的各部分也分别使用各自独立的识别方式。Linux就是这样将应用与应用,应用与系统隔离开。   系统更多的安全功能通过权限机制提供。权限可以限制某个特定进程的特定操作,也可以限制每个URI权限对特定数据段的访问。   Android安全架构的核心设计思想是,在默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。   安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。从用户角度看,一款Android应用通常会要求如下的权限:   拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。   一款应用应该根据自身提供的功能,要求合理的权限。用户也可以分析一款应用所需权限,从而简单判定这款应用是否安全。如一款应用是不带广告的单机版,也没有任何附加的内容需要下载,那么它要求访问网络的权限就比较可疑。 程序组成   技术内容:本系统主要由四个部分组成,分别是:活动(Activity): 用于表现功能。服务(Service): 相当于后台运行的Activity。广播接收器(BroadcastReceiver):用于接收广播。意图(Intent): 用于连接以上各个组件,并在其间传递消息。 1 Activity   Android 中,Activity 是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。在Android的程序当中,Activity 一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Acitivity就相当于一个网页。在Activity 当中可以添加一些Button、Check box 等控件。可以看到Activity 概念和网页的概念相当类似。   一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间可以进行相互跳转,例如,按下一个Button 按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity 之间的跳转有可能返回值,例如,从Activity A 跳转到Activity B,那么当Activity B 运行结束的时候,有可能会给Activity A 一个返回值。这样做在很多时候是相当方便的。   当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的移除一些没有必要保留的屏幕,因为Android 会把每个应用的开始到当前的每一个屏幕保存在堆栈中。Activity 是由Android 系统进行维护的,它也有自己的生命周期,即它的一个产生、运行、销毁的一个周期,对于Activity,关键是其生命周期的把握,其次就是状态的保存和恢复(onSaveInstanceState onRestoreInstanceState),以及Activity 之间的跳转和数据传输(intent)。 2 Service   Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。Service 是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,我们来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android 浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束,或者用户按下了停止音乐播放的快捷键等。service 可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。 3 Broadcast   在Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver 是对发送出来的Broadcast进行过滤接受并响应的一类组件。可以使用BroadcastReceiver 来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件到来的时候,可以利用BroadcastReceiver 进行处理。例如,当下载一个程序成功完成的时候,仍然可以利用BroadcastReceiver 进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说不是透明的,用户是看不到的。BroadcastReceiver通过NotificationManager 来通知用户这些事情发生了。BroadcastReceiver 既可以在AndroidManifest.xml 中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当事件来临的时候,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast () 将它们自己的intent broadcasts广播给其他应用程序。注册BroadcastReceiver有两种方式: 4 Intent   Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android 各个组件之间的通讯。Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此Intent 的描述,负责找到对应的组件,将Intent 传递给调用的组件,并完成组件的调用。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity 为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)。为了实现这个目的,listActivity需要构造一个Intent,这个Intent 用于告诉系统,我们要做"查看"动作,此动作对应的查看对象是"某联系人",然后调用startActivity(Intent intent),将构造的Intent 传入,系统会根据此Intent 中的描述,到ManiFest中找到满足此Intent 要求的Activity,系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity 则会根据此Intent中的描述,执行相应的操作。Intent 主要是用来启动其他的activity 或者 service ,所以可以将intent 理解成activity 之间的粘合剂。Intent具体有一下3 种形式:   通过startActivity 方法来启动一个新的Activity;   通过broadcast Intent 机制可以将一个Intent 发送给任何对这个Intent 感兴趣的BroadcastReceiver;   通过startService (Intent) 或bindService(Intent,ServiceConnection,int) 来和后台的Service 进行交互。 『转帖』android 软件权限知识普及 【菩提版】安卓系统十大常见名词知识普及 给大家说一下基带和内核的小知识,普及普及。 安卓基础知识普及---别说你都懂 知识普及帖:高通骁龙系列简介 c网 iphone 4s购买--知识普及 android的一些基础知识汇总 android系统 java一键设置环境变量 android系统语言包 android开发语言 vpn 转自 百度百科
个人分类: 休闲娱乐|3287 次阅读|0 个评论
Android项目常见导入错误设置
mafei863 2012-9-7 22:34
Android项目导入错误,有可能是google与eclipse连接有缝,在导入项目时总是会出现非语法方面的错误: 采用如下方法试试: 1.右键点击项目-属性-Android-Target Name-Android 2.2一般错误会消失,或在Java build path-Library-Add :JRE类库;但若仍有错误,可以尝试一下第二点方法, 2.点击项目-属性-Android-Java Compiler-JDK Compliance-更换为1.5,然后再改为1.6
个人分类: Android|3065 次阅读|0 个评论
Android程序 防滑助手 老年人摔倒报警
热度 2 creator 2012-9-2 21:09
Android程序 防滑助手 老年人摔倒报警
折腾了好久,在朋友的帮助下,总算把这个程序调通了,其他就再等吧。 ============== 防滑助手 SlipHelper 测试版 系统要求:Android2.2以上 功能: 当使用者不慎摔倒时,会触发警报,如果20秒内没有关闭,程序将向预先设置好的人发送短信寻求帮助。 眼下众多老人摔倒无人敢扶,希望能有所作用,程序只使用了简单的失重判断,经我自己向床上摔的经验,准确率还比较高,新的算法还在测试。 本程序还不完善,如果你有任何建议,请不吝告诉我。 目前程序还有很多bug,如果你是Android高手,并愿意提供帮助,我可以将代码发给你。 灵敏度尚不可调,你可以先试试让手机自由落体,一个手接住。 如果你希望开发Iphone平台的类似应用,希望你也是免费提供给大家。 使用方法: 1,运行程序,点击手机的菜单按钮 2,选择设置,输入你希望发送的短信号码,然后保存 3,返回即可,如果希望退出服务,需要点击手机菜单按钮,选择退出,否则程序会在后运行。 当触发报警时,会不停的播放“帮帮忙”音频(声音不好听莫怪哈),如果是误报,请按取消。 最近科学网服务器是不是有问题?????????????修改的内容老是不见了。 这个版本暂时没有加入定位信息,原来希望在摔倒时,将用户的坐标信息采集出来随短信一起发送,下一版本添加。但是, GPS 信号在室内无效,基站信号我希望是移动、联通、电信来做,用户包月,比如每月 2 元,用户只要发送指定代码到运营商,运营商就将用户的坐标位置发送的预先设置的号码上。 1 亿老人,还有小孩子也可以用,每月 2 元,收入还是可观的。 ============================= 源代码内有很多冗余代码,请自行清除 sliphelper.zip 关于算法的问题 以垂直地面方向的加速度传感器为例,有静止、失重和超重三种状态,一般的摔倒过程是,并未完全失重,因为衣服在兜里或挂在身上,摔倒后会超重。自由落体一定会失重,一般的摇动晃动,会持续超重,但是摔倒一般只会一次。 如果有需要就按照这个方法试试吧。 下载地址1: http://vdisk.weibo.com/s/bIesn 下载地址2: 防滑助手sliphelper.apk 其他请访问 http://www.wangzhaoyi.com Android 全文.pdf
个人分类: 经济生活|2705 次阅读|5 个评论
[转载]Android中将彩色图转换为灰度图的方法
mafei863 2012-9-2 17:53
Android中将彩色图转换为灰度图的方法 2011-09-20 14:18:33 我来说两句 收藏 我要投稿 最近突发奇想想将彩色图片转换成灰度图片,查看了资料,终于实现了预想的效果,现将代码贴出来,与大家分享: public Bitmap ConvertGrayImg(Bitmap img1) { int width=img1.getWidth(); int height=img1.getHeight(); int ; img1.getPixels(pix, 0, width, 0, 0, width, height); //第三个参数width为步长,它必须为位图的宽度 int alpha=0xFF24; for (int i = 0; i height; i++) { for (int j = 0; j width; j++) { int color = pix ; //记住这里的Alpha值应设为00,不要设为ff,不然就不是灰度图了 int red = ((color 0x00FF0000) 16); int green = ((color 0x0000FF00) ; int blue = color 0x000000FF; //这里有些人会将三个颜色分量的值相加然后除以3,但是这会存在一些极端的情况,所以以0.3 、 0.59 、 0.11的比例来计算 //是比较好的 color = (int)( (float)red*0.3 + (float)green*0.59 + (float)blue*0.11); color = alpha | (color 16) | (color | color; pix = color; } } Bitmap result=Bitmap.createBitmap(width, height, Config.RGB_565); result.setPixels(pix, 0, width, 0, 0,width, height); return result; } 作者“zhangyulong882” 思路如下: 1.读取or照相,得到一张ARGB图片。 2.转化为bitmap类,并对其数据做如下操作: A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值新R,G,B值为X,即: new_R = X, new_G = X, new_B = X 例如:原来一个像素是4个byte,分别为ARGB,现在这个像素应该为AXXX。 3.将上一步骤得到的bitmap图像写到输出流里面,并保存为图片。或者直接显示在ImageView上。 ********************************************************************************************************** 代码片段如下(注意,直接复制到工程里可能会有错误): Java代码 BitmapbitmapOrg=BitmapFactory.decodeByteArray(rawData, 0 ,rawData.length); //BitmapbitmapOrg=BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher); BitmapbitmapNew=bitmapOrg.copy(Config.ARGB_8888, true ); //BitmapbitmapNew=bitmapOrg.copy(Config.ARGB_8888,true); if (bitmapNew== null ) Log.i( "TAG" , "null" ); Log.i( "TAG" , "copyend" ); for ( int i= 0 ;ibitmapNew.getWidth();i++) { for ( int j= 0 ;jbitmapNew.getHeight();j++) { int col=bitmapNew.getPixel(i,j); int alpha=col 0xFF000000 ; int red=(col 0x00FF0000 ) 16 ; int green=(col 0x0000FF00 ) 8 ; int blue=(col 0x000000FF ); int gray=( int )(( float )red* 0.3 +( float )green* 0.59 +( float )blue* 0.11 ); int newColor=alpha|(gray 16 )|(gray 8 )|gray; bitmapNew.setPixel(i,j,newColor); //Log.v("tag",Integer.toHexString(col)); } } Log.i( "TAG" , "proend" ); sendMsg(bitmapNew); Filefile= new File(Environment.getExternalStorageDirectory()+File.separator+ "gray" +number+ ".jpg" ); OutputStreamout; try { out= new FileOutputStream(file); if (bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100 ,out)) Log.i( "TAG" , "success" ); out.close(); } catch (FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } catch (IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } Bitmap bitmapOrg = BitmapFactory.decodeByteArray(rawData, 0, rawData.length); //Bitmap bitmapOrg = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); //Bitmap bitmapNew = bitmapOrg.copy(Config.ARGB_8888, true); if(bitmapNew == null) Log.i("TAG", "null"); Log.i("TAG", "copy end"); for(int i = 0;ibitmapNew.getWidth();i++) { for(int j =0;jbitmapNew.getHeight();j++) { int col = bitmapNew.getPixel(i, j); int alpha = col0xFF000000; int red = (col0x00FF0000)16; int green = (col0x0000FF00)8; int blue = (col0x000000FF); int gray = (int)((float)red*0.3+(float)green*0.59+(float)blue*0.11); int newColor = alpha|(gray16)|(gray8)|gray; bitmapNew.setPixel(i, j, newColor); //Log.v("tag", Integer.toHexString(col)); } } Log.i("TAG", "pro end"); sendMsg(bitmapNew); File file = new File(Environment.getExternalStorageDirectory()+File.separator+"gray"+number+".jpg"); OutputStream out; try { out = new FileOutputStream(file); if(bitmapNew.compress(Bitmap.CompressFormat.JPEG, 100, out)) Log.i("TAG", "success"); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 注意,这种直接对bitmap图像的逐像素处理非常费时,所以最好开辟一个新的线程来做这类操作。 另外,有一个Bitmap.config里面有一个alpha8设置,经过实践证明,这个设置不好使,在保存时选择这个设置,无论是保存图片还是现实图片,都会失败。 想直接保存成单通道的灰度图也不行,android不支持,所以即使是灰度图,实际上也是4通道的ARGB图。
个人分类: Android|5542 次阅读|0 个评论
[转载]Android AVD创建及设置中各参数详解
mafei863 2012-8-24 21:17
设置AVD时有些参数比较模糊,特地找了篇文章,大家参考下! 本文根据如下的模拟器安装做一些解释: Name:自定义虚拟的名称,不能有空格或者其他非法字符,否则不能创建,即Creat AVD不能高亮点击。 Target:选择要运行的android 版本(也可理解为内核?),此处有两个版本,取决于你在最初时下载的选择,个人理解这两个同样为2.2版本差异在 从名称上不难理解,一个是优化后的内核包,一个是google原生态的,当然这两个都是Google原版本,未被做过其他改动,通过查看img以及表现在 系统启动后安装的一些自带软件和功能上的差异,原生态的占用内存小;以及在皮肤,字体,地图等一些外在差异。 Size:就是要模拟卡存储卡的大小,视个人需求而定,推荐256MB以上,此处的KiB就是KB,MiB就是MB。如果有用过的映像文件可直接使用。文件存在: C:/Documents and Settings/Administrator/.android/avd/sdk2.2.avd/sdcard.img,如果分配太大则会占用更多的系统空间。如果有需要可以将其备份, 以供以后直接使用,选择File直接载入即可。 Skin:Built-in其实就是定义屏幕尺寸的像素,可以使用由SDk直接提供的常见分辨率,具体的可查看(你的文件解压存放路径)android-sdk-windows/platforms/android-8/skins/; HVGA 320*480像素;QVGA 320*240像素;WQVGA400 400*240像素;WQVGA432 432*240像素;WVGA800 800*480像素;WVGA854 854*480像�� Resolution就是自定义分辨率,除非有特殊需求,否则不建议自定义,因为自定义的尺寸没有对应的右侧界面,当然你也可以自己做对应的此存的皮肤。 一般选择好尺寸后在Hardware中会自动增添一项abstracted lcd density,默认是160,下文解释此处。 Hardware:Abstracted Lcd Density默认160,最直接的表现就是手机图标和文字的大小,120最小,可根据分辨率的大小自定义,一般推荐使用默认值即可。 SD Card Support 是否支持插入/弹出闪存卡; Dpad Support 是否要让手机支持DPad键,默认为yes,表示支持。DPad键就是手机上的那些Home键、返回键、电话键、电源键。 不过测试表明即使no,皮肤上的那些键也可用,可以理解为外设之类的手柄,键盘等。 Accelerometer是否要让手机支持加速器功能,默认为yes,表示支持。 Maximum horizontal camera pixels若让手机支持照相机功能,接着会要求定义照相机的像素,默认水平像素为640。 Cache partition size要指定/cache分割区的大小,默认值为66 MB。 Audio playback support是否要让手机支持音乐播放功能,默认为yes,表示支持。 Track-ball support是否要让手机支持轨迹球功能,默认为yes,表示支持。 Maximum vertical camera pixels让手机支持照相机功能,接着会要求定义照相机的像素,默认垂直像素为480。 Camera support 手机是否支持照相功能,默认no。 Battery support是否要让手机支持电池功能,默认为yes,表示支持。 Touch-screen support是否要让手机支持触碰屏幕功能,默认为yes,表示支持。 Audio recording support是否要让手机支持音乐录制功能,默认为yes,表示支持。 GPS support 是否支持手机 定位,默认yes。 Cache partition support是否要让Android手机系统支持额外的/cache分割区,这样放在/cache的暂存文件不会使用到Android系统空间,默认为yes,表示支持。 Keyboard support是否要让手机支持QWERTY键盘输入功能,默认为yes,表示支持。 Max VM application heap size最大虚拟机应用程序堆大小,就是系统最低内存阀值,当运行低于这个值,系统会结束一些进程,默认值16。 Device ram size是否要更改手机的内存容量,默认值为96 MB,建议更改为256 MB以上。 至此就完成搭载Android 2.2版的定制化AVD硬件装置设定了,但实际中有些硬件不受控制。 推荐定制设置: Size:512MB Skin:Built-in - HVGA Hardware:Abstracted Lcd Density 160 (可自定义,输入其他值也可比如200) Cache partition size 128MB Camera support yes Device ram size 512 语言设置为setting - language keyboard - select language,界面中文在重启后生效。 至此发现:1,C:/Documents and Settings/Administrator/.android/avd下即为配置文件,在下一节目录中可找到配置文件config.ini,进行相应参数的更改。更改配置文件后需要重新启动模拟器才行。 直接使用模拟器新建相同名称的,并选择进行覆盖,也可更改参数,可立即生效。 2,运行(你的文件解压存放路径)android-sdk-windows/tools/android.bat,放送到桌面快捷方式,可启动模拟器。 也发现一点小问题,1,模拟器进程emulator.exe比较消耗CPU,运行程序时酷睿双核的常常占到30-40; 2,鼠标操作反应不好,延迟感严重,比较不爽。(待解决) My Android – lasted 设置虚拟机屏幕的大小 运行(Start)虚拟机后,会弹出一个对话框, Launch option,主要可以用来设置虚拟机屏幕与电脑屏幕的比例关系,以及重置虚拟机。 Scale display to real size:选中后可以自定义设置。 Screen size(in):虚拟机屏幕像素尺寸,默认值3。 Monitor dpi:电脑屏幕的每英寸像素点数,默认值96,点击问号可以设置电脑尺寸和分辨率,会自动算出当前电脑的dpi。 比如我的电脑屏幕尺寸14’,分辨率1600*900,对应的的dpi为131.,看起来就是一个精细程度。 Scale:该值表示虚拟机屏幕与实际屏幕的映射关系,值为1表示两者相对应,小于1,屏幕将被缩小,反之则放大。 Wipe user data:清除用户自定义数据,重置虚拟机。
个人分类: Android|8758 次阅读|0 个评论
[转载]离线搭建Android开发环境---修订版
mafei863 2012-8-15 16:25
(蓝色字体为实践性过程) 学习android已经有一年了,最近在群里老看到很多android初学者提问如何搭建android的开发环境的问题,之前一直很忙,没时间整理,今天就大概整理一下,放出来供一些初学者参考,下面我就简单描述下离线搭建android开发环境,2010年3月底的时候我也是以这种方式安装的,所以现在我也介绍该方式好了,因为在线安装速度很不给力,所以当时只好选择了离线安装,当时也没想到这样可以安装成功,只是带着尝试的态度,没想到真的可行,现在就简单描述下吧,如果有网友看了还不明白的,那就给我留言,我会尽快答复。 一、首先下载JDK,只有JRE是不够的,必须要下载JDK,建议使用1.6版本,地址:http://download.java.net/jdk6/ 二、下载Eclipse 3.5.2(galileo), 或更高的版本,地址:http://www.eclipse.org/ 三、首先下载SDK的安装包, android-sdk_r12-windows.zip (安装工具)解压到目录,如我的目录D :\android\android-sdk-windows然后在android-sdk-windows目录下包含(若没有,则新建)以下几个文件夹 platforms,docs,samples,usb_driver, tools, market_licensing , add-ons, platform-tools(这个文件夹很关键,专门下载或直接从android-2.2_r02-windows.zip中tools解压复制出来也可 ), 四、下载ADT-12.0.0.zip , 其中ADT和SDK可以到此下载: http://code.google.com/p/androidforchinadeveloper/downloads/list 五、打开安装好的Eclipse,选择Help---Install SoftWare---Add Name:Android_ADT Location:选择已经下载在本地的ADT-0.9.7.zip,ok即可 六、打开下载工具(迅雷,电驴等等),下载以下内容 谷歌api的安装包 http://dl-ssl.google.com/android/repository/google_apis-3-r03.zip http://dl-ssl.google.com/android/repository/google_apis-4_r02.zip http://dl-ssl.google.com/android/repository/google_apis-5_r01.zip http://dl-ssl.google.com/android/repository/google_apis-6_r01.zip http://dl-ssl.google.com/android/repository/google_apis-7_r01.zip http://dl-ssl.google.com/android/repository/google_apis-8_r02.zip Android开发包 http://dl-ssl.google.com/android/repository/android-1.1_r1-windows.zip http://dl-ssl.google.com/android/repository/android-1.5_r04-windows.zip http://dl-ssl.google.com/android/repository/android-1.6_r03-windows.zip http://dl-ssl.google.com/android/repository/android-2.0_r01-windows.zip http://dl-ssl.google.com/android/repository/android-2.0.1_r01-linux.zip http://dl-ssl.google.com/android/repository/android-2.1_r02-windows.zip http://dl-ssl.google.com/android/repository/android-2.2_r02-windows.zip 许可证 http://dl-ssl.google.com/android/repository/market_licensing-r01.zip 工具 http://dl-ssl.google.com/android/repository/tools_r07-windows.zip 文档 http://dl-ssl.google.com/android/repository/docs-2.2_r01-linux.zip 样例 http://dl-ssl.google.com/android/repository/samples-2.2_r01-linux.zip http://dl-ssl.google.com/android/repository/samples-2.1_r01-linux.zip USB驱动 http://dl-ssl.google.com/android/repository/usb_driver_r03-windows.zip 如果是Linux平台的朋友,请把windows统一改为linux即可,mac平台的朋友改为macosx即可。 需要说明的是,文档和样例都是同样的地址docs-2.2_r01-linux.zip,samples-2.2_r01-linux.zip,samples-2.1_r01-linux.zip 七、解压文件到指定目录 把android开头的文件解压到platforms目录下 把goole_apis开头的文件解压到add-ons目录下 把market_licensing-r01.zip解压到market_licensing目录下 把docs-2.2_r01-linux.zip解压到docs 把samples-2.2_r01-linux.zip和samples-2.1_r01-linux.zip解压到samples目录下 把usb_driver_r03-windows.zip解压到usb_driver目录下。 并分别重命名如下: google_apis-3-r03 --- google_apis-3 google_apis-4_r02 --- google_apis-4 google_apis-5_r01 --- google_apis-5 google_apis-6_r01 --- google_apis-6 google_apis-7_r01 --- google_apis-7 google_apis-8_r02 --- google_apis-8 android-1.1_r1 --- android-1.1 android-1.5_r04 --- android-1.5 android-1.6_r03 --- android-1.6 android-2.0_r01 --- android-2.0 android-2.0.1_r01--- android-2.0.1 android-2.1_r02 --- android-2.1 android-2.2_r02 --- android-2.2 samples-2.2_r01 --- samples-2.2 samples-2.1_r01 --- samples-2.1 八、Eclipse中配置Android sdk Eclipse Window --- Preferences ---Android ---Browse... 定位 Android SDK 目录,如:D:\android\android-sdk-windows 点击 Apply, 然后 OK,这样整个离线环境就全部搭建好了。 九、运行程序 需要创建AVD Android AVD创建及设置中各参数详解 http://bbs.sciencenet.cn/home.php?mod=spaceuid=538909do=blogid=605679
个人分类: Android|5750 次阅读|0 个评论
Android应用开发(一 前记)
热度 2 hbwang1427 2012-8-2 10:39
受到最近OpenCV支持Android系统的启示,决定开始研究Android系统上的应用程序开发,希望可以制作出一两款具有视觉功能的应用软件。 在决定体验Android系统之前,iOS实际是我的第一亲睐对象,不过基于两点原因还是选择了Android:首先,iOS的开发工具Xcode只能在Mac系统上使用,而我只有日夜相伴的小黑,还是放弃吧;其次,做了一个小小的市场调研,看到Android开源策略的成功,料想日后必定引领移动操作系统市场。调研的内容其实很简单,即2012年中美智能手机市场上Android和iPhone的占有率 (使用Google搜索到的,姑且相信数据真实),根据对几个网站数据的综合,可以得到如下的图表: 表一、中国 表二、美国 可见,Android在中美两国的市场份额都已赶超iOS,这一方面有价格的因素,另一方面,随着Android不断完善,更多的厂商和用户正在被吸引过来。与iOS相比,虽然Android略显混乱,虽然存在不同版本,。。。,虽然有着各种虽然,但是我仍然坚信,开源的总是光明的,希望可以每天花费一个小时来跟进这一项目。第一步? 当然是赶紧进一款Android了。
个人分类: 技术体验|2554 次阅读|2 个评论
[转载]谷歌地图Google Maps下一步?
热度 1 JRoy 2012-6-7 08:24
北京时间6月7日消息,周三谷歌在旧金山举行发布会,宣布将为谷歌地图推出3种新功能,包括为谷歌地球提供好得多的3D地图,为Android移动设备提供离线缓冲,以及街景服务拓展。 谷歌地球产品经理彼得·伯奇(Peter Birch)指出,从基本3D地图转向有建筑物的地图还需要一段时间,2008年谷歌在3D数据上遇到的一个问题是,数据来源太多。伯奇称:“我们知道需要做的更好。”为了绘制3D世界地图,谷歌现在将使用飞机45度角航拍的图片。 为此,谷歌将在一些大城市部署一个由小型的装备摄像机的飞机组成的机队,收集这些城市的建筑物和地标图片。谷歌计划在年底前推出这些城市的3D地图。虽然谷歌拒绝透露这些城市的名字,不过当日展示了旧金山的3D地图,用户可从空中俯瞰该城市。 另外,谷歌宣布Android版谷歌地图不久可离线使用,用户可以事先 下载 所需地区地图,而后在没有Wi-Fi和移动网络的情况下使用。这种功能目前只针对Android版谷歌地图。当被问及为什么没有iOS版时,麦克伦敦表示:“我们在努力将其推向所有平台,这只是时间问题。” 最后,谷歌将通过Street View Trekker进行街景服务拓展,将街景服务发展到道路级别以外。除了谷歌街景车,谷歌还计划将摄像头安装在自行车、雪橇、轮船等交通工具上。Google高管还展示了一个街景背包(Street View Backpack),这个工具装备了摄像机和其他技术可在野外徒步拍照。通过单人操作的数据采集,谷歌街景服务将扩大到更多的室内场所,包括艺术馆内部等。 谷歌最早在2005年推出了地图服务,目前每月的用户量已经超过了10亿人。谷歌预计,今年谷歌地图上会有75%都覆盖高清晰度影像。 ----------------------------------------- 北京时间3月11日消息,据国外媒体报道,科技信息网站Digitaltrends日前发表吉奥夫·邓肯(Geoff Duncan)的署名文章称,尽管 谷歌 地图以其信息准确、服务免费而广受欢迎,但是最近地理位置社交服务商Foursquare和 苹果 先后宣布放弃使用这项服务,除了谷歌地图开始实行收费之外,其内在原因可能在于他们都与谷歌在某个领域存在竞争关系,不愿成为谷歌投放广告的窗口。 自2007年以来谷歌地图一直是iPhone的默认地图应用程序,但很多苹果职员透露,该公司多年来一直在研究取而代之的计划。2009-2011年苹果已收购了Placebase、Poly9和C3技术3家地图公司。苹果的动机可能有两个,一个是为了增加广告营收,二是将自己与Android、其它平台差异化开来,获得新用户和开发者。传闻称在今年的WWDC大会上,苹果会推出新技术地图,大会于6月11日在旧金山开幕。
个人分类: 科技动态|2214 次阅读|2 个评论
[转载]手机android下运行Win98或XP或Linux
dongyanqing 2012-3-18 23:21
现在的手机配置高啊,CPU动不动就上G,内存上G,想想当年的Windows98、Windows Me、WindowsXP刚发行的时候电脑配置可能还没这么高,那么在手机上运行这些系统是否可行?答案是确定的。方式如下: Win 95/98/XP and Linux OSs (Knoppix/Ubuntu/Redhat etc) on your Android!!! Yes ! Now you can run x86 based operating systems on your ARM device. Now you can have full desktop windows/linux experience on your Android smartphones. The windows 95 works great on my EVO3D All credits to their respective developers..... Instructions : 1.Download and install Bochs2_5_1.apk (stable but slower) or QEMU.apk (unstable but faster) 2.Download SDL(BOCHS).zip for Bochs2_5_1.apk and SDL(QEMU).zip for QEMU.apk and extract on root of sdcard , so path should be sdcard/SDL/*.* 3.Put a disk image of type ".img" of any operating system in SDL folder and rename it to "c.img" (tested : win 95/98/XP ----------------Linux OSs like Ubuntu/Knoppix/redhat etc can also be used) 4.Run Bochs or LibSDL from appdrawer. Let it boot (takes a while) and enjoy. How to Create .IMG from .VHD disk image in Second Post ---------------------------------------------------------------------- Instructions (BOCHS) : (i forgot to post the instructions so thanks to HDD_x8 for posting this) - The screen works as touchpad to control the mouse cursor and volume up/down works as left/right click. - You can also tap the screen to generate left click.(this does not work everytime) - Back = BackSpace, Menu = Enter, left-upper corner click generates TAB - left-lower corner click popups keyboard ( For a desktop like experience use this keyboard - Hackers Keyboard ) -Create a folder called "HDD" on the root of your SDcard and put your softwares/files or anything in there. When you boot windows, then in "My Computer" you will see "d" drive which will have the "HDD" folder contents. So you can install/use them in Windows. ----------------------------------------------------------------------- ---------------------------------------------------------------------- Instructions (QEMU): - The screen works as touchpad to control the mouse cursor. - You can also tap the screen to generate left click (right click is not possible AFAIK) . - Back = BackSpace, Holding Menu = popups keyboard ( For a desktop like experience use this keyboard - Hackers Keyboard ) - No custom files can be used as of now, will find a way and post here again. ---------------------------------------------------------------------- MHL to HDMI out tested and confirmed working (thanks to HDD_x8 again.) Some freeware disk images can be found here or here (not sure if any of them will work as i have not tested , only win 95/98/XP are tested.) win98磁盘镜像:115.com/file/dpy6g3eq# winxp磁盘镜像:115.com/file/c2bqgit0#
个人分类: 其他技术|6488 次阅读|0 个评论
2012届硕士论文-王娟-基于Android平台的在线多媒体播放及搜索
tmdvc 2012-3-7 10:37
2012届硕士论文-王娟-基于Android平台的在线多媒体播放及搜索
王娟毕业论文答辩.pdf ppt-1
个人分类: 实验室硕士论文|3912 次阅读|0 个评论
亚马逊的星火,为什么不能燎原 ?
热度 3 yaoqizhou 2012-2-27 22:50
亚马逊的星火( Kindle )改成用触摸屏后,我也跟风买了一个。我喜欢触摸屏,来自于我很喜欢苹果公司的iPod和iPad, 简单易用,反应敏锐。我也喜欢电子墨屏,因为看书时,眼睛不会象看液晶显示那么累。 电子墨加 触摸 屏一定是完美的组合。 心想终于可以做到无纸读文献 。还可以 为保护森林,降低碳排放,贡献一份力量了 ! 俗话说得好,期望越高失望越大。到手之后,才发现第一页的设计是那么的粗糙,找功能 就得 找半天。触屏的反应奇慢,翻一页也得等。科研文献 pdf 文件不能兼容,转换成它的格式后就变得乱七八糟的。 3G 版也不能上网查电邮 只能逛它的网店, 而 WIFI 上网给的所谓实验版根本是一个笑话。 这样的 烂货 怎么还好意思拿出来卖!虽然用于看书还可以,但一机多用早已是当今的潮流。有人曾经把亚马逊的 CEOBezos 和苹果的乔布斯相提并论,说俩人都是完美主义,注重细节。在我看来,这俩人 完全 不是一个量级的。 Kindle 触摸屏的多功能根本就是垃圾。 Bezos 在发布 Kindle 触摸屏的同时也搞了个星火液晶显示的峰火( Fire )版。极可能是因为读过毛主席的星星之火可以燎原的大论。 但到目前还没好意思说 放血价的 Kindle Fire 到底卖了多少,而亚马逊上季的收入大跌 58 %。在我看来,什么星火,腐草萤光而已,怎能燎原? 中国地大物博, IT 人口众多 ,而 编程国际竞赛得奖 则 时有所闻。但我百思不得其解的是: iphone 山寨版能模仿得维妙维肖,为什么就不能开发出比 Kindle 触摸版 更 强的电子墨文献阅读器?如有,我马上买一个。想一想 Google 的 Android 可是开源软件, 而 硬件也就是搭搭积木。要不是我心有所属,情 有所锺 ,可真就要下海赤膊一战了 。 扭扭捏捏的 ITWSN ,还在等什么,就是她了!机 会 稍纵即逝啊!
个人分类: 政策评论|6130 次阅读|5 个评论
[转载]云存储平台Dropbox
zlhua 2011-12-27 20:06
  12月26日消息,美国科技网站9to5google周五报道,美国云存储平台Dropbox周四在 博客 上宣布推出支持Android平台的2.0版应用。一直以来Dropbox应用都可以让用户免费存储并轻松分享图片、文件和 视频 ,而新推出的Android版本进行了重新设计,采用了许多新特性。   Dropbox在介绍该应用的 收藏 特性时表示,用户可以在手机上存储文件,从而可快速地进行离线文件访问。新版应用的另一个亮点是增加了大容量上传特性。Dropbox在新闻稿中表示,用户可以在背景中选择多个图片和视频文件同时上传。   文件更名特性则允许用户重新命名文件夹。而单键接入允许用户通过一次点击就能访问文件或文件夹。此外,新版本还改善了界面、本地存储输出以及整体的稳定性。另外,新版本显示了对Android“冰淇淋三明治”系统的支持,同时还弥补了此前版本中存在的一些漏洞。该公司甚至允许用户在本周早些时候提前试用这一新的版本。   Dropbox成立于2007年,其服务支持所有流行的桌面和移动平台。媒体此前报道苹果前CEO史蒂夫· 乔布斯 (Steve Jobs)在2009年12月曾有意收购Dropbox。后来,苹果在最新的iOS系统中推出了iCloud服务,与Dropbox形成直接竞争。   Dropbox目前向用户免费提供2GB空间,用户还可以升级至Pro账户,拥有至多100GB空间。 Dropbox上月在博客上宣布了用户免费获得更多空间的几种方法。其中,如果用户邀请朋友采用Dropbox服务,则该用户可免费获赠250MB空间。此外,拥有有效学校电子邮件地址的学生每邀请一个人使用Dropbox服务,将得到500MB空间作为奖励。当然,用户需要证明学生身份。   用户现在可以从 Android Market下载Dropbox 2.0应用,然后立即邀请朋友采用Dropbox服务,就可以获赠更多存储空间。 来源:http://news.hexun.com/2011-12-26/136672973.html
个人分类: 快乐学习|1898 次阅读|0 个评论
安卓机器人的故事
nanoworm 2011-12-13 22:57
喜欢google的东西,android是其中之一吧
个人分类: 安卓|3101 次阅读|0 个评论
[转载]谷歌WebGL浏览器图形技术Angle现雏形
limiaoyi 2011-12-3 13:45
Angle是Google为Windows计算机开发的图形项目,目前已通过一个重要认证里程碑,可以提高某些浏览器的图形识别。谷歌于2010年3月推出Angle,是WebGL的图形辅助工具,借用新生的3D图形技术提升浏览器体验。 11.29,谷歌程序员Vangelis Kokkevis宣布,Angle已经通过OpenGL 2.0的认证测试套件。 WebGL提供了级别较低的图形界面,遵循MAC OS X,Linux的,iOS以及Android的OpenGL标准;但目前推广仍不及OpenGL。Windows自带微软标准的Direct3D,而 Angle主要是将OpenGL命令转换为Direct3D。 基于WebGL技术的Angle带来的3D地图特效(香港九龙区) Kokkevis表示:“Angle是我们继续努力向前推动网络平台的必要步骤。没有Angle,就不可能运行Windows计算机上的 WebGL标准,也无法启动MapsGL。MapsGL是一个可选的基于WebGL界面的谷歌地图3D建筑物,以及一些不同于普通在线地图工具的功能。” Angle被Chrome与Firefox用于Windows系统,以识别WebGL。这一点很重要, 微软对WebGL不太看好,但传统的游戏程序员渴望深挖挖掘网络建设,带来更复杂的2D和3D游戏支持。 说服微软来支持WebGL仍然是一个非常大的障碍。微软IE不支持WebGL,而开发者可以不依赖WebGL来制作游戏。对于用户来说,这意味着网站恼人的警告,如“这个游戏只运行在Firefox/Opera/Chrome最新版本。” (转自: 新浪科技 )
2429 次阅读|0 个评论
[转载]Free RSC Mobile app launched
yolandahongmei 2011-10-8 22:06
The Royal Society of Chemistry has launched a free mobile app that is now available on iTunes. RSC Mobile provides readers with access to search RSC journal content from the RSC Publishing Platform. Users at any institution or organisation that currently subscribe to RSC journals can access the same content on the RSC Mobile app using its wireless network. The benefits of RSC Mobile include: Up-to-the-minute access to RSC journals; Full text HTML and PDF access via wireless networks for subscribing institutions/organisations; The latest news from the RSC Publishing Platform; Saving articles for offline reading; Share your favourite content via email, Twitter or Facebook. Notes for editors: · The RSC Mobile app is available for iPad, iPhone and iPod and the Royal Society of Chemistry is currently developing the Android version, which will be available early 2012. More information, please see: http://www.rsc.org/AboutUs/News/PressReleases/2011/Mobileapp.asp
个人分类: 英国皇家化学会|3402 次阅读|0 个评论
[转载]编写一个基本的Android应用程序
putin24 2011-9-18 23:24
[转载]编写一个基本的Android应用程序
本节展示如何构建一个 Android 应用程序。示例应用程序非常简单:一个修改后的 “Hello Android” 应用程序。您将进行一个微小的修改,使屏幕背景全部变为白色,以便把手机用作手电筒。这个例子不是很有创意,但是可以作为一个有用的例子。请 下载 完整的源代码。 为了在 Eclipse 中创建应用程序,选择 File New Android project ,这将启动 New Android Project 向导。 图 1. New Android project 向导 接下来,创建一个简单的应用程序,该应用程序有一个活动,并且在 main.xml 中有一个 UI 布局。布局包含一个文本元素,您将修改这个文本元素,以显示 Android FlashLight。下面的清单显示了这个简单的布局。 清单 1. Flashlight 布局 ?xml version="1.0" encoding="utf-8"? LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/all_white" TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/all_black" android:gravity="center_horizontal"/ /LinearLayout 在 strings.xml 中创建两个颜色资源。 清单 2. strings.xml 中的颜色 ?xml version="1.0" encoding="utf-8"? resources string name="hello"Android FlashLight/string string name="app_name"FlashLight/string color name="all_white"#FFFFFF/color color name="all_black"#000000/color /resources 主屏幕布局有一个定义为 all_white 的背景色。在 strings.xml 文件中,可以看到 all_white 被定义为一个值为 #FFFFFF 的 RGB 三元组,即纯白。 布局包含一个 TextView,这实际上是一块静态文本。它是不可编辑的。文本被设为黑色,并通过 gravity 属性设为水平居中。 该应用程序有一个名为 FlashLight.java 的 Java 源文件,如以下清单所示。 清单 3. Flashlight.java package com.msi.flashlight; import android.app.Activity; import android.os.Bundle; public class FlashLight extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 该代码是直接来自 New Project 向导的模板代码: 它是 Java 包 com.msi.flashlight 的一部分。 它有两个 import: 一个用于 activity 类 一个用于 bundle 类 当该活动发起后,onCreate 方法被调用,传入一个 savedInstanceState。对于我们来说,不必关心这个 bundle。只有在暂停然后恢复活动时才会用到。 onCreate 方法覆盖了同名的 activity 类方法。它调用超类的 onCreate 方法。 对 setContentView() 的调用将关联 main.xml 文件中定义的 UI 布局。main.xml 和 strings.xml 中的任何内容都自动映射到 R.java 源文件中定义的常量。任何时候都不要直接编辑这个文件,因为它随着每次构建而改变。 运行该应用程序可以看到一个白色屏幕,其中有黑色文本。 图2:flashlight 的白色屏幕 下面显示用于 FlashLight 应用程序的 AndroidManifest.xml 文件。 清单 4. 用于 FlashLight 的 AndroidManifest.xml ?xml version="1.0" encoding="utf-8"? manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.msi.flashlight" android:versionCode="1" android:versionName="1.0.0" application android:icon="@drawable/icon" android:label="@string/app_name" activity android:name=".FlashLight" android:label="@string/app_name" intent-filter action android:name="android.intent.action.MAIN" / category android:name="android.intent.category.LAUNCHER" / /intent-filter /activity /application /manifest 该文件是由用于 Eclipse 的 Android Developer Tools 插件自动创建的。您不需要做任何事情。 FlashLight 源代码 os-android-devel-FlashLight.zip 参考资料 学习 The Open Handset Alliance 是一个由 47 家技术和移动公司组成的组织,这些公司共同致力于加快移动领域的创新,并提供更丰富、更廉价、更好的移动体验。他们一起开发了 Android,这是第一个完整的、开放的、免费的移动平台。 Android 开发人员站点 提供了文档、下载、日志等。 了解更多关于 Dalvik Virtual Machine 的信息。 观看 YouTube 上深入讨论 Dalvik VM 的 教程 。 Unlocking Android: A Developer's Guide 提供了 Android 操作系统和开发工具的简明、实用的说明。 要收听有关软件开发人员的有趣访谈和讨论,请浏览 developerWorks podcasts 。 随时关注 developerWorks 技术活动 和 网络广播 。 追随 developerWorks on Twitter 。 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动 。 访问 developerWorks 开放源码专区 ,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。 查看免费的 developerWorks 演示中心 ,观看并了解 IBM 及开源技术和产品功能。 获得产品和技术 下载 Android SDK 。 获得最新的 Eclipse IDE 。 使用 IBM 试用软件 改进您的下一个开发项目,这些软件可以通过下载获得。 下载 IBM 产品评估版 ,或者 在 IBM SOA Sandbox 中进行在线试用 ,获得来自 DB2®、 Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
个人分类: 技术研究|3944 次阅读|0 个评论
[转载]Android平台简介开发
putin24 2011-9-18 23:09
[转载]Android平台简介开发
简介 Android 是一种基于 Linux® V2.6 内核的综合操作环境。最初,Android 的部署目标是移动电话领域,包括智能电话和更廉价的翻盖手机。但是, Android 全面的计算服务和丰富的功能支持完全有能力扩展到移动电话市场以外。Android 也可以用于其他的平台和应用程序。 黑莓和 iPhone 都提供了受欢迎的、高容量的移动平台,但是却分别针对两个不同的消费群体。黑莓是企业业务用户的不二选择。但是,作为一种消费设备,它在易用性和 “新奇特性” 方面难以和 iPhone 抗衡。Android 则是一个年轻的、有待开发的平台,它有潜力同时涵盖移动电话的两个不同消费群体,甚至可能缩小工作和娱乐之间的差别 如今,很多基于网络或有网络支持的设备都运行某种 Linux 内核。这是一种可靠的平台:可经济有效地进行部署和提供支持,并且可直接作为面向部署的良好的设计方法。这些设备的 UI 通常是基于 HTML 的,可通过 PC 或 Mac 浏览器查看。但并不是每个设备都需要通过一个常规的计算设备来控制。想象一下传统的家用电器,例如电炉、微波炉或面包机。如果您的家用电器由 Android 控制,并且有一个彩色触摸屏,会怎么样?如果电炉上有一个 Android UI,那么操控者甚至可以烹饪点什么东西。 在本文中,了解 Android 平台,以及如何将它用于移动和非移动应用程序。安装 Android SDK,并构建一个简单的应用程序。 下载 本文中的示例应用程序的源代码。 Android 简史 Android 平台是 Open Handset Alliance 的成果,Open Handset Alliance 组织由一群共同致力于构建更好的移动电话的公司组成。这个组织由 Google 领导,包括移动运营商、手持设备制造商、零部件制造商、软件解决方案和平台提供商以及市场营销公司。从软件开发的观点看,Android 正处在开源领域的中心位置。 市场上第一款支持 Android 的手机是由 HTC 制造并由 T-Mobile 供应的 G1。这款设备从设想到推出花了大约一年的时间,惟一可用的软件开发工具是一些实行增量改进的 SDK 发行版。随着 G1 发行日的临近,Android 团队发布了 SDK V1.0,用于这个新平台的应用程序也浮出水面。 为了鼓励创新,Google 举办了两届 “Android Developer Challenges”,为优胜的参赛作品提供数百万美金的奖励。G1 问世几个月之后,随后就发布了 Android Market,它使用户可以浏览应用程序,并且可以将应用程序直接下载到他们的手机上。经过大约 18 个月,一个新的移动平台进入公众领域。 Android 平台 Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括: 窗口 视图 用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件 Android 包括一个构建在 WebKit 基础上的可嵌入浏览器,iPhone 的 Mobile Safari 浏览器同样也是以 WebKit 为基础。 Android 提供多种连接选项,包括 WiFi、蓝牙和通过蜂窝(cellular)连接的无线数据传输(例如 GPRS、EDGE 和 3G)。Android 应用程序中一项流行的技术是链接到 Google 地图,以便在应用程序中显示地址。Android 软件栈还提供对基于位置的服务(例如 GPS)和加速计的支持,不过并不是所有的 Android 设备都配备了必需的硬件。另外还有摄像支持。 过去,移动应用程序努力向桌面应用程序看齐的两个领域分别是图形/媒体和数据存储方法。Android 通过提供对 2D 和 3D 图形的内置支持,包括 OpenGL 库,解决了图形方面的挑战。由于 Android 平台包括流行的开源 SQLite 数据库,因此缓解了数据存储的负担。图 1 显示一个简化的 Android 软件层次结构。 图 1. Android 软件层次结构 应用程序架构 如前所述,Android 运行在 Linux 内核上。Android 应用程序是用 Java 编程语言编写的,它们在一个虚拟机(VM)中运行。需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中,如下图所示。 图 2. Dalvik VM Android 应用程序由一个或多个组件组成: 活动 具有可视 UI 的应用程序是用活动实现的。当用户从主屏幕或应用程序启动器选择一个应用程序时,就会开始一个动作。 服务 服务应该用于任何需要持续较长时间的应用程序,例如网络监视器或更新检查应用程序。 内容提供程序 可以将内容提供程序看作数据库服务器。内容提供程序的任务是管理对持久数据的访问,例如 SQLite 数据库。如果应用程序非常简单,那么可能不需要创建内容提供程序。如果要构建一个较大的应用程序,或者构建需要为多个活动或应用程序提供数据的应用程序, 那么可以使用内容提供程序实现数据访问。 广播接收器 Android 应用程序可用于处理一个数据元素,或者对一个事件(例如接收文本消息)做出响应。 Android 应用程序是连同一个 AndroidManifest.xml 文件一起部署到设备的。AndroidManifest.xml 包含必要的配置信息,以便将它适当地安装到设备。它包括必需的类名和应用程序能够处理的事件类型,以及运行应用程序所需的许可。例如,如果应用程序需要访 问网络 — 例如为了下载一个文件 — 那么 manifest 文件中必须显式地列出该许可。很多应用程序可能启用了这个特定的许可。这种声明式安全性有助于减少恶意应用程序损害设备的可能性。 所需的工具 开始开发 Android 应用程序的最简捷的方式是下载 Android SDK 和 Eclipse IDE(参见 参考资料 )。Android 开发可以在 Microsoft® Windows®、Mac OS X 或 Linux 上进行。 本文假设您使用的是 Eclipse IDE 和用于 Eclipse 的 Android Developer Tools 插件。Android 应用程序是用 Java 语言编写的,但是是在 Dalvik VM(非 Java 虚拟机)中编译和执行的。在 Eclipse 中用 Java 语言编程非常简单;Eclipse 提供一个丰富的 Java 环境,包括上下文敏感帮助和代码提示。Java 代码通过编译后,Android Developer Tools 可确保适当地将它打包,包括 AndroidManifest.xml 文件。 虽然没有 Eclipse 和 Android Developer Tools 插件也可以开发 Android 应用程序,但是那样就需要熟悉 Android SDK。 Android SDK 是作为一个 ZIP 文件发布的,可以将该文件解压到硬盘上的一个目录中。由于有多个 SDK 更新,建议有意识地组织开发环境,以便在不同的 SDK 安装之间轻松地切换。SDK 包括: android.jar Java 归档文件,其中包含构建应用程序所需的所有的 Android SDK 类。 documention.html 和 docs 目录 本地和网上提供的 SDK 文档。这些文档的主要形式为 JavaDocs,以便于在 SDK 中导航大量的包。文档还包括一个高级开发指南和 Android 社区的链接。 Samples 目录 samples 子目录包含各种应用程序的源代码,包括 ApiDemo,该应用程序演示了很多 API。这个示例应用程序可以作为 Android 应用程序开发的良好起点。 Tools 目录 包含所有用于构建 Android 应用程序的命令行工具。最常用、最有用的工具是 adb 实用程序(Android Debug Bridge)。 usb_driver 该目录包含将开发环境连接到支持 Android 的设备(例如 G1 或 Android Dev 1 解锁开发手机)所需的驱动程序。只有 Windows 平台的开发人员才需要这些文件。 Android 应用程序可以在实际的设备上运行,也可以在 Android SDK 附带的 Android Emulator 上运行。 Android Debug Bridge adb 实用程序支持一些可选命令行参数,以提供强大的特性,例如复制文件到设备或从设备复制文件。可以使用 shell 命令行参数连接到手机本身,并发送基本的 shell 命令。图 3 显示在通过 USB 线连接到 Windows 笔记本电脑的一个实际设备上运行的 adb shell 命令。 图 3. 使用 adb shell 命令 在这个 shell 环境中,可以: 显示网络配置,网络配置可显示多个网络连接。注意这多个网络连接: lo 是本地或 loopback 连接。 tiwlan0 是 WiFi 连接,该连接由本地 DHCP 服务器提供一个地址。 显示 PATH 环境变量的内容。 执行 su 命令,以成为超级用户。 将目录改为 /data/app,其中存放用户应用程序。 列出包含某个应用程序的目录。Android 应用程序文件实际上是归档文件,可通过 WinZip 之类的软件查看。扩展名为 apk。 发出 ping 命令,查看 Google.com 是否可用。 从相同的命令提示符环境中,还可以与 SQLite 数据库交互,启动程序以及执行许多其他系统级任务。想像一下您正在连接到电话,因此这是非常了不起的功能。 来源文献:http://www.ibm.com/developerworks/cn/opensource/os-android-devel/#author1,作者: Frank Ableson
个人分类: 技术研究|3127 次阅读|0 个评论
谷歌Android手机的一些有趣应用软件
热度 2 Minuskid 2011-8-15 16:03
Google 暑期大学生博客分享大赛 - 2011 Android 成长篇 Google 暑期大学生博客分享比赛-2011 Android 成长篇 相比诺基亚的塞班系统来说,开源的谷歌Android手机软件应用的使用体验要明显高的多,Google Android智能手机平台自从发布后空前成功,获得了如HTC、摩托罗拉、三星、索爱等知名手机商的支持,同时也吸引了越来越多的用户和开发者加入其阵营,其流行和普及的程度已经逼近苹果的iPhone手机平台。   Android平台上的应用非常多,其谷歌应用商店里可以找到各类应用,安装、升级和卸载都非常方便,最另其他平台羡慕的可能是Android应用程序可以直接复制文件到SD卡后安装使用,这为手机应用的备份和恢复提供了非常简单易行的操作模式。下面我就总结的一些最为常用Android手机应用程序列表,欢迎大家补充。 系统工具   来电通   显示来电号码归属地、号码类型,电话短信过滤功能,过滤不希望接听/接收的电话或短信,自动IP电话拨号,自动判断长途电话,自动加拨相应的IP前缀等等功能,该应用在S60平台上也有。   RootExplorer   相当于电脑上的资源管理器,但需要将手机刷机Root后才好使用,具有Root权限后,使用这个工具可以随意操作手机内以及SD卡上的文件,还可以修改文件的权限。喜欢折腾的用户必备。   ES文件浏览器   ES文件浏览器的功能和RootExplorer类似,但不需要Root权限,支持本地文件管理、方便用户对手机和SD卡上的文件/文件夹进行各种操作,新装手机用户可以使用这个工具来安装、卸载、备份应用程序。   ES任务管理器   ES任务管理器是一个手机上的任务管理器,这款软件能够释放内存,卸载应用,清除缓存,节约电量,加速手机。支持桌面Widget,可实现一键释放内存。   优化大师   优化大师提供了手机体检、开机加速、批量卸载、文件管理及数个附加的工具软件。能够有效地帮助用户了解自己的手机软硬件信息;提升手机开机速度;扫描有危险的软件。 Terminal Emulator   手机上的超级终端软件,Android是基于Linux内核的,对于喜欢研究底层的朋友来说,自然不会放过搞明白Linux层面上一些东西的机会。使用Terminal Emulator来启动模拟器并进入shell界面,就可以运行Linux命令,如果手机已经刷机Root了,那还可以使用su进入系统管理员权限。此应用高手必备。   缓存助手   缓存助手在Root权限下可以清除用户系统的缓存,增加使用空间。   百度输入法   Android上的拼音输入法非常多,这点iPhone可比不了,常用的输入法有:百度、谷歌、搜狗、QQ、触宝、91等多种中文拼音输入法,个人感觉百度手机输入法要好用一点。   条码扫描器   BarcodeScanner可用于扫描条码,对于提供网址条码的应用,只需要一扫就自动识别并打开相应的处理程序,可以直接跳转到电子市场进行安装,非常方便。   LauncherPro   Android桌面增强软件,可显示华丽的用户界面,占用系统资源也较少。   HiAPN   海卓HiAPN是一个APN开关应用,提供了在桌面快捷切换通信网络和关闭开启GPRS的功能。Android手机最糟糕的一个设置就是GPRS一经开启就一直连线,并很快耗光手机的电池,因此人们不得不使用所谓的APN开关应用,上网前打开APN,下网后断开APN,整个上网过程比S60和iPhone都糟糕很多。HiAPN可以在桌面上生成一个APN开关,这样打开关闭APN相对来说简单多了。    娱乐应用   天天动听   天天动听是一款集播放、音效、搜索、下载等众多功能于一身,完全免费的手机音乐播放器,支持多种手机平台,操作简易,具有自动下载歌词和专辑图片的功能,是Android平台上最佳的手机音乐播放器之一。   RockPlayer   强悍的视频播放器软件,它几乎支持市面上所有的媒体格式,可播放高清RMVB视频,是Android平台上性能最高、支持格式最广泛的视频播放程序之一。   FBReader   FBReader是Android上开源的EPUB电子书阅读器,使用过iPad和iPhone的同学一定会存有大量EPUB格式的书籍,将其复制到SD卡上,使用FBReader即可进行EPUB阅读。   百阅   百阅是集阅读与社区为一体的手机看书软件,支持多个手机平台,可离线阅读手机内的BRM、UMD和TXT电子书,也可在线阅读网络电子书。   开卷有益   开卷有益是一款掌上阅读利器,阅读多格式文字作品、内置智能排版引擎、智能搜索程式。支持TXT、CHM、UMD、HTML等格式的电子书。    网络应用   谷歌地图   手机版谷歌地图软件,目前手机上公认的最佳地图应用,支持语音导航提醒,支持街景模式,还具有实验室功能,与其他手机平台的谷歌地图相比,Android平台上的谷歌地图功能最多最完善,并且对于中国地图来说没有地理位置偏移。   UC浏览器   UC浏览器是国内使用量最大的手机浏览器之一,支持WEB、WAP页面浏览,速度快而稳定,流量数据压缩率很高,很省流量,对网页进行缩放浏览,优化排版渲染效果,使用户在手机上也能有很好的上网浏览体验。 Opera Mini   Opera Mini有好几个版本,建议使用国际版,该浏览器最大的特色就是支持自动代理服务器,对于中国用户来说,使用Opera Mini后会发现可以从手机上访问Twitter、Youtube等原先无法访问的网站。   Twidroyd   Twidroyd是一个很好用的Twitter客户端,我们都知道,在中国,Twitter官方的Android是无法连接上Twitter的,而Twidroyd支持自定义API,使用这个应用可以很方便的上Twitter,效果很不错。Android下的Twitter客户端Twidroyd使用方法是,先用Twip建立一个基于OAuth的API,然后在这个API上登录Twitter帐号,保存一个新的登录密码,之后在Twidroyd下使用这个API,用Twitter的用户名和保存的新密码即可登录,在手机上不需翻墙。   新浪微博   新浪微博薄的Android客户端,可以从Android手机上看新浪微薄的信息,界面不错,使用体验远远优于S60手机上的同名程序。   腾讯微博   腾讯微博的Android客户端,除了配色外,其他功能和新浪微博基本一样。   Foursquare   虽然网页版的Foursquare依然 无法从国内访问 ,但是移动版本的Foursquare已经恢复了,经过实际测试,下载安装最新iPhone和Android版本的Foursquare后,不需要翻墙直接就能访问,原先需要寻找API才能访问,而现在直接即可访问,据猜测,估计是手机上的Foursquare使用了HTTPS加密通道,所以就能访问。   街旁   街旁是一个类似Foursquare的国产LBS应用,由于其所谓的客户端应用采用的是内嵌网页的形式,因此速度和定位感觉比较慢,经常需要刷新才能出数据。   网易八方   网易推出一款基于LBS地理位置服务的移动社交平台“网易八方”,开启了门户网站推LBS的先河。这是网易看好LBS应用,进军移动互联网的一步棋。这个服务和Foursquare非常类似,用户尝试在新地点“签到”,还可以获得“勋章”,同时,系统支持同步到网易微博、新浪微博、人人网、开心网、豆瓣等平台。   飞信   中国移动的飞信应用可以通过WiFi免费发短消息给自己的好友,对于短信控一族非常有用。   腾讯QQ   腾讯QQ的官方Android手机客户端,体积非常庞大,但功能看上去似乎并不太多。   SugarSync   鉴于手机版的 Dropbox无法从国内访问 ,因此只好用SugarSync这个同样支持Android手机的类Dropbox云存储应用,用户可以通过手机访问到自己远端电脑上的同步文件,还可以将手机上的文件上传到云服务器端,很好用,就是感觉传输速度好像没Dropbox快,期待着Dropbox早日解封。   优酷   优酷的Android手机版,既然不让中国用户访问YouTube,那就只好访问YouKu了。   奇艺   百度奇艺Android手机版提供了大量正版的免费高清电影、电视剧观看,速度不错。   掌上百度    掌上百度 是百度为Android手机用户做的客户端软件,除了具有百度搜索功能外,还整合了百度贴吧、知道、新闻等社区平台,界面较为简洁、清晰。   NewsRob   NewsRob是Google Reader的阅读器的手机版,自动同步,支持离线,显示和阅读效果做得不错,不过需要注意的是,其自动同步比较耗费流量,没有包月的用户最好关闭这个功能。   随手记   随手记是一款个人理财手机应用,在购物、在旅游都能随时随地记账,界面做的很不错,支持和WEB服务器进行同步。   豆瓣电台   豆瓣电台是豆瓣网推出的一个在线音乐收听页面,类似Last.FM,通过用户的“收藏、标记”操作记录和播放频次来统计出用户对音乐家音乐风格的偏好,并推荐给用户喜欢的歌曲,其Android手机客户端需要联网才能听歌,摇动手机即能跳到下一首歌曲。   Shazam   Shazam是一个音乐识别软件,很多人可能常常会碰到这样的情况:在收音机或电视里听到一首好听的歌,却不知道歌名叫什么,谁唱的。将手机对着正在播放的音乐,让Shazam帮你听一下,它就可以告诉你歌曲的名字、专辑的名称还有作者,界面有中文版,中国的歌曲也可以识别出来。   总而言之,谷歌Android智能手机平台上的应用非常丰富,已经远远超过了S60平台和黑莓平台,直逼苹果iOS平台,做为一个物美价廉的手机系统,Android手机的未来非常令人看好。
9926 次阅读|3 个评论
大胆尝试——成功把手机刷机(android系统)
热度 1 pinjianlu 2011-8-14 10:33
手机是三星的,安卓系统。成功取得Root权限后把一个系统软件错误删除,不得不重新刷ROM。 在网上找到的教程都是说按住三个键:“音量-”、“Home”和“开机键”,每次都只能进入卸载模式,只能对用户数据和一些缓存进行删除,于是我自己大胆尝试按住“音量+”、“Home”和“开机键”,成功进入Recovery模式,OK,刷机成功。 其实做事就是需要这种精神:大胆假设+小心求证,做科研不也是如此吗?!
个人分类: 心路历程|2610 次阅读|2 个评论
Android Eclipse开发环境的建立
seawan 2011-7-23 13:27
(有些“指南”之类太过时,或者太罗嗦。) 简单说,就是: 1. JDK(如果没有的话); 2. Eclipse,使用 Classic版。Java版也可。 3. Android SDK, 使用下面网页,在线安装。(仅选择你需要的平台,例如我使用API 7的版本。以后再说其他版本)。 http://developer.android.com/sdk/installing.html 4.用于Eclipse的安卓开发工具:ADT: 在Eclipse-windows-install new software中,添加下面地址: https : //dl-ssl.google.com/android/eclipse/ 就可找到要安装的东西。 在开始使用前,还有一个步骤: 在windows-preference中设置android的路径。(太不智能了,以后该步骤可能会被铲除)。 另外,如果你希望使用虚拟机来调试,还需要在windows-anfroid AVD manager里面加一个虚拟设备。 over
个人分类: 好工具|2933 次阅读|0 个评论
电子书阅读器
liumwei 2011-4-20 22:42
目前,Linux系统已经深入到各行各业种,很多人都在接触Linux系统。特别是搞科学计算的那群人,更是如此。远的不少说,就目前很流行的 Android系统就是Linux系统的一种。只不过,它适合运行于手持设备等终端上。此外,如果你是palm手机的忠实用户,其卖给HP的webos也 是Linux系统。在这些手持设备上,常常能看到电子书的身影。其实这些手持电子书多数都是个头很小txt的文本文件。但是经过电子阅读器的处理,变得特 别适合阅读。 palm pre上的电子阅读器pReader 你可能会想,在Linux-PC中有没有这种阅读器呢。当然,那些Linux系统的使用高手,可能觉得不屑一顾,而且,还会觉得这样想是不是脑子哪里不正 常:Linux下随便找个软件(firefox、gedit、mousePad)就可打开这种文件,甚至是采用linux下的终端命令(vim、 nano),也能很好地完成这种任务。但是,它们似乎对一般阅读者而言,还是显得有点单薄和不方便。毕竟,尺有所长,就有所短。而且,如果是这样,手机生 产商为什么不劝说用户直接命令打开txt的电子书呢?看看下面的Linux中常见的文本编辑器以及终端命令打开txt文件的结果的图片,可能就有感受了: Vim命令打开txt电子书 nano命令打开电子书 文本编辑器mousePad打开txt电子书 那么在Linux下有没有这样的电子书阅读器呢?答案是肯定的。这里推荐一个可运行很好运行于BioInfoServ 4.0/Ubuntu 10.04的电子书阅读器BFReader。先看其使用界面和文件打开状况,和前面的比较一下,看看那个看起来舒服点,更适合用户操作点。 很显然, BFReader 显示的效果最好,而且有利于阅读中的操作。这 个软件目前能支持fb2、html、chm、plucker、 palmdoc、ztxt、tcr (psion text)、rtf、oeb、openreader、non-DRM'ed、mobipocket和plain text等格式的电子书,而且它还能直接从tar、zip、gzip、bzip2等电子书压缩包中直接将电子书读出显示。此外,它支持电子书的管理和搜索 下载。是一个十分不错的多平台电子书阅读器。 目前这个软件,已经收录到 BioInfoServ 4.0的软件仓库 中,能很好地支持中文电子书的显示和阅读。如果你发现中文乱码的话,需打开该软件的“设置“界面,在“语言“和“样式“选单中,选取相应的字符编码以及字体即可。如下: 当然,还有其他的电子书阅读器,还有 Calibre 、 QReader 、Amazon Kindle2、 Evince 、 Lucidor 和 Sigil 等。
个人分类: Linux软件|5394 次阅读|0 个评论
Android智能手机软件开发入门正式开课!
热度 2 danfouer 2011-3-26 22:07
学习意义: 种种迹象表明,未来 IT 产业的发展方向将是“移动终端 + 云计算”,目前,全球已进入移动互联网周期的早期阶段,各大 IT 巨头、门户网站、传播媒体、公司企业纷纷推出自己的移动战略,希望在一个即将到来的万亿级移动应用大时代中占据领先地位。 Android 平台是一个拥有巨大发展前景智能手机平台,同时学习门槛较低,仅需一台普通电脑便可从事开发工作,适合在校大学生上手入门。你的个人移动战略,从选择本课程开始! 我为什么要开这门课? 1.大量的 PC 应用希望转移到手机上来 2.在中南民大推广 Android 应用开发 中南民大 Android 推广战略: 公选课程 - 学生社团 - 开发团队 - 创业伙伴 我推崇的学习态度 : 要想了解一个新的领域,就去开一门这个领域的课程 要想了解一个新的领域,就写一本关于那个领域的书 大学里为什么要有学生?那是因为老师有不懂的东西,需要学生来帮助解答 —— 约 · 阿奇博尔德 · 惠勒 本课程的考核方式 : 三个人一组 实现一个应用 下载到我的 MotorolaXT800 上运行 当众接受我的提问 提交三份报告,一人写一份,打印提交 需求分析报告 总体设计报告 详细设计报告 学习要求:六多二少 多编程 多尝试 多看书 多逛相关网站、 BBS 多讨论 多交朋友 少依赖 少找借口
6551 次阅读|0 个评论
[转载]android GPS 应用
bluewind23 2011-3-24 15:38
HAL introdution: HAL(hardware abstraction layer)存在的目的在与让android framework与linux device driver分离开来.上层应用通过Dalvik VM与core services【runtime】(如sensor service,camera service等)来加载动态库文件(*.so),这里的so文件指的是HAL的实现,core service通过JNI接口调用HAL层提供的接口,这样就实现了android 应用程序对硬件的操作。 在Android源码中,HAL的主要实现位于hardware/目录下,老的实现版本和新的实现版本并存,老的HAL实现是通过JNI层直接加载动态链接库的方式,如下图所示: 图引用自: http://www.jollen.org/blog/ 新的HAL实现仍然是以加载动态链接库的方式来与linux device driver通信,不过libhardware屏蔽了具体的加载细节,每种应用以HAL stub的概念呈现给JNI层,一个HAL stub编译成一个动态链接库文件,结构如下图所示: 图引用自: http://www.jollen.org/blog/ 移植一个新的HAL实现需要开发人员编写HAL module(stub),上层应用通过libhardware获取HAL module的一系列回调函数(callback ops),这一系列回调函数直接与底层的linux device driver通信(一般是通过读写设备文件来实现的)。 目前,HAL对上层还不能完全做到与硬件无关,往往厂家添加自己的硬件设备需要改动相应的runtime(service)实现,android手机一般情况下需要的实现的HAL功能有: Camera GPS RIL WLAN BlueTooth Sensor vibrator等 GPS的HAL 实现: 在这里探讨的GPS HAL实例采用的是老的HAL实现方式,主要的实现代码位置: frameworks/base/location/* (client) frameworks/base/core/jni/android_location_GpsLocationProvider.cpp (JNI ) frameworks/base/services/java/com/android/serverLocationManagerService .java(service) hardware/libhardware_legacy/gps/* (HAL) 首先介绍几个重要的数据结构: /** Callback with location information. */ typedef void (* gps_location_callback)(GpsLocation* location); /** Callback with status information. */ typedef void (* gps_status_callback)(GpsStatus* status); /** Callback with SV status information. */ typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); /** GPS callback structure. */ typedef struct { gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb; } GpsCallbacks; /*GPS 接口*/ typedef struct { /** * Opens the interface and provides the callback routines * to the implemenation of this interface. */ int ( * init) ( GpsCallbacks* callbacks ) ; /** Starts navigating. */ int ( * start) ( void ) ; /** Stops navigating. */ int ( * stop) ( void ) ; /** Closes the interface. */ void ( * cleanup) ( void ) ; /** Injects the current time. */ int ( * inject_time) ( GpsUtcTime time , int64_t timeReference, int uncertainty) ; /** Injects current location from another location provider * (typically cell ID). * latitude and longitude are measured in degrees * expected accuracy is measured in meters */ int ( * inject_location) ( double latitude, double longitude, float accuracy) ; /** * Specifies that the next call to start will not use the * information defined in the flags. GPS_DELETE_ALL is passed for * a cold start. */ void ( * delete_aiding_data) ( GpsAidingData flags) ; /** * fix_frequency represents the time between fixes in seconds. * Set fix_frequency to zero for a single-shot fix. */ int ( * set_position_mode) ( GpsPositionMode mode, int fix_frequency) ; /** Get a pointer to extension information. */ const void * ( * get_extension) ( const char * name) ; } GpsInterface; GPS 的HAL 实现主要工作就是填充一个 GpsInterface结构,android应用启动 LOCATION_SERVICE时,将检测系统是否支持GPS应用,若支持GPS,则在JNI层初始化GPS设备时将返回一个 GpsInterface结构,然后通过JNI层的回调函数将GPS信息发送给framework层,调用过程如下所示: 在GpsInterface-Start后,启用读线程通过epoll检测GPS设备文件的状态,若受到数据则读取NEMA数据,将数据解析后,根据解析后的数据填充GpsStatus, GpsLocation和GpsSvInfo结构,然后调用相应的JNI层在Init时传进来的回调函数,service部分的代码将自动更新GPS信息。 转载: http://blog.csdn.net/evilcode/archive/2010/09/03/5860759.aspx
个人分类: 转摘文章|4777 次阅读|0 个评论
[转载]Android 应用程序快速启动的秘诀
bluewind23 2011-3-24 14:25
Android 系统框架和上层应用是类 java( 不是正统的 sun java) 开发的,实现了自己的 java 虚拟机 dalvik ,既然用 java 虚拟机和 java 开发,一般都会认为效率低下。其实不然,在基本主流的智能手机的软件平台上, android 的执行速度是最快的。 那么 android 效率为什么这么的高呢 ? 特别是一个应用程序的启动时间很短,本文主要从以下个八方面进行分析: 1 、 资源文件的优化读取。 我们知道 android 在 UI 开发时有个很大的好处是 xml 文件来描述 UI ,这样有个好处是只要修改 UI 不用修改代码就可以修改界面的布局、显示风格和字体大小等。界面定义变得灵活方便。 xml 配置 UI 在 qtopia 运用也有但是这么强大并且也不广泛,因为 xml 文件有个不足是解析 xml 的效率很低。 Android 是怎么做的呢 ? Android 在编译的时候就把 xml 文件进行了优化, android 应用程序在解析时变得非常的高效。我们看到 apk 文件解压后会有个优化过的资源文件。 2 、 安装时进行优化 dex 文件 Android 的应用程序都打包成一个 apk 文件,实际上就是一个 zip 文件。系统第一次起来或应用程序第一次安装时,系统就把 apk 文件解压了,把可执行文件 dex 优化成 odex 文件并放在 /data/dalvik-cache 目录下。优化后的 dex 文件启动速度会加快。这解释了为什么 android 系统第一次启动是比较慢,以后起来很快了。 可能有人会问:为什么不在编译时直接优化呢 ? 第⑤项会回答这个问题。 3 、 制作数据库 Android 的图形应用是加载整个 sd 卡内的所有图像的,但是为什么很快呢 ? 其实 android 提前把数据做成了数据库,所以不用每次扫描整个这个 sd 卡,大大加快了启动速度。 4 、 高效的虚拟机 Android 是基于类 java 虚拟机 dalvik ,一般的 java 虚拟机是基于栈的,而 dalvik 是基于寄存器的。实事求是说我对两者的区别了解不是很深入,不过网上有专门的相关文论进行分析。我的简单理解是栈的实现方式相对容易,相关数据是在内存中的栈里,而操作寄存器里数据的速度明显快与内存里的数据处理。 5 、 充分挖掘 CPU 的性能 Android 刚出来的时候虽然支持 arm cpu ,实际上只支持 armv5te 的指令集的,因为 android 系统专门为 armv5te 进行了优化,充分利用 armv5te 的执行流水线来提高执行的效率,这也是在 500M 的三星 2440 运行效果不是很好,而在 200M 的 omap cpu 上运行比较流畅的原因了,所以在最新的代码中有专门针对 x86 和 armv4 的优化部分。 6 、 优化和裁剪的 libc 库 Libc 库几乎是所以库和程序的基础,但是 android 没有直接利用 libc 库,而是自己开发了一个库: bionic ,它实现了 libc 库的绝大多数的函数并根据平台进行了优化,但是有系统很少用并且消耗资源的少数函数是不支持的。它只有几百 k ,节省了空间同时也提高了执行效率。实际上体现了 20-80 原则,抓住少数重要的适当舍弃不必要的。 7 、 充分利用 linux 系统特性 分析过 linux 内核的朋友知道, linux fork 一个新的进程是非常高效的,利用了 COW 机制。 Android 是每个进程是个独立的虚拟机 ( 听说这么设计是为安全考虑,某个时候进程崩溃了不会影响这个系统和其他进程。 )android 里每个进程都是基于虚拟机的,并且也要加载基本的库,实际上这些都是共享。所以 android 启动一个新的程序实际上并不消耗很多的内存和 cpu 资源。 同时 android 在后台有个 empty process 运行,实际上就是运行一个虚拟机,当要启动一个应用时就直接在其上继续运行, qtopia 也有这个机制。 Android 系统在开机流程中:启动虚拟机—》启动 system server ? 》启动 launcher 。当初分析代码时疑惑为什么不直接启动 system server?(qtopia 就是直接启动 server) ,实际上也利用了 linux 的这个特性。 这个特性说的比较简略,不过要真的把他解释清楚可能需要很大的篇幅。 8 、 高效的 paint 机制 这个特性可能跟启动关系不大,但是也是 android 高效的特性之一。界面变化时大部分实际上不是全屏内容变化的,只是局部变化, android 会根据变化的内容只是跟新局部的内容,也提高了效率。这个也提醒我们在开发应用程序时,重载 paint 方法时尽量不要 paint 全屏内容。 转载: http://www.eoeandroid.com/thread-28579-1-1.html
个人分类: 转摘文章|2831 次阅读|0 个评论
Android系统与应用开发培训班(1)
jackymiao2 2011-2-22 12:42
热线:热线:021-51875830 0755-61280252 025-68662821 010-51292078 传真:021-62450161 业务手机:15921673576 详情请访问网站: http://www.51qianru.cn Android系统与应用开发班 课程目标 1、了解Android平台及其开发环境; 2、掌握并会运用Android应用的各种元素; 3、掌握并会运用Android的各种数据存储和获取方式; 4、掌握并会运用Android的安全模式。 入学要求 本课程面向希望把握3G历史性机遇,成为3G移动互联网紧缺人才,并拥有一年以上软件开发经验或计算机相关专业硕士学历(包括在读),同时具备Java语言基础的开发者; 本课程同样适用于希望了解Android开发知识,为未来业务转型奠定基础的企业技术团队。 班级规模及环境 为了保证培训效果,增加互动环节,我们坚持小班授课,每期报名人数限5人,多余人员安排到下一期进行。 开课时间和上课地点 上课地点:华东师范大学/银城大厦(上海市,地铁3号线或4号线金沙江路站旁) 最近开班有周末班/连续班/晚班 学时和学费   ☆课时: 共12天,96学时 ☆外地学员:代理安排食宿(需提前预定) ☆合格学员免费颁发相关资格证书,提升您的职业资质 作为最早专注于嵌入式培训的专业机构,曙海嵌入式学院提供的证书得到本行业的广泛认 可,学员的能力得到大家的认同。 ☆合格学员免费推荐工作 最新优惠 ☆团体报名优惠措施:两人95折优惠,三人或三人以上9折优惠 质量保障 1、培训过程中,如有部分内容理解不透或消化不好,可免费在以后培训班中重听; 2、培训结束后免费提供一个月的技术支持,充分保证培训后出效果; 3、培训合格学员可享受免费推荐就业机会。   课程大纲 Android应用开发部分 阶段 培训内容 第一阶段 1.Android平台介绍 2.Android平台特性 3.Android平台架构 4.在模拟器上运行Andriod 系统 5.配置开发环境 6.创建Android工程 7.调试技巧 8.Android核心模块及相关技术分析 9.Android项目结构分析  1)drawable  2)layout  3)values(strings.xml、colors.xml、arrays.xml等)  4)R.java分析及使用  5)AndroidManifest.xml分析 10.Android的源代码结构与编译方法 实验: a.三种方法编写一个Hello Android的程序,深化认识Android平台的结构 b.搭建开发环境 本实验将亲手安装Android SDK以及建立Eclipse和ADT插件的开发环境 c.导入开源RssReader的项目工程 本实验通过一个开源项目创建一个项目工程。 d.启动、使用模拟器;编译到设备并在设备上运行 本实验通过IDE中启动模拟器并通过模拟器进行断点调试,并对项目的整体架构有简单的了解。 第二阶段 11.Android应用剖析(上) 12.Activity  1)Activity的生命周期  2)Activity有四种本质区别的状态  3)保存持久状态  4)权限许可  5)进程的生命周期  6)继承Activity类应该注意的问题 13.Intent Receiver  1) Intent的作用和目的  2) 属性讲解  3) action属性  4) data属性  5) category属性  6) type属性  7) component属性  8) extras属性  9) Android如何定义以及如何解析Intent   a.直接Intent   b.间接Intent  10) AndroidManifest.xml深入分析  11) Service   a)什么是Service   b) 如何使用Service   c) Service的生命周期   d) BroadcastReceiver的使用 14. Content Provider使用  1) SQLite介绍  2) 创建Content Providers  3) 使用Content Providers   a) 使用URI语法来做以下动作:   b) Querying for Data 查询资料   c) Modifying Data 修改资料   d) Adding a Record 增加资料   e) Deleting a Record 刪除资料 Android应用剖析(下) 用户界面设计 AndroidManifest.xml剖析 通知 实验: a.怎样显示各种字体 b.怎样显示各种图片 c.怎样实现3D动画效果。 d.以示例讲解菜单的生成、响应菜单项点击、增加子菜单功能 本实验将主要对Android应用程序中菜单的相关处理方法。 e.以示例讲解让Activity以全屏方式显示以及为Activity屏幕的标题添加图标功能   本实验将主要对Activity的相关技巧方面处理方法。 f.处理非res资源的例子  本实验将主要对非res资源的处理方法,以扩展开发程序的方法和思路。 g.一步一步的分析讲解并对其Activity和Intent的实现  本实验将以RssReader项目为目标,逐步从无到有实现其功能,主要讲解其中的 Activity和Intent的实现过程。 第三阶段 15. Android数据存储与获取(上) 16.SQLite数据库简介 17.SQLite数据库的创建和管理 18.SQLite数据库的操作 19. Android数据存储与获取(下) 20. 程序参数的使用 21. 文件的使用 22. Content Provider的使用 23. 高级应用开发 a) 访问本地通讯录。 b) 网络连接处理以及浏览器控件的使用方法 c) 本地文件浏览管理 d) 音视频播放处理 实验: a.编写一个记事本练习一 b.编写一个记事本练习二 c.编写一个记事本练习三 d.实现打电话和发短信示例  本实验主要是对ITelephony接口和ISms接口以及AIDL在Android程序中的开发应 用。 e.使用BroadcastReceiver实现开机启动Service或Activity  本实验实现开机自启动的功能,体现BroadcastReceiver类的用法。 f.实现文件浏览器实例  本实验实现本地文件的管理和浏览功能。 g.一步一步的分析讲解RssReader项目并对其Content和http通讯的的实现,完成并 实现一个可实际使用的Rss阅读器  本实验将以RssReader项目为目标,逐步从无到有实现其功能,主要讲解其中的 Content以及网络通讯处理的实现过程。 第四阶段 24.Android 的安全模式(上) 25.Android安全模式概述 26.Android安全架构 27.Android应用签名 28.用户标识和文件访问 29.Android 的安全模式(下) 30.使用许可 31.申明和执行许可 32.URI许可 33. 调试、打包发布工具使用 a) Android 调试桥 b) 启用logcat日志调试 c) 模拟器上安装删除软件 d) 打包、签名和安装软件到设备 e) 如何将软件上传到google Maket中 实验: 1.怎样编写一个多媒体播放器 2.怎样编写一个贪吃蛇游戏 项目实战 Android系统移植: 自己编写驱动、将Android系统移植到其它单板上 手机地图系统:手机地图系统 办公助理软件:办公助理软件 手机游戏开发:ANDROID手机游戏开发 Android系统开发部分 第四阶段 1 Andriod 开发环境搭建 目标:主要帮助学员了解Andriod系统、学会Andriod环境搭建、熟悉在Andriod模拟平台上开发、调试简单的应用程序。 1、Andriod简介 2、Eclipse中装载Android插件 3、Android Emulator使用 4、交叉编译工具链安装 5、Android的源代码结构与编译方法 6、在模拟器上运行Andriod 系统 7、编写、调试、运行Hello, Android!程序 8、Android核心模块及相关技术分析 【实验】 1、在ubuntu桌面平台上搭建Android 应用开发环境 2、编写、调试、运行一个简单的Android应用程序 第五阶段 2 Andriod 移植基础 目标:熟悉PXA270硬件平台,掌握bootloader移植、Linux内核移植,根文件系统建立,为后面的Android移植打好基础。 1、PXA270硬件平台介绍 2、安装交叉编译工具链与其他相关工具 3、移植bootloader到PXA270硬件平台 4、移植Linux内核到PXA270硬件平台 5、建立根文件系统 5.1 NFS文件系统 5.2 yaffs2文件系统 【实验】 1、熟悉pxa270硬件平台 2、在PXA270硬件平台上构建嵌入式Linux系统 第六阶段 3 移植Andriod到pxa270平台 目标:掌握在pxa270平台上移植Andriod的完整过程,精通移植Andriod的关键步骤。 1、Android的源代码结构与编译方法 2、移植Linux内核源码以支持Android系统 2.1硬件无关部分 2.2硬件相关部分(键盘、触摸屏、LCD等) 3、建立支持Android的根文件系统 4、系统性能测试与评估 【实验】 1、移植Andriod到pxa270平台实验平台 2、构建Andriod文件系统 3、配置网络,使用内置浏览器上网 第七阶段 4 基于Android平台的应用程序开发 目标:熟悉Android的应用程序框架,在构建好的Android系统上做应用开发。 1、Android的应用程序框架分析 1.1 Activity Manager 1.2 Package Manager 1.3 Window Manager 1.4 Telephony Manager 1.5 Content Provider 1.6 Resource Manager 1.7 View System 1.8 Location Manager 1.9 Notification Manager 1.10 XMPP Service 2、应用程序组成部分分析 2.1 Activity 2.2 Broadcast Intent Receiver 2.3 Service 2.4 Content Provider 3、基于Android的复杂应用程序编写 【实验】 1、熟悉Android的应用程序框架与应用程序组成 2、编写,调试,运行一个复杂应用程序
133 次阅读|0 个评论
谁将成为移动互联网时代的噩梦和王者
热度 5 liufeng 2011-2-18 19:19
作者:刘锋 美国人总是能够抓住互联网发展的核心,无论是移动互联网的硬件或内容,中国在未来都将远远超越美国,但最核心的移动互联网操作系统,我们却没有任何希望,中国IT的巨头们可以投入千亿资金到硬件和应用里,但却不愿意投入资金和精力去争夺核心的操作系统。 操作系统是移动互联网时代的真正王者,免费提供给手机厂商的android或许最终成为手机厂商的噩梦。安装android的手机越多,android为王的时代越早到来,那时硬件厂商将沦为目前 PC机厂商的地位. 智能手机在复制PC机走过的路,80到90年代硬件为王,硬件狗,汉卡,文字编辑卡都是把软件烧制在硬件里,当windows一统天下后,硬件地位下降,操作系统为王,然后计算机软件开始蓬勃发展。内容和应用繁荣的时代才开始到来,目前移动互联网仅仅到达硬件为王的时代. 无奈和悲哀,我们也许能看到趋势,但我们却不能改变趋势。
个人分类: 观点评述|2655 次阅读|10 个评论
[转载]Android传奇
热度 1 maywuyi 2010-11-10 17:58
如今,Android及它的绿色小机器人标志和苹果iPhone一样风靡世界,掀起了移动领域最具影响力的风暴。创造这一奇迹的人,叫Andy Rubin(安迪罗宾),Google工程副总裁,Android开发的领头人。 早年岁月 Andy Rubin1963年生于纽约州Chappaqua镇,父亲是学心理学的,经营一家电子玩具直销公司。销售样品拍照放进销售目录之后,就属于小Andy的了,他的房间满是各种最新的电子玩具。反复拆装这些玩具是他最爱做的事情之一。他的Geek基因由此种下。 大学毕业后,他加入以光学仪器知名的卡尔蔡司公司担任机器人工程师,主要从事数字通信网络。后来他还曾经在瑞士一家机器人公司工作,工作得很开心。然而,一个偶然事件改变他的一生。 1989年,Andy到开曼群岛旅游,清晨独自在沙滩漫步时遇到一个人可怜地睡在躺椅上他和女朋友吵架,被赶出了海边别墅。Andy给他找了住处。作为回报,这位老兄答应引荐Andy到自己所在的公司工作。原来,此人是正处在第一个全盛时期的苹果公司的一名工程师。 不平凡的硅谷经历让Andy Rubin在工程师主导的苹果公司可以说是如鱼得水,桌面系统Quadra和历史上第一个软Modem都是他的作品。他也不忘展示一下自己的Geek本色:对公司的内部电话系统进行了重新编程,伪装CEO打电话给人事,指示要给自己组里的工程师同事股票奖励。当然,信息部门免不了来找他的麻烦。 1990年,苹果的手持设备部门独立出来,成立了General Magic公司。两年后,Andy认定这个领域一定大有作为,选择加入。在这里,他完全融入到公司全身心投入的工程师文化中。他和同事们在自己的小隔间上方搭起了床,几乎24小时吃住在办公室。他们开发的产品是具有突破性意义的基于互联网的手机操作系统和界面Magic Cap,在市场上也曾经取得短暂的成功,1995年公司甚至因此上市,而且第一天股票实现了翻番。但是好景不长,这款产品太超前了,运营商的支持完全跟不上,很快被市场判了死刑。 此后,Andy Rubin又加入了苹果公司员工创办的Artemis Research,继续吃住在办公室,追逐互联网设备的梦想。这次,他参与开发的产品是交互式互联网电视WebTV,创造了多项通信专利。产品获得了几十万用户,成功实现盈利,年收入超过一亿美元。1997年,公司被微软收购。Rubin也随之加入,雄心勃勃地开始了他的超级机器人项目。他开发的互联网机器人在微软四处游荡,随时记录所看所闻。不料,有一天控制机器人的计算机被黑客入侵,激怒了微软的安全官员。不久,Andy离开微软,在Palo Alto租了一个商店,与他的工程师朋友们继续把玩各种机器人和新设备,构思各种新产品的奇思妙想。这就是Danger的前身。 创办Danger并担任CEO的过程中,Andy完成了从工程师到管理者的转变。更为重要的是,他和同事一起找到了将移动运营商和手机制造商利益结合起来的模式,这与iPhone非常类似。但是,公司的运营并不理想,Andy接受董事会的决定辞职,并有些失望地离开了公司。Danger后来被微软收购,2010年这个部门发布了很酷但是很快失败的产品Kin系列手机。 Android传奇 2002年初,还在Danger期间,Andy Rubin曾在斯坦福大学的工程课上做了一次讲座。听众中出现了Google的两位创始人Larry Page和Sergey Brin。互联网手机的理念深深打动了Page,尤其是他注意到Danger产品上默认搜索引擎是Google。 离开Danger后,Andy曾再次隐居开曼群岛,想开发一款数码相机,但是没有找到支持者。他很快回到熟悉的领域,创办Android,开始启动下一代智能手机的开发。这次的宗旨,是设计一款对所有软件开发者开放的移动平台。2005年,Andy靠自己的积蓄和朋友的支持,艰难地完成了这一项目。在与一家风投洽谈的同时,Andy突然想到了Larry Page,于是给后者发了一封邮件。仅仅几周时间,Google就完成了对Android的收购。接下来的故事,已经载入史册。 Andy Rubin是典型的Geek文化的代表,在他硅谷半山别墅里,从视网膜扫描门禁到世界上最贵的门铃,创意无所不在。他是那种既喜欢电焊枪,也着迷编写程序,并擅长业务战略的奇才。他今年47岁,传奇还在继续。 (本文来自《程序员》杂志10年09期)
个人分类: 读书笔记|3545 次阅读|0 个评论
[转载]Android系统流量控制5大招
hongkuan15 2010-9-5 14:14
Android系统节后总动员 流量控制5大招 类型:转载 作者:XOYO 时间:2010-02-23 23:15:09 初次使用 Android系统手机的同学可能都有过超流量的经历,或许也付出了惨痛的代价。究其原因是因为Android系统中的Gmail、Market、Google地图等众多服务都是基于网络的,系统需要经常通过网络与服务器进行数据通信,所以会产生大量的数据流量。接下来就教你如何跟超流量说Goodbye! 一、禁用网络连接 APNdroid是一款免费的网络接入点开关软件,我们可以通过它简单方便的开启或关闭网络连接,在使用网络的时候开启网络连接,而不用上网的时候可以完全关闭,让你的流量1KB也不会流失。软件安装后,点击图标即可禁用网络连接,再点击可启用网络连接,缺点是禁用网络连接后彩信无法正常接收。 禁用网络连接提示信息 二、关闭自动同步 系统默认情况下是开启了自动同步功能的,如果你在手机上更新了Gmail、日历、联系人数据,会自动同步到Google服务器上,反正亦然,势必会产生大量的数据流量。打开设置数据同步,取消自动同步,需要同步数据时再点击相关的项目手动同步即可。 关闭自动同步功能 三、巧设置,省流量 A.禁止浏览器载入图片。上网过程中下载的大量图片非常耗费流量,打开浏览器,进入设置菜单,取消载入图片的勾选,可屏蔽网页中的图片,达到节省流量的目的。 禁止浏览器载入图片 B.使用地图模式。在Google地图中,卫星模式需要下载大量的卫星照片,而地图模式相对比较简洁,在正确显示地理位置的同时,耗费的流量也比较少。打开菜单中的地图模式,选择地图模式即可。 地图模式 四、配置上网黑、白名单 DroidWall这款软件的实用之处在于可以由用户决定哪些软件可以连接网络,哪些软件不可以。软件运行后,将网络接口设定为2G/3G网络,模式设为White list(白名单),然后在软件列表中将允许连接网络的软件勾选,再点击菜单中的Apply rules(应用规则)使设置生效。这样只有勾选的软件可以连接网络,未选择的软件自动列入黑名单,避免产生不必要的流量。 DroidWall设置界面 五、流量监控 NetTraffic是一款非常实用的流量监测软件,它能够按照GPRS、WIFI等网络类型实时监测流量使用情况,并提供每月每日的统计数据和各项连接的细节信息。设定免费流量值和提醒伐值后,还可以统计流量剩余量,并在达到提醒伐值时提示用户,使用户对流量使用情况了如指掌,再也不用担心稀里糊涂超流量上网了。 设置免费流量和提醒伐值
个人分类: 未分类|3613 次阅读|0 个评论
支持Google 憧憬Android
coofish 2010-7-9 13:59
首届 Google 暑期大学生博客分享大赛2010 Andriod 篇 自从1959年ARPA建立ARPANET网络,互联网已有五十多年发展历程。今天,网络已经开始对整个经济体系产生影响。正在实施的三网融合有利于网络资源实现最大程度的共享。自从我认识Google的那一天起,就深深被她吸引了,因为Google充分发扬了互联网精神:开放、平等、协作、分享。 Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件。Android手机继续展现了Google迷人的魅力,让我产生了美好的憧憬。 (1)超大屏幕,可以折叠。 伴随三网融合,用手机看电视已不再是遥不可及的梦想了,但是手机的屏幕的尺寸及分辨率一直影响着用户体验。所以希望Android手机能让屏幕尺寸增大到6-7英寸,逐渐向上网本屏幕大小考虑,带给消费者最好的视觉享受。当然,为了方便携带,Android手机应该能够折叠,可以像变形金刚那般变身~ (2)应用软件,使用方便。 对于Google的爱好者来说,Android手机应配备Google全套软件:Google搜索、Gmail、Gtalk、Office系列、Google拼音、GPS导航(Google Earth和Google Maps)等。目前,智能手机安装软件还是比较麻烦的,需要将手机型号(手机操作系统)与软件版本对应,并且安装与卸载功能都没有电脑上方便,运行软件所占内存及CPU资源都无法查看。所以整个应用软件的使用都是不方便的,希望Android手机能推出类似于电脑的资源管理器功能,使得软件应用更加方便~ (3)手机理财,金融服务。 我发现每个人都拥有很多卡:银行卡、公交卡、理财卡、医疗卡、社保卡等。如此繁多的卡令人眼花缭乱,携带不便。如果Android手机一出,多卡合一,就完美了。我希望Android手机是用户的金融帮手和理财专家。手机不仅可以实现一机在手,走遍全球的梦想,在全球任何地方轻松实现手机购物消费支付、公交刷卡等,还可享受到与当今信用卡相同的透支和取现功能。此外,Android手机还可实现对于股票、基金、储蓄、转帐、汇票、汇兑等全面的金融业务异地办理功能。当然,最希望的是免手续费~ (4)手机信号,自动切换。 现在市场上已经出现了多卡手机,但是需要自己切换使用哪张卡打电话。我憧憬Android手机能实现手机运营商的自动切换模式,用户可以实现手机用户在全球范围内接收模式的智能化自动切换。在这种模式下,当手机用户离开自己所在的区域时,手机信号模式智能接收系统就会自动启动,将用户接收模式更改为本地接收模式,系统不仅可以提供实现手机信号模式在相同运营商之间的切换,还可实现在不同运营商之间的切换,让用户终始能够享受到本地最优惠的资费服务,无须担心产生高额漫游话费及国际话费的烦恼,节约很多money哦~ (5)手机遥控,物物互联。 时下最热的概念非物联网莫属。物联网的概念是在1999年提出的。物联网就是物物相连的互联网。手机作为物联网的终端,将发挥重大作用。一个Android手机:发条短信可以提前打开空调和电饭锅,回家马上可以享受到清凉和美食;无需担心家里会漏气或漏水,因为手机短信会及时自动报警;家中只需一个Android手机遥控器就可以控制电视、空调、洗衣机等。Android手机使得物物互联,让家庭更智慧~ 作为一个忠实的Google爱好者,一直用行动支持着Google,期待Android手机的精彩表现~
个人分类: 心情驿站|1967 次阅读|2 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-3 10:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部