十二月 22, 2011
在我们使用真机进行Android应用调试时,无法获得调试信息,错误提示如下:Unable to open log device ‘/dev/log/main’: No such file or directory
这是因为我们的手机没有开起log记录,下面以华为U8860为例开启手机的log功能:
1、在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面。

2、Project Menu–后台设置–LOG设置

3、LOG开关–LOG打开 LOG级别设置–VERBOSE

4、Dump&Log– 全部选中

5、重启手机
八月 05, 2011
引言
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
一、HTTP协议详解之URL篇
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
1、输入:www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp

七月 02, 2011
(一)、1.(宏观层面):面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。
2.(微观层面):面向对象的方式更强调各个类的“责任”,新增的类不会影响原本存在的类的实现代码。
3.对象是什么?
概念层面:对象是某种拥有责任的抽象。
规格层面:对象是一系列可以被其他对象使用的公共接口。
语言实现层面:对象封装了代码(行为)和数据(状态)。
(二)、面向对象设计的三大基本原则。
1、针对接口编程,而不是针对实现编程。
--客户无需知道所使用对象的特定类型,内需要知道对象拥有客户所期望的接口。
2、优先使用对象组合,而不是类继承。
--继承在某种程度上破坏封装性,子类父类耦合度高;而对象组合则只要求被组合的对象具有良好定义的接 口,耦合度低。
3、封装变化点。
--使用封装创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影 响,从而实现界面层次的松耦合。
(三)、几条更具体的设计原则
1、单一职责原则(SRP:Single Responsibility Principle)
--一个类最好只做一件事,只有一个引起他变化的原因。
2、开放封闭原则(OCP:Open Closed Principle)
--类模块应该是可扩展的,但是不可修改。(对扩展开放。对更改封闭)
3、Liskvo替换原则(LSP: Liskov Substitution Pinciple )
--了类必能够替换它们的基类。
4、依赖倒置原则(DIP: Dependency Inversion Principle)
--高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
--抽象不应该依赖于实现的细节,实现细节应该依赖于抽象。
5、接口隔离原则(ISP: Interface Segregation Principle)
--不应该强迫客户程序依赖于它们不用的方法。
6、合成/聚合复用原则(CARP :Composite/Aggregate Reuse Principle)
--在新对象中聚合已有对象,使之成为新对象的成员,从而通过操作这些对象达到复用的目的。合成方式较继承方式耦合更松散,所以应该少继承、多聚合。
7、迪米特法则(LOD: Law of Demeter)
--又叫最小知识原则,指软件实体应该尽可能少的和其他软件实体发生相互作用。
七月 01, 2011
(一)、简介
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
--Christopher Alexander。
设计模式描述了软件过程中某一类常见问题的一般解决性方案。
面向对象设计模式描述了面向对象设计过程中,特定场景下,类与相互通信的对象之间常见的组织关系。
(二)、一个模式的四个基本要素
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
1. 模式名称(pattern name)
一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基 于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到 恰当的模式名也是我们设计模式编目工作的难点之一。
2. 问题(problem)
描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
3. 解决方案(solution)
描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体 的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
4. 效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重 要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充 性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
(三)、四种设计模式的作用:
外观(Facade):为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用;
装饰(Decorate):当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能;
单件(Singleton):保证一个类仅有一个实例,并提供一个访问他的全局访问点;
模板方法(Template Method):在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现。
六月 30, 2011
在Android 2.2版之后, Android应用添加了允许移动到SD卡中的功能。而在此之前开发的应用,全部没有这个功能。现在也有一些系统软件比如360手机卫士等也提供将应用移动到SD卡的功能。如果你不想你的应用被移动,该如何解决呢?
你可以在你应用的manifest属性android:installLocation里设定。如果你没设定这个属性,那么你的应用将被安装到内置存储,而且将不允许移动到扩展存储上。
为了允许系统可以在扩展存储上安装你的应用,修改你的manifest文件,在 <manifest> 元素中包含android:installLocation 属性,
这个属性设置的是默认安装位置, 共有三个有效值,auto、internalOnly、preferExternal。
auto 表示自动,由系统决定安装位置
internalOnly 安装在手机内存
preferExternal 安装在外部存储中
六月 21, 2011
在有些情况下,比如我们进入一个应用时,往往会有一个欢迎界面,而这个界面一般是全屏的,在Android中实现全屏一般有两种方式:
1、在Activity的onCreate()方式中用代码实现:
public class ActivityDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**全屏设置,隐藏窗口所有装饰**/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
/**标题是属于View的,所以窗口所有的修饰部分被隐藏后标题依然有效,需要去掉标题**/
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
}
无Title和全屏段代码必须在setContentView(R.layout.main) 之前,不然会报错。
2、在配置文件里修改(在需要全屏显示的Activity中添加android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”)
<activity
android:name=".ActivityDemo"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
使用第一种方法在应用运行后,会看到短暂的状态栏,然后才全屏,而第二种方法则不会出现这种情况。
六月 21, 2011
这个错误常发生在弹出Dialog的时候:
new AlertDialog.Builder(getApplicationContext())
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Warnning")
......
.create().show();
导致报这个错是在于new AlertDialog.Builder(getApplicationContext()),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。
解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity是你的Activity的名称)来填充就可以正确的创建一个Dialog了。
new AlertDialog.Builder(MyActivity.this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Warnning")
......
.create().show();
六月 05, 2011
作为android四大组件之一,Services主要用作后台的、耗时操作。它没有UI。它跟Activity的级别差不多,从某种意义上说,Service可以理解为”没有用户界面的Activity”,但是他不能自己运行,只能后台运行,虽然Service不提供界面与用户进行交互,但是可以和其他组件进行交互,甚至实现进程间通信(IPC)。Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果Service需要很多耗时或者阻塞的操作,需要在其子线程中实现。应用程序的其他组件可以启动Service,此时Service 即会在后台持续运行,即使用户切换到了其他应用程序,service也依旧运行。一般:网络传输、播放音乐、执行文件I/O,或者和内容提供者(content provider)交互,都可以放到Service中到后台来执行。

五月 12, 2011
本人仅讲述Android NDK开发环境的搭建,不涉及NDK的相关概念,如果不清楚Android NDK的相关知识,请谷歌、百度恶补。
一、下载android NDK
地址:http://developer.android.com/sdk/ndk/index.html
下载后解压缩到你的工作目录,例如:D:\Android\android-ndk,然后将该目录添加到系统环境变量中。Android NDK包含build、docs、samples、sources、GNUmakefile、ndk-build、ndk-gdb及readme等内容。samples下面包含几个实例开发演示项目,第一次接触NDK开发,建议先从示例开始。
二、下载Cygwin
由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:
http://www.cygwin.com/
下载后是个setup.exe文件,使用过程如下:

五月 07, 2011
ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。
总结:
1、ContentProvider为存储和读取数据提供了统一的接口
2、使用ContentProvider,应用程序可以实现数据共享
3、android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
Uri介绍:
1、每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider提供的数据
2、Android所提供的ContentProvider都存放在andriod.provider这个包里面
Android的ContentProvider URI有固定的形式:content://contract/people
前缀:固定为content : //
认证:contract 资源的唯一标识符
路径:people 具体的资源类型
在Android中广泛应用URI,而不是URL。URL标识资源的物理位置,相当于文件的路径;而URI则是标识资源的逻辑位置,并不提供资源的具体位置。比如说电话薄中的数据,如果用URL来标识的话,可能会是一个很复杂的文件结构,而且一旦文件的存储路径改变,URL也必须得改动。但是若是URI,则可以用诸如content://contract/people这样容易记录的逻辑地址来标识,而且并不需要关心文件的具体位置,即使文件位置改动也不需要做变化,当然这都是对于用户来说,后台程序中URI到具体位置的映射还是需要程序员来改动的。
ContentProvider提供的函数:
1、query() 查询
2、insert() 插入
3、update() 更新
4、delete() 删除
5、getType() 得到数据类型
6、onCreate() 创建时的回调函数
实现ContentProvider的过程:
1、定义一个COTENT_URI常量
2、定义一个类,继承ContentProvider
3、实现query(),delete(),update(),insert(),onCreate(),getType()方法
4、在AndroidMainfest.xml中申明
