在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>


       运行结果如下:


activity深度 android android activity详解_Android



      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>


       运行结果如下:


activity深度 android android activity详解_ide_02


      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深度 android android activity详解_activity深度 android_03

     启动另一个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>


       运行结果如下:


activity深度 android android activity详解_activity深度 android_04