Android 笔记2
2011-12-04
==Android 技巧==
Android 模拟器的键盘命令可以参考 http://developer.android.com/guide/developing/tools/emulator.html。其中包括 Ctrl-F11、Alt-Enter、ESC、Home 等键的用处。
Eclipse 中如何增加已存在的源代码文件到项目中?很简单,把文件放到合适的目录中,并用“File(文件)”菜单中的“Refresh(刷新)”菜单项即可。
如何为上网设置代理服务器:从主界面进入应用程序启动器,找到“设置”,进入后选择无线及网络设置。选择“移动网络”,再选择“访问点”。然后选择正在使用的访问点,如 Android 模拟器中的 Telkila。然后就能设置代理服务器了。
如果想要强制退出一个应用程序,可以进入“设置”->“应用程序”,切换到“正在运行的应用程序”标签页,找到需要中止的应用程序,单击“强行中止”即可。如果只是为了省电,倒不必将自带的网络浏览器中止,只要使用浏览器的菜单项“窗口”,把不用的窗口都关闭,应该就能省下 CPU 了。
==Android 图形开发==
此处讨论基于 Canvas 的图形开发。如果需要高速图形,请使用 OpenGL ES。此处不讨论 OpenGL ES。
==Android 数据库开发==
SQLite 和 XML 支持。
SQLite 支持的数据类型:http://www.sqlite.org/datatype3.html。如何获得 GUID?使用 java.util.UUID 类:UUID.randomUUID()。
SQLiteOpenHelper 的构造函数中需要传入一个 Context 参数,而 Google 给出的文档里并没有说明到底应该传哪个 Context 对象进去。Context 类是 Activity 类的基类,也是 Application 类的基类,所以我一开始不清楚到底应该传哪个进去。后来看了一下网上的信息以及官方提供的示例,发现示例中显示的正规做法是使用一个类继承于 ContentProvider,并使用 ContentProvider 类的 getContext() 方法来得到这个 context。但是,由于帮助里面说 SQLiteOpenHelper 的构造函数中此 Context 参数是用于打开或创建数据库的缘故,也许使用任意本应用程序的 Context 对象的 getApplicationContext() 方法得到的对象即可。附带说一下,自己也可实现一个自定义的 Application 类,比如叫 MyApplication,继承于 android.app.Application 类,可以添加自定义方法或属性等,也将会从 getApplicationContext() 的返回结果中得到。注意需要把这个类的名称加到 AndroidManifest.xml 的 <application> 标签的 name 属性中才能使用它。
如果要写入设备,需要获取权限。在 AndroidManifest.xml 中需要声明应用程序需要使用的权限。这一点必须用 uses-permission 标签。要查看有哪些权限,可查看 Manifest 类的常量定义:http://developer.android.com/reference/android/Manifest.permission.html。比如要写入外置存储设备,也就是通常的 SD 卡,就需要 android.permission.WRITE_EXTERNAL_STORAGE 权限。
permission 标签用于增加应用程序的自定义权限。所有自定义权限的列表可以用 adb shell pm list permissions 来查看;这个命令也会列出 Android 内置的权限。要增加自定义权限,需要指定几个属性:name,用来表示权限的名称,如 com.me.app.myapp.permission.DEADLY_ACTIVITY。然后要指定 protectionLevel、label(标签)以及 description(描述)等字段。
Java 中的 ResultSet 对应于 .NET 中的 DataTable。
本人对于 XML 的经验只有实际用到的那些,因此不要指望能从 XML 的理论上给出什么内容。本人对 XML 的树形结构不是特别感冒,除非是 XHTML 或 SOAP。
本次项目中我第一次使用 SAX2 进行 XML 的解析。SAX2 的特点是内存占用小,但是这样一来,需要自己维护 XML 元素访问时的状态。由于我解析的 XML 文件有一个特点,它是表示数据表的内容,头上有一段信息引用一个 xsd,其内容是数据表的定义,包括列定义,而 XML 文件本身后面全是类似的深度一样的数据,因此分析起来先用一个整型变量记录状态,等表定义部分一过,后面凡是深度为 3 的都是表数据。表数据是以字符块而非属性的形式保存的,因此分析时遇到深度为 3 则要处理。处理方法如下:
@Override
public void characters(char[] ch, int start, int length)
{
if (m_level == 3) {
m_chardata.append(ch, start, length);
}
}
而深度则是在 startElement 和 endElement 事件中维护的:
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
{
int i;
m_level++;
this.insertAttribute("m_level", (new Integer(m_level)).toString());
this.insertAttribute("uri", uri);
this.insertAttribute("localName", localName);
this.insertAttribute("qName", qName);
for (i = 0; i < atts.getLength(); i++) {
this.insertAttribute("attribute_name", atts.getLocalName(i));
this.insertAttribute("attribute_val", atts.getValue(i));
}
}
@Override
public void endElement(String uri, String localName, String qName)
{
this.outputCharData();
this.insertAttribute("m_level", (new Integer(m_level)).toString());
this.insertAttribute("uri", uri);
this.insertAttribute("localName", localName);
this.insertAttribute("qName", qName);
m_level--;
}
==Android C/C++ 开发==
以下是几篇非常有用的文章。
http://kevinboone.net/android_native.html
http://kevinboone.net/android_nonroot.html
2011-12-04
==Android 技巧==
Android 模拟器的键盘命令可以参考 http://developer.android.com/guide/developing/tools/emulator.html。其中包括 Ctrl-F11、Alt-Enter、ESC、Home 等键的用处。
Eclipse 中如何增加已存在的源代码文件到项目中?很简单,把文件放到合适的目录中,并用“File(文件)”菜单中的“Refresh(刷新)”菜单项即可。
如何为上网设置代理服务器:从主界面进入应用程序启动器,找到“设置”,进入后选择无线及网络设置。选择“移动网络”,再选择“访问点”。然后选择正在使用的访问点,如 Android 模拟器中的 Telkila。然后就能设置代理服务器了。
如果想要强制退出一个应用程序,可以进入“设置”->“应用程序”,切换到“正在运行的应用程序”标签页,找到需要中止的应用程序,单击“强行中止”即可。如果只是为了省电,倒不必将自带的网络浏览器中止,只要使用浏览器的菜单项“窗口”,把不用的窗口都关闭,应该就能省下 CPU 了。
==Android 图形开发==
此处讨论基于 Canvas 的图形开发。如果需要高速图形,请使用 OpenGL ES。此处不讨论 OpenGL ES。
==Android 数据库开发==
SQLite 和 XML 支持。
SQLite 支持的数据类型:http://www.sqlite.org/datatype3.html。如何获得 GUID?使用 java.util.UUID 类:UUID.randomUUID()。
SQLiteOpenHelper 的构造函数中需要传入一个 Context 参数,而 Google 给出的文档里并没有说明到底应该传哪个 Context 对象进去。Context 类是 Activity 类的基类,也是 Application 类的基类,所以我一开始不清楚到底应该传哪个进去。后来看了一下网上的信息以及官方提供的示例,发现示例中显示的正规做法是使用一个类继承于 ContentProvider,并使用 ContentProvider 类的 getContext() 方法来得到这个 context。但是,由于帮助里面说 SQLiteOpenHelper 的构造函数中此 Context 参数是用于打开或创建数据库的缘故,也许使用任意本应用程序的 Context 对象的 getApplicationContext() 方法得到的对象即可。附带说一下,自己也可实现一个自定义的 Application 类,比如叫 MyApplication,继承于 android.app.Application 类,可以添加自定义方法或属性等,也将会从 getApplicationContext() 的返回结果中得到。注意需要把这个类的名称加到 AndroidManifest.xml 的 <application> 标签的 name 属性中才能使用它。
如果要写入设备,需要获取权限。在 AndroidManifest.xml 中需要声明应用程序需要使用的权限。这一点必须用 uses-permission 标签。要查看有哪些权限,可查看 Manifest 类的常量定义:http://developer.android.com/reference/android/Manifest.permission.html。比如要写入外置存储设备,也就是通常的 SD 卡,就需要 android.permission.WRITE_EXTERNAL_STORAGE 权限。
permission 标签用于增加应用程序的自定义权限。所有自定义权限的列表可以用 adb shell pm list permissions 来查看;这个命令也会列出 Android 内置的权限。要增加自定义权限,需要指定几个属性:name,用来表示权限的名称,如 com.me.app.myapp.permission.DEADLY_ACTIVITY。然后要指定 protectionLevel、label(标签)以及 description(描述)等字段。
Java 中的 ResultSet 对应于 .NET 中的 DataTable。
本人对于 XML 的经验只有实际用到的那些,因此不要指望能从 XML 的理论上给出什么内容。本人对 XML 的树形结构不是特别感冒,除非是 XHTML 或 SOAP。
本次项目中我第一次使用 SAX2 进行 XML 的解析。SAX2 的特点是内存占用小,但是这样一来,需要自己维护 XML 元素访问时的状态。由于我解析的 XML 文件有一个特点,它是表示数据表的内容,头上有一段信息引用一个 xsd,其内容是数据表的定义,包括列定义,而 XML 文件本身后面全是类似的深度一样的数据,因此分析起来先用一个整型变量记录状态,等表定义部分一过,后面凡是深度为 3 的都是表数据。表数据是以字符块而非属性的形式保存的,因此分析时遇到深度为 3 则要处理。处理方法如下:
@Override
public void characters(char[] ch, int start, int length)
{
if (m_level == 3) {
m_chardata.append(ch, start, length);
}
}
而深度则是在 startElement 和 endElement 事件中维护的:
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
{
int i;
m_level++;
this.insertAttribute("m_level", (new Integer(m_level)).toString());
this.insertAttribute("uri", uri);
this.insertAttribute("localName", localName);
this.insertAttribute("qName", qName);
for (i = 0; i < atts.getLength(); i++) {
this.insertAttribute("attribute_name", atts.getLocalName(i));
this.insertAttribute("attribute_val", atts.getValue(i));
}
}
@Override
public void endElement(String uri, String localName, String qName)
{
this.outputCharData();
this.insertAttribute("m_level", (new Integer(m_level)).toString());
this.insertAttribute("uri", uri);
this.insertAttribute("localName", localName);
this.insertAttribute("qName", qName);
m_level--;
}
==Android C/C++ 开发==
以下是几篇非常有用的文章。
http://kevinboone.net/android_native.html
http://kevinboone.net/android_nonroot.html