Android Studio 学习记录-启停活动页面

目录

Activity的启动和结束

Activity的生命周期

Activity的启动模式 

1.在配置文件中指定启动模式

2.在代码里面设置启动标志


      本文介绍如何正确的启动和停止活动页面:首先描述活动页面的启动方法与结束方法;然后分析活动的完整生命周期,和每个周期方法的发生场景和流转过程;最后描述活动的几种启动模式,以及如何在代码中通过启动标志控制活动的跳转行为。

Activity的启动和结束

        有了按钮控件就能利用按钮的点击事件去触发页面跳转。通过startActiviyt方法可以从当前页面跳转到新页面,具体格式如“startActivity(new Intent(源页面.this,目标页面.class));”

//页面类直接实现点击监听器的接口View.OnClickListener
public class Activity2 extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        //setOnClickLisrener来自View,故而允许直接给View对象注册点击监听器
        findViewById(R.id.ib_back2).setOnClickListener(this);
    }

    @Override
    protected void onClick(View v) { // 点击事件的处理方法
        if(v.getId()==R.id.ib_back2){
        //从当前页面跳转到指定新页面
        startActivity(new Intent(this,Activity2.class));
        }
    }
}

        App支持在某个事件发生时主动返回上一页。回到上一个页面其实相当于关闭当前页面。Java代码中,调用finish方法即可实现关闭当前页面。

public class Activity2 extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        findViewById(R.id.ib_back2).setOnClickListener(this);
        findViewById(R.id.btn_page2).setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v){
        if (v.getId()==R.id.ib_back2||v.getId()==R.id.btn_page2){
            finish();    //结束当前的活动页面
        }
    }
}

        另外,所谓“打开页面”或“关闭页面”沿用了浏览网页的叫法,对于App而言,页面的真实名称是“活动”——Activity。打开某个页面其实是启动某个活动,所以有startActivity方法却无openActivity方法;关闭某个页面其实是结束某个活动,所以有finish方法却无close方法。

Activity的生命周期

        App引入活动的概念而非传统的页面概念,这是有原因的,但从字面意思理解,页面更像是静态的,而活动更像是动态的。每次创建新的活动页面,自动生成的Java代码都给出了onCreate方法,该方法用于执行活动创建的相关操作。onCreate方法所代表的创建东座,正式一个活动最开始的行为。除了onCreate,活动还有其他几种生命周期行为,他们对应的方法说明如下:

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

        打开新活动页面的方法调用顺序为onCreate→onStart→onResume,关闭旧活动页面的方法调用顺序为onPause→onStop→onDestroy。

         为了弄清这些方法的调用时机。接下来做一个实验加以观察。

进入第一个活动 

 跳转到第二个活动

从第二个活动回到第一个活动 

        以上梳理出完整的生命周期时间线,验证了之前所说的生命周期过程。

Activity的启动模式 

        系统给每个正在运行的App都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息。鉴于栈是一种先进后出、后进先出的数据结构,故而后面入栈的活动总是先出栈。

两个活动先后入栈

 

两个活动依次出栈 

        不过前述的出入栈情况仅是默认的标准模式,实际上Android允许在创建活动时指定该活动的启动模式,通过启动模式控制活动的出入栈行为。App提供了两种办法用于设置活动页面的启动模式:其一是修改AndroidMainifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行;其二是在代码中调用Intent对象的setFlags方法,表明后续打开的活动页面采用该启动标志。下面分别予以说明。

1.在配置文件中指定启动模式

        打开AndroidManifest.xml,给activity节点添加属性android:launchMode,属性值填入standard表示采取标准模式,当然不添加属性的话默认就是标准模式。具体activity节点配置内容如下:

<activity android:name=".JumpFirstActivity" android:launchMode="standard"/>
launchMode属性的取值说明
launchMode属性值 说        明
standard 标准模式,无论何时启动哪个活动,都是重新创建该页面的实例并放入栈顶。如果不指定launchMode属性,则默认为标准模式
singleTop 启动新活动时,判断如果栈顶正好就是该活动的实例,则重用该实例;否则创建新的实例并放入栈顶,也就是按照standard模式处理
singleTask 启动新活动时,判断如果栈中存在该活动的实例,则重用该实例,并清除位于该实例上面的所有实例;否则按照standard模式处理
singleInstance 启动新活动时,将该活动的实例放入一个新栈中,原栈的实例列表保持不变

2.在代码里面设置启动标志

        打开Java代码,先调用Intent对象的setFlags方法设置启动标志,再将该Intent对象传给startActivity方法。具体的方法调用代码示例如下:

//创建一个意图对象,准备跳转到指定的活动页面
Intent intent = new Intent(this,JumpSecondActivity.class);
//设置启动标志。Intent.FLAG_ACTIVITY_NEW_TASK表示创建新的任务栈
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);//跳转到意图对象指定的活动页面

        之所以要在代码中动态指定活动页面的启动模式,是因为AndroidManifest.xml对每个活动只能指定唯一的启动模式。若想在不同时候对同一个活动运用不同的启动模式,显然固定的launchMode属性无法满足这个要求。于是Android允许在代码中手动设置启动标志,这样在不同时候调用startActivity方法就能运用不一样的启动模式。

代码中的启动标志取值说明
Intent类的启动标志 说        明
Intent.FLAG_ACTIVITY_NEW_TASK 开辟一个新的任务栈,该值类似于launchMode="standard";不同之处在于,如果原来不存在活动栈,则FLAG_ACTIVITY_NEW_TASK会创建一个新栈
Intent.FLAG_ACTIVITY_SINGLE_TOP 当栈顶为待跳转的活动实例之时,则重用栈顶的实例。该值等同于launchMode="singleTop"
Intent.FLAG_ACTIVITY_CLEAR_TOP 当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例。该值与launchMode="singleTask"类似,但singleTask采取onNewIntent方法启用原任务,而FLAG_ACTIVITY_CLEAR_TOP采用先调用onDestroy再调用onCreate来创建新任务
Intent.FLAG_ACTIVITY_NO_HISTORY 该标志与launchMode="standard"情况类似,但栈中不保存新启动的活动实例。这样下次无论以何种方式再启动该实例,也要走standard模式的完整流程
Intent.FLAG_ACTIVITY_CLEAR_TASK 该标志非常暴力,转跳到新页面时,栈中原有实例都被清空。注意该标志需要结合FLAG_ACTIVITY_NEW_TASK使用,级setFlags方法的参数为“Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK”

猜你喜欢

转载自blog.csdn.net/demon_dog/article/details/128972770
今日推荐