Android的四大组件Activity,Service,Broadcast,Content Provider想必大家都不陌生了,今天在这里给大家详解一下Activity的相关知识点。
应用的主活动
在AndroidMainfest清单文件中,我们可以将一个活动设置为应用启动的默认主活动,也就是进入这个应用的入口。可在application标签中,将你需要设置的activity的对应标签中的intent-filter元素声明中将action设置为如下代码.
<action android:name="android.intent.action.MAIN">
四种启动方式
在AndroidMainfest清单文件里我们可以在activity标签内设置android:launchMode来进行启动方式的设置,四种启动方式分别如下:
标准模式(standard)
standard是系统默认的启动方式,以这种方式启动的activity会在任务栈中直接创建一个新的实例,不管之前在任务栈中有没有重新创建.
栈顶复用模式(singleTop)
singleTop正如其名,当新启动的activity已经存在于任务栈栈顶,那么就不会再创建新的实例,而是直接调用onNewIntent()方法,如果不存在于任务栈栈顶,那么就重新创建一个实例加入任务栈中。
栈内复用模式(singleTask)
singleTask正如其名,当新启动的activity已经存在于任务栈中,那么就不会再创建新的实例,而是直接调用onNewIntent()方法,并且关闭这个activity之上的任务栈中的activity,举例如果按顺序打开了A-B-C三个页面,那么以此种方式启动B,就会将C出栈,并且调用B的onNewIntent()方法,如果不存在于任务栈中,那么就重新创建一个实例加入任务栈中.(ps:之前笔者开发过程中就因为主页的启动方式是singleTask,导致了某一个bug把主页给出栈了,因此启动方式的了解是非常重要的 !!!)
单例模式(singleInstance)
这种启动方式比较特别,以这种方式启动的activity会单独运行于一个任务栈中,这个任务栈只会存在它一个实例。
打开一个Activity
打开activity采用Intent的方式,可以通过给Intent设置Bundle对象来传递你想要传递给下一个界面的值,但在日常开发中activty可能会复用,这样传值会导致前后打开的页面耦合度太高,容易造成空指针的问题,因此不建议采用Bundle的方式向下一个页面,最好采用其他方式,例如以将一些公共数据利用SharedPreference存储。代码如下:
Intent intent= new Intent(ActivityA.this,ActivityB.class);//通过Intent的Flag设置
intent.addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
生命周期
一个完整的Activity的生命周期包含了以下方法。
onCreate()
onStart()
onResume()
onPause()
onStop()
onRestart()
onDestroy()
两个Activity切换时的生命周期变化
A切换到B
A:onCreate() -- onStart() -- onResume() -- onPause()
B:onCreate -- onStart() -- onResume()
A:onStop() -- onStop() 方法只会在A不可见时调用,如果透明可见则不调用
B返回到A(按下返回键)
B:onPause()
A:onRestart() -- onStart() -- onResume()
B:onStop() -- onDestroy()
Activity的知识点就暂时总结到这个地方啦。
网友评论