Android Activity

来源:互联网 发布:unity3d资源包 编辑:程序博客网 时间:2024/05/29 04:38

一、Activity生命周期


1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。


二、Activity的启动模式

<activity
            android:name=""
            android:launchMode="standard" />

standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加

入栈顺序:A1->A2->A3->A1

出栈顺序:A1->A3->A2->A1

singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。(强调必须是栈顶)

启动:A1->A2->A2

入栈:A1->A2->(A2的onNewIntent)

出栈:A2->A1

singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

启动:A1->A2->A3->A2

入栈:A1->A2->A3(A1、A2、A3分别入栈)   A1->A2(A2再入栈)

出栈:A2->A1

singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

启动:A1->A2(singleInstance)->A3

入栈:一个栈放A1->A3  另一个栈放A3


三、Activity横竖屏切换

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

竖->横 onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->

横->竖 onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

竖->横 onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->

横->竖 onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
onConfigurationChanged-->

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

竖->横 onConfigurationChanged-->
横->竖 onConfigurationChanged-->onConfigurationChanged


四、关闭时返回数据
基本流程:
1、使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity;
2、重写onActivityResult(int requestCode, int resultCode, Intent data) 方法;
3、新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用上面的onActivityResult方法;
注意:新的Activity的启动模式不能设置成 singleTask(如果已创建,会使用以前创建的)与singleInstance(单例,单独的任务栈),
 不能被摧毁(执行不到finish方法),父Activity中的 onActivityResult方法将不会执行;
finish():表示关闭当前Activity,会调用onDestroy方法;
Activity_A: 
public void openActivityB(View v) {
Intent intent = new Intent(this, Activity_B.class);
Person p = new Person("张辽", 44);
intent.putExtra("p", p);
startActivityForResult(intent, 100);// 此方法,启动新的Activity,等待返回结果, 结果一旦返回,自动执行onActivityResult()方法
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(data == null) {// 没有数据,不执行
return;
}
System.out.println(requestCode + ", " + resultCode);// code 可用来区分,哪里返回的数据
String name = data.getStringExtra("name");
int age = data.getIntExtra("age", -1);
}


Activity_B:
public void close(View v) {
// == 关闭当前Activity时,设置返回的数据 ==
Intent intent = new Intent();
intent.putExtra("name", "典韦");
intent.putExtra("age", 55);
setResult(200, intent);
finish(); // 关闭,类似于点击了后退
}

原创粉丝点击