一、activity的定义
activity是应用程序的一个组件,他提供一个屏幕用于应用程序和用户之间的交互。
二、activity的生命周期
onCreate()——当活动首次创建时调用,一般在这进行初始化工作,初始化数据,视图等;
onStart()——当活动对用户可见时调用,可见但是不可以交互;
onResume()——活动对用户完全可见并且可以交互;
onPause()——当前活动被暂停(可以是可见的);
onStop()——活动不再对用户可见;
onDestroy()——活动被销毁;
onRestart()——在活动被停止(onStop),并且再次启动时调用,之后又进入到onStart();
三、activity的启动方法
一般可以分为显示启动可隐式启动。
显示启动:
1.直接启动class
Intent intent=new Intent();
intent.setClass(this,YourActivity.class);
startActivity(intent);
2.通过包名
Intent intent = new Intent("android.intent.action.MAIN"); intent.setClassName("wy.bzt.com.phonehelper", "wy.bzt.com.phonehelper.activity.f4.MyActivity");
startActivity(intent);
隐式启动:通过指定Action或Action和Data属性启动Activity,如果有多个Activity符合这个启动条件,系统会让用户选择启动那个应用。
在清单文件里面添加
<intent-filter>
<action android:name="com.wy.android.MyActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
之后再activity中调用:
Intent intent = new Intent("com.wy.android.MyActivity");
startActivity(intent);
四、activity的启动模式
activity的启动模式一共有4种,在清单文件中配置:android:launchMode=”standard|singleTask|singleInstance|singleTop”其中所需要的一种即可。
1.standard
默认启动模式,每次启动Activity时都会创建Activity,并放入当前任务栈中,可以存在多个相同activity实例;
2.singleTop
如果当前activity已经存在,并且在当前任务栈顶,则重用当前activity;如果不在栈顶,则创建新的activity实例;
3.singleTask
如果目标activity已有实例,则重用此activity,并且调用activity的onNewIntent()方法,如果此实例不在任务栈顶,会将此activity提至栈顶,他上面的activity会被移除;没有实例就创建新的实例。
4.singleInstance
在一个新的任务栈中创建目标activity。
注:onNewIntent()非常好用,Activity第一启动的时候执行onCreate()—->onStart()—->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()—->onResart()——>onStart()—–>onResume()。
当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//setIntent(intent);需要的时候设置
}
五、activity之间的信息传递
1.通过intent/Bundle
跳转时往里面添加信息,在目标activity中取得信息。可以传递的信息有多种:Intent/Bundle支持传递基本类型的数据和基本类型的数组数据,以及String/CharSequence类型的数据和String/CharSequence类型的数组数据。序列化的对象也可以传递。序列化对象,只要在数据类型中实现Parcelable接口或是Serializable接口。
2.通过全局变量
继承Application创建实例,可以在跳转时改变其中的变量,在目标activity中取得此变量的值。
3.剪切板传递(不熟悉)
六、横竖屏切换时activity的生命周期
1.不设置Activity的android:configChanges,会重新执行生命周期,切换横屏时,onPause()>onStop()>onDestroy()>onCreate>onStart>onResume;在切换竖屏时,onPause()>onStop()>onDestroy()>onCreate>onStart>onResume;
2. android:configChanges=”keyboardHidden|orientation|screenSize”之后切换时,不会重新调用生命周期,只会调用onConfigurationChanged方法。
七、保持横屏或者竖屏的方法:
对应的activiy中配置:android:screenOrientation=”landscape”(横屏,portrait是竖屏);
八、保存activity的状态
有时候activity被回收了,想保存activity中的一些值,则可以重写
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
重写此方法,将需要保存的值保存到outState中,在
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_behavior);
}
判断savedInstanceState是否为null,不是,就去里面取值即可。
九、将一个activity设置成窗口形式
在清单文件中:
<activity android:name=".MainActivityB"
android:theme="@android:style/Theme.Dialog"/>
更多的设置可以在style文件中设置主题style。
十、如何退出Activity?如何安全退出已调用多个Activity的Application?
1.退出当前activity,按返回键或者在代码中调用finish()方法即可;
2.关闭多个activity,退出程序,常用的做法是创建一个基类activity,在里面创建一个装activity的集合,其他的activity继承基类,每打开一个activity,就将其添加到基类的集合中,关闭时,循环finish掉集合中的activity即可。