赞
踩
通过startActivity方法可以从当前页面跳到新页面,具 体格式如“startActivity(new Intent(源页面.this, 目标页面.class));”
- // 活动类直接实现点击监听器的接口View.OnClickListener
- public class ActStartActivity extends AppCompatActivity implements
- View.OnClickListener {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_act_start);
- // setOnClickListener来自于View,故而允许直接给View对象注册点击监听器
- findViewById(R.id.btn_act_next).setOnClickListener(this);
- }
- @Override
- public void onClick(View v) { // 点击事件的处理方法
- if (v.getId() == R.id.btn_act_next) {
- // 从当前页面跳到指定的新页面
- //startActivity(new Intent(ActStartActivity.this,
- ActFinishActivity.class));
- startActivity(new Intent(this, ActFinishActivity.class));
- }
- }
- }

以上代码中的startActivity方法,清楚标明了从当前页面跳到新的ActFinishActivity页面。
回到上一个页面其实相当于关闭当前页面,因为最开始由A页面跳到B页面,一旦关闭了B页面,就会跳转之前的A页面。在Java代码中,调用finish方法即可关 闭当前页面,前述场景要求点击箭头图标或完成按钮都返回上一页面,则需给箭头图标和完成按钮分别 注册点击监听器,然后在onClick方法中调用finish方法。下面便是添加了finish方法的新页面代码例子:
- // 活动类直接实现点击监听器的接口View.OnClickListener
- public class ActFinishActivity extends AppCompatActivity implements
- View.OnClickListener {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_act_finish);
- // 给箭头图标注册点击监听器,ImageView由View类派生而来
- findViewById(R.id.iv_back).setOnClickListener(this);
- // 给完成按钮注册点击监听器,Button也由View类派生而来
- findViewById(R.id.btn_finish).setOnClickListener(this);
- }
- @Override
- public void onClick(View v) { // 点击事件的处理方法
- if (v.getId() == R.id.iv_back || v.getId() == R.id.btn_finish) {
- finish(); // 结束当前的活动页面
- }
- }
- }

注:所谓“打开页面”或“关闭页面”沿用了浏览网页的叫法,对于App而言,页面的真实名称是“活动”— Activity。打开某个页面其实是启动某个活动,所以有startActivity方法却无openActivity方法;关闭某个 页面其实是结束某个活动,所以有finish方法却无close方法。
Activity的生命活动周期非常庞大,下面我们来一一认识。
如图所示
注:如果一个Activity已经启动过,并且存在当前应用的Activity任务栈中,启动模式为singleTask, singleInstance或singleTop(此时已在任务栈顶端),那么在此启动或回到这个Activity的时候,不 会创建新的实例,也就是不会执行onCreate方法,而是执行onNewIntent方法。
安卓系统给每个正在运行的App都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息。鉴于栈是一种先进后出、后进先出的数据结构,故而后面入栈的活动总是先出栈,假设3个活动的入栈顺序为:活动A→活动B→活动C,则它们的出栈顺序将变为:活动C→活动B→活动A,可见活动C结束之后会返回活动B,而不是返回活动A或者别的地方。
假定某个App分配到的活动栈大小为3,该App先后打开两个活动,此时活动栈的变动情况如图所示。
而在按下返回键后,活动栈的变化如下图所示。
App提供了两种办法用于设置活动页面的启动模式,其一是 修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个 启动模式运行。其二是在代码中调用Intent对象的setFlags方法,表明后续打开的活动页面采用该启动标志。
1.在配置文件中指定启动模式
打开AndroidManifest.xml,给activity节点添加属性android:launchMode,属性值填入standard表示 采取标准模式,当然不添加属性的话默认就是标准模式。具体的activity节点配置内容示例如下:
<activity android:name=".JumpFirstActivity" android:launchMode="standard" />
其中launchMode的取值如下
默认启动模式 standard
该模式可以被设定,不在 manifest 设定时候,Activity 的默认模式就是 standard。在该模式下,启动 的 Activity 会依照启动顺序被依次压入 Task 栈中:
栈顶复用模式 singleTop
在该模式下,如果栈顶 Activity 为我们要新建的 Activity(目标Activity),那么就不会重复创建新的 Activity。
应用场景
适合开启渠道多、多应用开启调用的 Activity,通过这种设置可以避免已经创建过的 Activity 被重复创 建,多数通过动态设置使用。
栈内复用模式 singleTask
与 singleTop 模式相似,只不过 singleTop 模式是只是针对栈顶的元素,而 singleTask 模式下,如果 task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对 应 Activity 置于栈顶,获得焦点。
应用场景
程序主界面:我们肯定不希望主界面被创建多次,而且在主界面退出的时候退出整个 App 是最好的效 果。
耗费系统资源的Activity:对于那些及其耗费系统资源的 Activity,我们可以考虑将其设为 singleTask 模式,减少资源耗费。
全局唯一模式 singleInstance
在该模式下,我们会为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标 Activity获得焦点。新的 Task 有且只有这一个 Activity 实例。 如果已经创建过目标 Activity 实例,则 不会创建新的 Task,而是将以前创建过的 Activity 唤醒。
2.动态设置启动模式
在上述所有情况,都是我们在Manifest中通过 launchMode 属性设置的,这个被称为静态设置,动态设置是通过 Java 代码设置的。
通过 Intent 动态设置 Activity启动模式
intent.setFlags();
如果同时有动态和静态设置,那么动态的优先级更高。接下来我们来看一下如何动态的设置 Activity 启动模式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。