1.如何在一个应用程序当中定义多个Activity
2.启动一个Activity 的方法
3. Android当中的back stack
1 定义多个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()。
步骤:
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对象依然是活跃状态,它所包含的变量及线程仍在运行。