在Android系统中activity提供可视化的用户界面,一个Android应用通常由多个activity组成。多个activity组成了Activity栈,当前活动的Activity处于栈顶。Activity有自己的生命周期,由Android系统来控制。
1、Activity状态
一般认为Activity有以下四种状态:
活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。
暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。
停止:当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变为待用状态。
销毁:被系统或进程结束。
2、Activity的创建
创建一个Activity界面一般是继承Activity类(当然也可以继承ListActivity、MapActivity等),覆盖Activity类的onCreate方法,在该方法中调用setContentView()方法展示要显示的视图,然后调用findViewById()方法实例化组件。注意的是必须在AndroidManifest.xml清单文件中声明Activity名称才能使用。
下面代码演示了在MainActivity中添加LinearLayout布局视图,在该视图中添加一个按钮和一个文本框,覆盖Activity的onCreate()方法,在该方法中调用setContentView()方法展示要显示的视图,并调用findViewById()方法实例化组件。
public class MainActivity extends Activity {
private static final String TAG = "lifecycle";
private Button btnButton;
private TextView tvtitle;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.main);
//通过findViewById方法获得Button实例
tvtitle = (TextView) findViewById(R.id.btnButton);
//通过findViewById方法获得Button实例
btnButton = (Button) findViewById(R.id.btnButton);
}
}
布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="简单的Activity创建"
/>
<Button
android:id="@+id/btnButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮"/>
</LinearLayout>
Manifest.xml清单文件代码如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 声明Activity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
运行结果如下:
3、启动另一个Activity
像我们做Web开发一样,经常会从一个页面跳转到另一个页面。在Android中我们也经常会从一个Activity跳转到另一个Activity做出一些处理。从一个Activity启动另一个Activity可以使用startActivity方法或者startActivityForResult()方法。这两个方法要传递的参数是Android中的另外一个非常重要的组件Intent,Intent是相同或不同组件间的信使。
下面代码有两个Activity:FirstActivity和SecondActivity。每个Activity中放置一个按钮,FirstActivity中的按钮响应事件跳转到SecondActivity,SecondActivity中的按钮响应事件跳转到FirstActivity。
//FirstActivity.java
public class FirstActivity extends Activity {
private Button btnButton;
private TextView tvtitle;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.main);
//通过findViewById方法获得Button实例
tvtitle = (TextView) findViewById(R.id.tvtitle);
//通过findViewById方法获得Button实例
btnButton = (Button) findViewById(R.id.btnButton);
tvtitle.setText("这是FirstActivity");
btnButton.setText("切换到SecondActivity");
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//显示方式声明Intent,直接启动SecondActivity
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//启动Activity
startActivity(intent);
}
});
}
}
//SecondActivity.java
public class SecondActivity extends Activity {
private static final String TAG = "lifecycle";
private Button btnButton;
private TextView tvtitle;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.main);
//通过findViewById方法获得Button实例
tvtitle = (TextView) findViewById(R.id.tvtitle);
//通过findViewById方法获得Button实例
btnButton = (Button) findViewById(R.id.btnButton);
tvtitle.setText("这是SecondtActivity");
btnButton.setText("切换到FirstActivity");
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//显示方式声明Intent,直接启动SecondActivity
Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
//启动Activity
startActivity(intent);
}
});
}
}
Manifest.xml清单文件代码如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 声明FirstActivity -->
<activity
android:name=".FirstActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 声明SecondtActivity -->
<activity android:name=".SecondActivity"></activity>
</application>
运行结果如下:
4、Activity之间传递参数
在Web开发中我们经常把数据放在某个Scope中(如request、session)来实现数据共享。在Android系统中不同的Activity之间又是如何传递数据呢?这里用到另外一个对象Bundle,我们将要传递的信息封装到该对象里,并通过Intent对象传递到另一个Activity中。
public class FirstActivity extends Activity {
private Button btnButton;
private EditText etUsername;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.first);
//通过findViewById方法获得Button实例
btnButton = (Button) findViewById(R.id.btnButton);
//通过findViewById方法获得EditText实例
etUsername = (EditText) findViewById(R.id.etusername);
//设置Button点击监听器
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取姓名字符串
String name = etUsername.getText().toString();
//实例化Bundle对象
Bundle data = new Bundle();
//将姓名信息添加到Bundle对象中
data.putString("name", name);
//实例化Intent对象
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//为Intent添加Bundle
intent.putExtras(data);
//启动第二个Activity
startActivity(intent);
}
});
}
}
<pre name="code" class="java">//SecondActivity.java
public class SecondActivity extends Activity {
private TextView tvResult;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.second);
//通过findViewById方法获得TextView实例
tvResult = (TextView) findViewById(R.id.tvresult);
Map<String,String> map = new HashMap<String, String>();
map.put("James", "123456");map.put("Jordan", "abcdef");
map.put("Paul", "ABCDEF");
boolean isFinded = false;
//获得Intent
Intent intent = getIntent();
//从Intent中获得Bundle对象
Bundle b = intent.getExtras();
//从Bundle中获得name
String name = b.getString("name");
//通过Map.entrySet遍历key和value
for(Map.Entry<String, String> entry : map.entrySet()){
if(entry.getKey().equals(name)){
isFinded = true;
tvResult.setText("\n\n\nname:"+entry.getKey()+"-----------PassWordr:"+entry.getValue());
break;
}
}
if(isFinded == false){
tvResult.setText("查找不到此人:"+name+"的信息");
}
}
}
运行结果如下:
启动另一个Activity并返回结果
有时候我们需要从第一个Activity启动第二个Activity,在第二个Activity中处理完一些业务后,需要将处理结果返回到第一个Activity中,那么,我们就需要在第一个Activity中使用startActivityForResult()方法启动第二个Activity。
下面通过一个实例实现从第一个Activity中要求用户输入用户名称,将用户名称传递给第二个Activity。第二个Activity通过用户名称查询用户的密码,然后在第二个Activity中将密码返回给第一个Activity,并显示。
//FirstActivity.java
public class FirstActivity extends Activity {
public static final int FIRSTREQUESTCODE = 0;
private Button btnButton;
private EditText etUsername;
private TextView tvResult;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.first);
//通过findViewById方法获得Button实例
btnButton = (Button) findViewById(R.id.btnButton);
//通过findViewById方法获得EditText实例
etUsername = (EditText) findViewById(R.id.etusername);
//通过findViewById方法获得TextView实例
tvResult = (TextView) findViewById(R.id.tvresult);
//设置Button点击监听器
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获取姓名字符串
String name = etUsername.getText().toString();
//实例化Bundle对象
Bundle data = new Bundle();
//将姓名信息添加到Bundle对象中
data.putString("name", name);
//实例化Intent对象
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//为Intent添加Bundle
intent.putExtras(data);
//启动第二个Activity
startActivityForResult(intent, FIRSTREQUESTCODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(FirstActivity.FIRSTREQUESTCODE == resultCode){
//从Intent中获得Bundle
Bundle b = data.getExtras();
//获得用户名和密码
String username = b.getString("name");
String password = b.getString("password");
tvResult.setText("\n\n\n返回结果:name:"+username+"-----------PassWord:"+password);
}
}
}
//SecondActivity .java
public class SecondActivity extends Activity {
private TextView tvResult;
private Button btnBack;
private String userName;
private String PassWord;
//创建时调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置当前Activity界面布局
setContentView(R.layout.second);
//通过findViewById方法获得TextView实例
tvResult = (TextView) findViewById(R.id.tvresult);
Map<String,String> map = new HashMap<String, String>();
map.put("James", "123456");
map.put("Jordan", "abcdef");
map.put("Paul", "ABCDEF");
boolean isFinded = false;
//获得Intent
Intent intent = getIntent();
//从Intent中获得Bundle对象
Bundle b = intent.getExtras();
//从Bundle中获得name
String name = b.getString("name");
//通过Map.entrySet遍历key和value
for(Map.Entry<String, String> entry : map.entrySet()){
if(entry.getKey().equals(name)){
isFinded = true;
tvResult.setText("\n\n\n查询结果:name:"+entry.getKey()+"-----------PassWord:"+entry.getValue());
userName = entry.getKey();
PassWord = entry.getValue();
break;
}
}
if(isFinded == false){
tvResult.setText("查找不到此人:"+name+"的信息");
}
//通过findViewById方法获得Button实例
btnBack = (Button) findViewById(R.id.btnButton);
//设置Button点击监听器
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获得Intent
Intent intent = getIntent();
//实例化Bundle对象
Bundle data = new Bundle();
//从Bundle中获得name
data.putString("name", userName);
data.putString("password", PassWord);
//为Intent添加Bundle
intent.putExtras(data);
//设置返回结果
SecondActivity.this.setResult(FirstActivity.FIRSTREQUESTCODE, intent);
//结束当前Activity
SecondActivity.this.finish();
}
});
}
}
first.xml布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是FirstActivity"
/>
<TextView
android:id="@+id/tvusername"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请输入用户名:"
/>
<EditText
android:id="@+id/etusername"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询"/>
<TextView
android:id="@+id/tvresult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
second.xml布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是SecondActivity"
/>
<Button
android:id="@+id/btnButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回结果"/>
<TextView
android:id="@+id/tvresult"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
运行结果如下: