Android移动应用开发教程⑦

一:最基本的组件:Activity

1.1:启停活动界面

通过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方法。

1.2:Activity的生命活动周期

Activity的生命活动周期非常庞大,下面我们来一一认识。

  • onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
  • onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
  • onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的 点击动作、允许用户输入文字等。
  • onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交 互。
  • onStop:停止活动。此时活动页面将不在屏幕上显示。
  • onDestroy:销毁活动。
  • 此时回收活动占用的系统资源,把页面从内存中清除掉。
  • onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建 过程,而是走onRestart的重启过程。
  • onNewIntent:重用已有的活动实例

如图所示

  • 打开新页面的方法调用顺序为: l onCreate→onStart→onResume
  •  关闭旧页面的方法调用顺序为: l onPause→onStop→onDestroy

注:如果一个Activity已经启动过,并且存在当前应用的Activity任务栈中,启动模式为singleTask, singleInstance或singleTop(此时已在任务栈顶端),那么在此启动或回到这个Activity的时候,不 会创建新的实例,也就是不会执行onCreate方法,而是执行onNewIntent方法。

1.3:Activity的启动模式

1.3.1:启动模式简介

安卓系统给每个正在运行的App都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息。鉴于栈是一种先进后出、后进先出的数据结构,故而后面入栈的活动总是先出栈,假设3个活动的入栈顺序为:活动A→活动B→活动C,则它们的出栈顺序将变为:活动C→活动B→活动A,可见活动C结束之后会返回活动B,而不是返回活动A或者别的地方。

假定某个App分配到的活动栈大小为3,该App先后打开两个活动,此时活动栈的变动情况如图所示。

而在按下返回键后,活动栈的变化如下图所示。

 1.3.2:启动模式的改变

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 启动模式。

猜你喜欢

转载自blog.csdn.net/qq_64618483/article/details/129804698