Android中获取设备加速度信息

代码及范例:

说明:通过以上代码可以获得设备当前加速度的信息。之后可以作如下设定:

所定义的六个浮点数即可用来描述当前的加速度等信息。

Android 开发笔记

作为分类目录的一个补充,在这里按照功能类别对Android开发中的一点心得和笔记作一个索引。其中部分是根据自己在查找网络资料时找到的内容的整理与演绎,在此感谢所有那些无私分享经验的人们。

基本

控件使用

资源调用

声音和图像

用户界面

活动 线程 服务

设备控制

SQLite

Android Studio

其他

Android用记忆软件 Ankicard

这篇文章将介绍和说明我自己开发的软件Ankicard。

由于时间仓促在当前的版本中没有加入详细说明,因而暂时通过这里来说明一下程序相关的问题。内容将会逐步完善。

程序截图:

词库选择界面
词库选择界面
库浏览界面
库浏览界面

Q&A:

Q:Ankicard自制词库的格式是什么?

A:普通的文本文件以以下格式录入即可:

词库标题
第一张正面内容
第一张反面内容第一行|反面内容第二行
第二张正面内容
第二张反面内容|第二行|第三行

第一行输入词库标题,之后每两行一组表示单张卡片的正反面。以换行符分隔每一面。在同一行内以竖线“|”作为人工换行符。单面最多支持300个汉字。词库只需使用标准文本文件格式,通过Windows记事本等程序即可创建。需要注意在保存时应通过“另存为”设置成“Unicode”字符编码才能避免出现乱码。同时Unicode编码也将提供更好的全球语言支持。

索尼爱立信(Sony Ericsson)Xperia X10升级Android 2.1系统使用感想

这是一篇实效性较弱的文章,会逐渐添加罗列条目:

北京时间2010年11月1日,索尼爱立信终于首先在北欧发布了旗下目前旗舰Android智能手机Xperia X10的2.1系统版本升级套件,自己的全球版X10也于第二天获得了升级。对这次迟来的、颇受争议的升级,我认为是值得的,尽管目前的版本还不完美,但从不少细节处可以看出索尼爱立信的用心。虽然因为策略上的失误,过分深入定制,导致了这次升级的“难产”,但不得不说最终算是交出了一份较为令人满意的答卷。在预定之后几个月内将要发布的升级包中相信现有的一些问题也会得到改进。

当前系统版本号:2.0.A.0.504

变更点/改进点:

  • 通知栏变宽,更容易下拉
  • 通知栏的时间、电量等图标更大,容易看清
  • 支持动态背景
  • 桌面单屏可显示的图标数由16个提升至20个,可显示桌面预览
  • 移动桌面图标时会有高亮显示放置位置
  • 设定菜单重新编排
  • 增加初次使用的安装向导
  • 横屏竖屏的取消模糊切换效果,反应速度大幅变快
  • Mediascape、Timescape细节加强,界面美化,反应速度大幅提高
  • 蓝牙支持性提升
  • 增加了大量新的内置铃声
  • 新的更好用,反应更快的屏幕锁,在充电时会显示精确电量
  • 新的短信界面,功能更强,界面更美观
  • 新的和Twitter、Facebook整合的通讯录
  • 将联系人添加为收藏时增加提示语
  • 显示联系人的Gtalks在线状态
  • 联系人添加功能增强
  • 增加本机保存联系人功能
  • 通话界面的界面改进,易用性提高
  • 新的连接性桌面控件,增加了飞行模式开关和电量显示。还可以在飞行模式下开启WIFI
  • 支持多帐号登录的电子邮件客户端
  • 增加了安装向导
  • 功能更强的备份与恢复工具
  • 充电时LED灯的显示调整为充电时橙色,充满时绿色的经典索尼设计
  • 更强的待机性能,初步感觉上提升了20%以上
  • 可以关机充电
  • 追踪对焦的720p高清视频录制
  • 拍摄视频时可以记录GPS信息
  • 获取照片地理位置信息的速度加快
  • 照片EV设定的界面优化
  • 视频拍摄中支持LED补光灯,自拍时减弱LED灯亮度
  • 网页浏览器支持双击缩放,支持HTML5
  • 书签支持缩略图模式
  • 增加至5个桌面屏幕
  • 内置计算器的界面改进
  • 备份工具的功能改进
  • 系统提升至2.1,内置软件的升级、可用软件的增加

存在的问题/不足:

  • 浏览器取消了退出选项,感觉不适应
  • 蓝牙接收步骤增加一步,略显繁琐
  • Mediascape显示专辑曲目号错误
  • 虚拟专用网VPN图标没有经过优化,比较粗糙
  • 拨号时显示的人物头像模糊
  • 系统时常会反映缓慢,我不清楚是Android本身的问题还是X10的问题,不过猜想后者的可能性比较大。可能是在运行某些后台服务。在其他时候各种操作反应倒是很流畅

今后如果还有什么发现会再补充,如果有错误也请指出帮助我更正。

Android中调用资源中的字符串

代码:getResources().getString(R.string.资源名)

范例:

说明:调用app_name字符串并绘图。这样就可以使用定义在string.xml文件中的字符串了。

Android中截取当前屏幕画面

代码及范例:

说明:将屏幕画面截取并保存至Bitmap的getpage中。
范例首先声明了getpage并设置分辨率,这个范例中创建了一个800×380像素的Bitmap。之后声明一个新的Canvas。接下来在该Canvas中(范例中为canvas)进行绘图,这里仅仅填充了浅灰色。最后的两条语句则是将画面截取保存在了getpage中。

避免活动切换动画

Android中切换活动时默认会有简单的动画效果,然而有的时候,特别是比如游戏中,可能这种切换效果是希望被避免的。因此在这里提供我个人认为的一种简单可行的办法。

概括地说,就是整个程序只有一个大的类,这个类负责控制模块,比如,对触摸的识别。在这个类中,再包含多个继承于View类的子类,以供在接收到相应的屏幕或键盘指令后执行。这样就可以避免活动之间的动画切换效果。

这个方法的局限性是对于比较复杂的程序会造成一定的麻烦,同时也失去了多个活动的优点。优点是可以省略传递Intent的步骤。适用于较为简单的程序。

用户界面

Android程序通过View和ViewGroup对象来构建用户界面。有许多种类的View和ViewGroup,他们都继承于View类。

View对象是Android平台的基本用户界面表现单元。View类是其子类“widgets”(提供诸如文本区域和按钮等全功能UI部件)的基础。ViewGroup类是其子类“layouts”(提供诸如线性、列表和相对等不同类型的布局结构)的基础。

View对象是一种数据结构,塔储存了布局参数和一块特定屏幕矩形区中的内容。View对象处理其自身所属屏幕矩形区域的测量、布局、绘图、焦点改变、滚动、及按键/手势交互。作为用户界面中的一个对象,一个View也是交互事件中用户和接收者的一个交互点。

视图层级(View Hierarchy)

在Android平台上,可以通过View和ViewGroup结点的层级结构来定义Android的UI,就像下图那样。这棵层级树可以随你所需或简单或复杂,你可以使用Android预定义的widget和layout来搭建,或是使用自己创建的自定义View。

为了让视图层级树可以在屏幕上被渲染,一个活动必须调用setContentView()方法并把根节点对象传递给它。Android收到这个引用后用它来擦除、测量、绘制这棵树。树的根节点要求其子节点绘制出自身——这点对于子结点也相同,子节点会要求其子结点自绘。这些子节点会向父结点请求尺寸和位置,不过父结点对子结点的大小位置有最终决定权。Android依次处理布局元素(从层级树的顶部开始),初始化View并将其加入其父结点。正因如此,当有元素重叠时,较后绘制的会覆盖先前绘制的内容。

更多关于视图是如何层级化并被测量绘制的,请阅读“Android如何绘制视图”。

布局(Layout)

使用XML布局文件是最常用的定义布局并表达视图层级的方法。XML为布局提供了一种可读性很高的结构,和HTML相似。XML中的每一个元素都是一个View或者ViewGroup对象(或其子嗣)。View对象是树的叶结点,ViewGroup对象是树的枝结点(如上图所示)。

一个XML元素的名称与其在所显示的Java类相对应。因此一个<TextView>元素会在UI中创建一个TextView,一个<LinearLayout>元素会在视图组中创建一个线性布局。当载入布局资源时,Android系统会根据布局中的元素来初始化这些运行对象。

举例来说,一个有着一个文本视图和一个按钮的垂直视图(vertical layout)是这样的:

注意LinearLayout元素中同时包含有文本视图和按钮。你可以在这里嵌套另一个LinearLayout(或是其他类型的视图组(view group))来加长视图层级,创建一个更为复杂的布局。

关于构建用户界面布局的更多情报请阅读“声明布局”。

Tip:还可以通过Java代码绘制View和ViewGroup对象。使用addView(View)方法来动态地插入新的View和ViewGroup对象。

可以通过多种途径来设计视图的布局。通过使用更多不同类型的视图组可以构造出无数的子视图和视图组。Android提供了一些预定义的视图组(被称为布局)。包括LinearLayout,RelativeLayout,TableLayout,GridLayout等。它们都提供了一些特定的参数用以定义其子视图的位置和布局的结构。

想要获知关于用于布局的不同视图组的更多情报,请阅读“常用Layout对象”。

部件(Widget)

部件是一种View对象,是用户交互的一种接口。Android提供了一套完整可用的部件,比如按钮、勾选框、文本输入框,因此能够快速地构建UI。Android还提供一些更为复杂的部件,比如日期采集器(date picker)、闹钟、缩放控制。不过能使用的部件并不受限于Android平台所提供的这些。通过声明自有的View对象或是继承整合已有的部件,可以创建出更为定制化的部件来实现自定义的功能。

更多内容请阅读“构建自定义组件”。

关于Android所提供的部件列表,参阅android.widget包。

UI事件

在向UI添加了视图/部件之后,需要了解它们如何进行用户交互以实现功能。为了让UI收到事件通知,需要完成以下两件事中的一件:

  • 定义一个事件侦听器并将其在View中注册。通常会通过它来侦听事件。View类包含一系列的嵌套接口,以On<XXXX>Listener命名,并分别拥有一个On<XXXX>()的回调方法。比如,View.OnClickListener(处理View的“点击”),View.OnTouchListener(处理View中的触屏事件),以及View.OnKeyListener(处理View中的设备按键)。如果希望View在“点击”时(比如选中一个按钮)收到通知,就使用OnClickListener并定义其onClick()回调方法(当点击时要执行的动作),之后通过setOnClickListener()将其注册给View。
  • 为View覆写一个已有的回调方法。当使用自建的View类并希望其侦听特殊的事件时需要这样做。可以处理的事件有比如屏幕触摸(onTouchEvent()),轨迹球移动(onTrackballEvent()),或设备键盘操作(onKeyDown())。允许在自定义View中定义每一个事件的默认行为以及事件是否应被传递给其他子视图。再次说明,这些是View类的回调方法,因此只有在构建自定义组件时才能定义它们。

可以在“处理UI事件”一文中继续阅读处理用户界面交互的更多内容。

菜单(Menu)

程序菜单是程序用户界面的另一重要组成部分。菜单提供了一种可靠的接口来显示程序的功能与设置。通常按下设备的菜单键可以调出程序菜单。然而,也可以添加当用户长按某一项目时调出的上下文菜单(Context Menu)。

菜单也是通过视图层级构建的,但是不需要亲自定义其结构。只要为程序定义onCreateOptionsMenu()或onCreateContextMenu()回调方法,之后声明想要包含于菜单内的项目即可。在合适的时刻,Android会自动为菜单创建必要的View等级,并在其中绘制每一个菜单项目。

菜单也会处理其自身的事件,因此不必为菜单中的项目注册事件侦听器。当菜单中的项目被选择时,onOptionItemSelected()或是onContextItemSelected()方法会被框架调用。

如同程序布局,可以在XML文件中声明菜单项目。

阅读“创建菜单”以了解更多。

高级主题

在掌握了创建用户界面的基本内容之后,可以试着用一些高级特性来创建更为复杂的程序接口。

适配器(Adapter)

有时需要把一些无法硬解码的信息装入一个视图组,这时要将视图与外部数据源绑定。为此,需要将AdapterView作为视图组,并将其子视图通过适配器的数据初始化后装入。

AdapterView对象是ViewGroup的一种实现,它说明其子视图是基于Adapter对象的。Adapter充当数据源(比如一列外部字符串)与AdapterView之间的信使角色来显示数据。Adapter类对于专门的任务有这多种不同的实现,比如从Cursor读取数据库数据的CursorAdapter,或是任意读取数组的ArrayAdapter。

欲了解更多关于使用Adapter装入视图的信息,参阅“使用AdapterView绑定数据”。

风格(Style)和主题(Theme)

如果不满意标准部件的外观,可以自己建立风格和主题来修改它们。

  • 风格是一组若干个格式属性,可以将其作为一个单位使用于布局的单个元素中。比如,可以定义一个具有特定文本尺寸和颜色的风格,然后将其应用到特定的View元素中。
  • 主题是一组若干个格式属性,可以将其作为一个单位使用于一个程序的所有活动,或是单个活动中。比如,可以定义一个具有特定窗口框架颜色、面板背景颜色、文本尺寸和菜单颜色的主题。该主题可以被应用于特定活动或是整个程序。

风格和主题是资源。Android提供了一些默认的风格和主题供使用。也可以声明自定义的风格与主题资源。

在“应用风格与主题”一文中可以了解更多关于使用风格和主题的信息。

本页部分内容根据Android Open Source Project创作并共享的内容修改,并在知识共享 署名2.5许可协议中所述条款的限制下使用。

Android开发入门

Android无疑是当前最为热门的移动设备操作系统之一,越来越多的开发者开始为Android开发应用。进行Android开发的目的大致可以分为商业盈利目的和业余爱好。对于后者,不少开发者在刚接触Android开发时总会有各种各样的问题,我想在这篇文章里谈谈如何入门Android。

进行Android开发所必需的素质:

做任何一件事,最重要的恐怕就是兴趣了。甚至可以说,只要有兴趣,做很多事都会顺利很多。因为有兴趣的话,就能够坚持下去,就会进行自主学习。其实这个主题不需要多说,因为要做好任何一件事,所必需的素质都是大同小异的,不是么。

进行Android开发所必需的理论知识:

Android的语法是基于Java的。因此如果对于Java有一定的掌握,开始Android的学习将是一件轻松的事。但是Java并不是学习Android前所必需的,甚至对于Java的了解有时反而会成为学习Android的障碍。毕竟,Android有许多独有的特性,以Java的思路去思考Android有时反而会产生限制。不过基础的OOP编程思想是必要的,如果仅仅学习过C语言这样的面向过程语言,恐怕需要先补充一些知识才能对Android比较顺利地上手。

此外一些基本的计算机相关知识自然也是需要的。对eclipse以及命令行的熟悉将是一种帮助。在开发某些类型的应用程序时OpenGL ES以及SQLite等的相关知识也是必需的。

进行Android开发所必需的软硬件准备:

  • 软件方面
    1. 操作系统:操作系统方面并没有太多的限制,Windows、Max OS和Linux都有对应的SDK。
    2. Java运行环境:开发Android之前需要在计算机上配置好JRE(Java运行环境,Java Runtime Environment),安装好JDK(Java开发套件,Java Development Kit )。具体的方法在开发指南中会有介绍。
    3. IDE(集成开发环境,Integrated development environment):Android的话推荐使用eclipse,这也是Android官方所推荐的。目前的最新版是3.7的Indigo。
  • 硬件方面
    1. 分辨率较高的显示器很重要。笔记本电脑的话或许没有办法,如果是台式机的话,推荐使用分辨率至少为1920×1080的显示器。
    2. 硬盘性能也对开发有着比较大的影响。有条件的话还是使用比较高速的硬盘比较好,能节省不少时间。
    3. 处理器的性能主要影响模拟器的速度。如果有实机进行开发的话,这一点就并不那么重要了。

初学Android开发的一点建议:

要开始学习Android的话,可以选择买一本好书,然后边读边实践。也可以从网络上找资料,自己摸索尝试。前者的优点是翻书比较方便,而且内容经过了作者的整理,缺点则是书的内容毕竟有限。后者的优点是免费,内容多,缺点是比较杂乱,花费时间可能会比较多。

另外自己深有体会的是,网络上的中文内容并不是很齐全,相较英语甚至是日语而言,整体水平低了不少。因此在遇到问题时,尝试通过英语搜索会是一个好主意。自己也有多次“通过中文很久无法找到答案,而通过英语/日语很快解决了问题”的经历。另外在例如Stack Overflow或是Quora这样的问答网站里几乎总是能找到高质量的答案(如果没有,就自己提问吧,得到满意回答的可能性是很高的),特别是Stack Overflow,在编程中遇到问题时应该想到它。总而言之,一定的英语能力可以大大提高自己的学习效率。

有了这些准备之后,就开始正式的Android开发之旅吧。首先可以跟着别人的代码摸索一下Android开发的大致流程,之后了解一下Android提供的各种控件。有了一定的熟悉之后,就可以开始考虑试着编写自己的程序了。

推荐书籍:

可以参见我的一些简单的笔记

下一次将具体介绍一下Android开发环境的搭建。

创建程序启动屏幕

代码及范例:

说明:通过新建一个线程来创建一个splash screen,效果就如同电脑上Office、Photoshop、Media Go等软件启动时有一个画面显示进度那样。在此期间程序可以进行初始化工作,减少用户的等待感。