Activity的生命周期

第一节 主要内容
1.如何在一个应用程序当中定义多个Activity
2.启动一个Activity 的方法
3. Android当中的back stack

1  定义多个Activity
如是一个应用程序理解为一个网站的话,一个Activity就是其中的一个网页。

生成一个Activity的步骤:
1)  定义一个类,继承Activity
2)  在该类当中,复写Activity当中的onCreate方法
3)在AndroidManifest.xml文件当中注册该Activity,操作如下:
<!-- 这里是另外一个Activity的配置 -->
<activity android:name=".SecondActivity" android:label="SecondActivity">
    <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

在这里,我们把<intent-filter> 从原来的地方剪切到 这个<activity>中来,那么默认第一个打开的Activity就是这个SecondActivity.

每个Activity都需要在Manifest文件中添加相应的<Activity>,并设置其属性和intent-filter。

Activity中常用的函数有 SetContentView()   findViewById()    finish()   startActivity()。

2  启动一个Activity的方法
步骤:
1) 生成一个意思对象(Intent)
2)  调用setClass方法设置所要启动的Activity
3)  调用startActivity方法启动一个Activity
核心部分代码:
//以下是一个内部类,这个内部类的对象是一个监听器(如果大家对监听器不是很熟悉,可以参考设计模式当中的观察者模式)
    class MyButtonListener implements OnClickListener{
    	//生成该类的对象,并将其注册到控件上。如果该控件被用户按下,就会执行onClick方法 
		@Override
		public void onClick(View v) {
			//生成一个Intent对象
			Intent intent = new Intent();
			//在Intent对象当中添加一个键值对
			intent.putExtra("testIntent", "123");
			//设置Intent对象要启动的Activity
			intent.setClass(Activity02.this, OtherActivity.class);
			//通过Intent对象启动另外一个Activity
			Activity02.this.startActivity(intent);
			/**以下的4行代码将启动发送短信的Activity,详细的情况会在以后的课程当中进行介绍
				Uri uri = Uri.parse("smsto://0800000123");    
				Intent intent = new Intent(Intent.ACTION_SENDTO, uri);    
				intent.putExtra("sms_body", "The SMS text");    
				startActivity(intent);
			 */
		}    	
    }
OtherActivity.java
public class OtherActivity extends Activity{
	private TextView myTextView = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.other);
		//取得从上一个Activity当中传递过来的Intent对象
		Intent intent = getIntent();
		//从Intent当中根据key取得value
		String value = intent.getStringExtra("testIntent");
		//根据控件的ID得到响应的控件对象
		myTextView = (TextView)findViewById(R.id.myTextView);
		//为控件设置Text值
		myTextView.setText(value);		
	}
}
3  back stack
                                            
1. 启动程序,打开默认的Activity,即第一个Activity对象,栈中存放了第一个Activity对象。点击按钮,跳到第二个Activity时,又把第二个Activity对象压入到栈中,且第二个Activity对象位于栈顶。栈顶存放的永远是当前运行的Activity对象。
2. 当我们按返回键时,第二个Activity对象被弹出了栈,第一个Activity对象又位于栈顶。

第二节  生命周期

主要内容:

  1. 什么是生命周期
  2. Activity 的生命周期函数
  3. 生命周期函数的调用时机
                                            Activity 的生命周期函数
   
代码示例:
FirstActivity.java
public class FirstActivity extends Activity {
	private Button myButton;
	@Override       //Activity创建时被调用
	public void onCreate(Bundle savedInstanceState) {
		System.out.println("FirstActivity ---> onCreate	 ");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myButton = (Button) findViewById(R.id.myButton);
		myButton.setOnClickListener(new ButtonListener());
	}

	@Override
	protected void onDestroy() {
		System.out.println("FirstAcvity --->onDestory");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		System.out.println("FirstAcvity --->onPause");
		super.onPause();
	}

	@Override     //Activity从后台重新回到前台时被调用  
	protected void onRestart() {
		System.out.println("FirstAcvity --->onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {  //准备接受用户的点击,触屏等操作时调用
		System.out.println("FirstAcvity --->onResume");
		super.onResume();
	}

	@Override   //Activity创建或者从后台重新回到前台时被调用  
	protected void onStart() {
		// TODO Auto-generated method stub
		System.out.println("FirstAcvity --->onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		System.out.println("FirstAcvity --->onStop");
		super.onStop();
	}
     /** 
     * Activity被系统杀死时被调用. 
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 
     * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. 
     * 在onPause之前被调用. 
     */  
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        outState.putInt("param", param);  
        Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
        super.onSaveInstanceState(outState);  
    }  
      
    /** 
     * Activity被系统杀死后再重建时被调用. 
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. 
     * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. 
     */  
    @Override  
    protected void onRestoreInstanceState(Bundle savedInstanceState) {  
        param = savedInstanceState.getInt("param");  
        Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
        super.onRestoreInstanceState(savedInstanceState);  
    }  

	class ButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(FirstActivity.this, SecondActivity.class);
			FirstActivity.this.startActivity(intent);
		}
	}
}

1.onSaveInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;(2)在用户改变屏幕方向时,此方法会被调用;(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之前。

2.onRestoreInstanceState:(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。


SecondActivity.java  

 代码和FirstActivity.java 代码几乎相同,作用是跳转到FirstActivity,实现不断来回跳转,查看现象。
程序运行的现象是:


第三节  主要内容
   1. Activity对象的状态
   2. 成对的生命周期函数
1. Activity对象的3种状态  
1) onResume: Activity 对象处于运行状态
2) Paused: 另一个Activity 位于前端,但是本Activity还可见
3) Stopped: 另一个Activity 位于前端,完全遮挡住本Activity
一个Activity 进入Paused和Stopped状态时,但这个Activity并不会释放掉它所占用的内存,这个Activity对象依然是活跃状态,它所包含的变量及线程仍在运行。
                                         








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值