Activity 是android重要的组件之一,相当于ios中的controller,作为一种界面容器使用。
当程序中包含多个activity的时候,需要在配置文件中设置相应的参数,下面是配置的一个例子,要指定一个主activity。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.crazyit.activity"
android:versionCode="1"
android:versionName="1.0" >
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name=".OtherActivity"
android:label="@string/app_name" >
<!-- 指定该Activity是程序的入口 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 定义两个Activity -->
<activity
android:name=".ExpandableListActivityTest"
android:label="查看星际兵种" >
</activity>
<activity
android:name=".PreferenceActivityTest"
android:label="设置程序参数" >
</activity>
</application>
</manifest>
其中<intent-filter>....</intent-filter>标签中包含的就是设置主activity的。
下面是一段由一个activity启动第二个activity的代码
public class StartActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取应用程序中的bn按钮
Button bn = (Button)findViewById(R.id.bn);
//为bn按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//创建需要启动的Activity对应的Intent
Intent intent = new Intent(StartActivity.this
, SecondActivity.class);
//启动intent对应的Activity
startActivity(intent);
}
});
}
}
public class SecondActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
//获取应用程序中的previous按钮
Button previous = (Button)findViewById(R.id.previous);
//获取应用程序中的close按钮
Button close = (Button)findViewById(R.id.close);
//为previous按钮绑定事件监听器
previous.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//获取启动当前Activity的上一个Intent
Intent intent = new Intent(SecondActivity.this
, StartActivity.class);
//启动intent对应的Activity
startActivity(intent);
}
});
//为close按钮绑定事件监听器
close.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//获取启动当前Activity的上一个Intent
Intent intent = new Intent(SecondActivity.this
, StartActivity.class);
//启动intent对应的Activity
startActivity(intent);
//结束当前Activity
finish();
}
});
}
}
如果在启动其他activity之后加上finish()函数,那么就会结束自己。
使用bundle在两个activity之间传输数据。
public class BundleTest extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button)findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
EditText name = (EditText)findViewById(R.id.name);
EditText passwd = (EditText)findViewById(R.id.passwd);
RadioButton male = (RadioButton)findViewById(R.id.male);
String gender = male.isChecked() ? "男 " : "女";
Person p = new Person(name.getText().toString()
, passwd.getText().toString() , gender);
//创建一个Bundle对象
Bundle data = new Bundle();
data.putSerializable("person", p);
//创建一个Intent
Intent intent = new Intent(BundleTest.this
, ResultActivity.class);
intent.putExtras(data);
//启动intent对应的Activity
startActivity(intent);
}
});
}
}
发送方将数据打包之后,通过bundle把数据打包,然后使用intent来传输。
下面是接收方的数据处理
public class ResultActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
TextView name = (TextView)findViewById(R.id.name);
TextView passwd = (TextView)findViewById(R.id.passwd);
TextView gender = (TextView)findViewById(R.id.gender);
//获取启动该Result的Intent
Intent intent = getIntent();
//获取该intent所携带的数据
Bundle data = intent.getExtras();
//从Bundle数据包中取出数据
Person p = (Person)data.getSerializable("person");
name.setText("您的用户名为:" + p.getName());
passwd.setText("您的密码为:" + p.getPass());
gender.setText("您的性别为:" + p.getGender());
}
}
上面是从一个activity向下一个activity传数据,下面的例子是后一个activity做完一些操作后,向他的前一个activity回传数据。
bn = (Button)findViewById(R.id.bn);
city = (EditText)findViewById(R.id.city);
//为按钮绑定事件监听器
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
//创建需要对应于目标Activity的Intent
Intent intent = new Intent(ActivityForResult.this
, SelectCityActivity.class);//启动指定Activity并等待返回的结果,其中0是请求码,用于标识该请求startActivityForResult(intent , 0);}});
//重写该方法,该方法以回调的方式来获取指定Activity返回的结果
@Override
public void onActivityResult(int requestCode , int resultCode
, Intent intent)
{
//当requestCode、resultCode同时为0,也就是处理特定的结果
if (requestCode == 0
&& resultCode == 0)
{
//取出Intent里的Extras数据
Bundle data = intent.getExtras();
//取出Bundle中的数据
String resultCity = data.getString("city");
//修改city文本框的内容
city.setText(resultCity);
}
}
使用requestcode和resultcode可以唯一确定是哪个activity回传过来的信息。在第二个activity中使用下面的代码来处理并回传数据。
getExpandableListView().setOnChildClickListener(
new OnChildClickListener()
{
@Override
public boolean onChildClick(ExpandableListView parent, View source,
int groupPosition, int childPosition, long id)
{
//获取启动该Activity之前的Activity对应的Intent
Intent intent = getIntent();
Bundle data = new Bundle();
data.putString("city" ,cities[groupPosition][childPosition]);
intent.putExtras(data);
// 设置该SelectActivity的结果码,并设置结束之后退回的Activity
SelectCityActivity.this.setResult(0 , intent);
//结束SelectCityActivity。
SelectCityActivity.this.finish();
return false;
}
});
最后看下activity的生命周期
这个图片已经很清楚说明一个activity的生命周期中会调用的函数