Android四大组件分别是Activity、Service、Broadcast Receiver和Content Provider。其中Activity是最基本也是最重要的组件。在Android系统中提供了用户界面。
一个Android应用通常由多个Activity组成,多个Activity组成了一个Activity栈,当前活动的Activity位于栈顶。每个Activity都由Android系统来控制它的生命周期。
创建Activity一般分为以下几步:
step 1、继承Activity类。(或者是ListActivity、MapActivity)
step 2、重写onCreate方法,在方法中调用setContentView来展示要显示的视图布局(当然,像是ListActivity有自己的默认布局,可以不调用这个方法)
step 3、调用findViewById方法,实例化各个组件
step 4、在清单文件中声明各个Activity类
两个Activity之间的切换:
使用startActivity方法或者是startActivityForResult方法,这两个方法中传递的参数是Intent组件。
举个例子:点击按键时,从第一个Activity跳转到第二个Activity。
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 显示方式声明Intent,直接启动SecondActivity
<span style="white-space:pre"> </span> Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
<span style="white-space:pre"> </span>startActivity(intent);
}
});
两个Activity之间传递数据信息:
这时需要使用Bundle对象,将要传递的对象封装在Bundle对象里,Bundle类似于Map容器,是采用键值对的方法存储信息的。
当信息添加完毕之后,再使用Intent对象将信息传递出去。
举个例子,在第一个Activity中添加数据:
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String nameString = myEditText.getText().toString();
//定义一个Bundle对象data
Bundle data = new Bundle();
//在data中以Key-Value的方法导入信息,这里键是name,值是nameString字符串
data.putString("name", nameString);
//创建一个Intent对象intent,声明要传递的两个Activity类
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
//在intent对象中将Bundle对象添加进去
intent.putExtras(data);
//启动intent对象
startActivity(intent);
}
});
在第二个Activity中导出数据:
Intent intent = getIntent();
Bundle b = intent.getExtras();
String getNameString = b.getString("name");
关于 startActivityForResurlt方法和startActivity方法的区别
使用startActivity方法,是简单的直接跳转,若是想跳回当前页面,则必须再使用一次startActivity( )。
startActivityForResurlt方法是一个有返回值的启动新Activity的方法。假若从FirstActivity跳转到下一个SecondActivity,而当SecondActivity调用了finish()方法以后,程序会自动跳转回FirstActivity,并调用前一个FirstActivity中的onActivityResult( )方法。
使用startActivityForResult获取返回值的Activity中,要重写onActivityResult 方法,用来获取从第二个Activity中传递回来的返回值。
在FirstActivity中重写startActivityForResult(Intent intent, Int requestCode)和onActivityResult(int requestCode, int resultCode, Intent intent),两个方法中的参数要匹配。
在第二个方法中重写setResut(int resultCode, Intent intent)方法,写入要传回的数据信息。这三个方法中的请求码、结果码的值都要相匹配才行。
举个例子,先在第一个Activity中重写两个方法:
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
username = (EditText)findViewById(R.id.username);
password = (EditText)findViewById(R.id.password);
String str_username = username.getText().toString();
Bundle b = new Bundle();
b.putString("username", str_username);
Intent intent = new Intent(MainActivity.this,NextActivity.class);
intent.putExtras(b);
startActivityForResult(intent, 1);
}
});
定义onActivityResult方法:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode为回传的标记
case 0:
Bundle b=data.getExtras();
String str=b.getString("str1");
break;
default:
break;
}
}
定义第二个Activity中的setResult方法,需要注意的是,虽然setResult的调用在finish之前,但是当前Activity正在执行,还没有调用finish结束它之前,只是让setResult处于就绪状态,结果并不会立即回传给前一个Activity,只有当前Activity调用了finish方法而消亡的时候,结果才会回传给onActivityResult去处理。
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent();
intent.putExtra("abc", "test");
NextActivity.this.setResult(0, intent);
NextActivity.this.finish();
}
});