6.5.1. 编写自己的对象,以及初始化的相关代码
6.5.1.编写自己的对象,以及初始化的相关代码
Android程序中所有的构件(如Activity、Service、BroadcastReceiver、ContentProvider)都是继承一个Android框架中提供的基类,然后覆盖特定的方法。在这里,我们继承Activity类,覆盖了onCreate()方法。在第四章的"Activity的生命周期"一节 曾提到,Activity有个精心设计的生命周期,作为指导Activity行为的一台状态机。身为开发者,我们通常不会主动地干涉Activity的状态,而是跟踪Activity状态的变更,被动地对事件做处理。在这里,我们的onCreate()会在Activity第一次创建时由系统的ActivityManager负责调用(参见第四章中"Starting状态"和"Running状态"两小节)。像这样继承一个基类然后覆盖特定的方法的编程范式,被称作Template模式。
onCreate()方法在基本工作之余,还会做些杂事,处理些一次性的初始化工作。比如为按钮绑定点击事件、将程序连接到服务端等。
留意onCreate()有个Bundle类型的参数。它表示启动这一Activity的Intent所附带的少量数据。Bundle只能存储基本类型,复杂的数据需要自己编码。不过话说回来,在Yamba中我们并无使用Bundle的特殊需求,也就没有使用它。
永远记住:不论何时,只要覆盖了一个方法,就首先调用父类中原先的方法。而这里的做法就是super.onCreate()。
因此,如果你继承来自框架的类,在覆盖的方法中只要调用super中对应的方法,即可按部就班地执行父类的行为——在添加自己的业务逻辑的同时,不会丢掉原先父类的逻辑。
onCreate()所做最基本的工作之一就是,读取XML文件并将UI投射到Java的内存空间中。也就是编写Java代码读取并解析XML文件,为XML中表示的每个元素创建一个对应的Java对象,这被称作UI的“投射”(inflating)。而这一步的所有代码,全在setContentView(R.layout.status);这一句。
R文件是Eclipse自动生成的资源文件,作为Java与其它资源文件之间的牵线人,储存着一些辅助性质的指针。比如,R.layout.status就是指向/res/layout/status.xml文件的指针。
显而易见,setContentView()做了很多工作。读取文件、解析XML、创建XML元素对应的Java对象、设置对象的属性、处理对象的从属关系、投射整个View。待一切就绪,随后就是重绘界面了。
添加处理外部事件的响应函数,不一定需要额外继承一个类。Android的UI对象对此已做考虑。比如,想让某按钮处理点击事件,你可以定义一个方法onClick(),然后调用setOnClickListener,将this传给它,因为onClick()的定义正在这个对象里面。
例 6.3. StatusActivity.java, version 1
package com.marakana.yamba1;
import winterwell.jtwitter.Twitter;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class StatusActivity1 extends Activity implements OnClickListener { //
private static final String TAG = "StatusActivity";
EditText editText;
Button updateButton;
Twitter twitter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.status);
// Find views
editText = (EditText) findViewById(R.id.editText); //
updateButton = (Button) findViewById(R.id.buttonUpdate);
updateButton.setOnClickListener(this); //
twitter = new Twitter("student", "password"); //
twitter.setAPIRootUrl("http://yamba.marakana.com/api");
}
// Called when button is clicked //
public void onClick(View v) {
twitter.setStatus(editText.getText().toString()); //
Log.d(TAG, "onClicked");
}
}
- 要让StatusActivity捕获按钮的事件,因此为它实现一个OnClickListener接口。
- 找到对应的View。
- 将这个按钮注册,使它按下时能够通知到StatusActivity。
- 连接到TwitterAPI的服务端。在这里,我们硬编码了用户名与密码。
- OnClickListener接口的实现部分,表示按钮按下时调用的方法。
- 调用Twitter的API,将消息更新到服务端。