Android 页面跳转模式

简介

Android 中的页面跳转与iOS中的页面跳转非常的不同。
Android中的更简单也更复杂,说其更简单是因为Android 中打开一个新的页面一般用用类似如下的代码:

Intent intent = new Intent(this, MainDetailActivity.class);
startActivity(intent);

但是,Android中可以在AndroidManifest.xml 设置每个Activity的launchMode,类似下面这样:

android:launchMode="singleTask"

当然,这个launchMode有多种类型,分别应用在不同的场景。

  • standard
  • singleTop
  • singleTask
  • singleInstance

standard 模式

如果我们没有在AndroidManifest.xml设置 launchMode,那么该Activity的launchMode默认就是standard模式,它表示新创建一个Activity,然后打开,并不会复用该Activity的任何实例。怎么来判断是否有新建一个Activity呢?
我们可以在生命周期方法中将Activity的hashCode打印出来。它执行的生命周期方法:

A2 onCreate()----> A2 onStart() ----> A2 onResume()

singleTop 模式

该模式 表示 如果该Activity 的实例如果再栈顶,那么如果要打开的界面依然是该类型Activity,那么就会将intent 发送给栈顶的那个实例,复用该Activity实例,如果栈顶不是该Activity 实例,那么就创建一个新的实例对象,然后跳转。当复用时,系统会调用onNewIntent()方法,我们可以在onNewIntent()方法中重新加载数据,做数据的装载工作。例如,像下面这样:

 protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        loadData();
    }

如果这样使用的话,它的生命周期方法执行顺序是这样的:
A1 onNewIntent()----> A1 onResume()

当然,我们也可以使用更简单的方式:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        recreate();
    }

但是当调用recreate();就会重新创建一个实例,然后从onCreate()方法开始,走生命周期方法。
它的执行顺序就变成了:
A1 onNewIntent()----> A1 onResume()---->A1 onDestroy()---->A2 onCreate()----> A2 onStart() ----> A2 onResume()

singleTask 模式

该模式 表示 如果某个Activity 设置为singleTask,那么当跳转到该Activity 时,会先从栈中查找,是否已经存在该类型的实例,如果存在,那么系统会将栈中该Activity上面的Acivity全都弹出栈并销毁,然后将intent发送给之前的那个对象,同样系统也会调用onNewIntent()方法,我们可以在onNewIntent()方法中重新加载数据,做数据的装载工作。例如,像下面这样:

 protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        loadData();
    }

如果这样使用的话,它的生命周期方法执行顺序是这样的:
将A1 上方除了栈顶之外的所有其他activity销毁----> A1 onNewIntent()----> A1 onRestart() ----> A1 onStart() ----> A1 onResume() ----> 销毁栈顶的activity

当然,我们也可以使用更简单的方式:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        recreate();
    }

这样,调用recreate();就会重新创建一个实例,然后从onCreate()方法开始,走生命周期方法。
将A1 上方除了栈顶之外的所有其他activity销毁----> A1 onNewIntent()----> A1 onRestart() ----> A1 onStart() ----> A1 onResume()----> A1 onDestroy() ---->A2 onCreate()----> A2 onStart() ----> A2 onResume() ----> 销毁栈顶的activity

如果栈中不存在该Activity的实例,那么具就创建一个新的Activity对象,然后跳转过去即可。

singleInstance 模式

该模式 是如果某个Activity 的launchMode设置为singleInstance时,当第一次打开该Activity时,就会新建一个栈,然后将该Activity放入这个特殊的栈中,最后将这个特殊的栈压入 主栈中,当再次打开该Activity时,就会在主栈中查找该栈,然后将其提到栈顶,然后再调用onNewIntent()方法。我们可以在onNewIntent()方法中重新加载数据,做数据的装载工作。例如,像下面这样:

 protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        loadData();
    }

如果这样使用的话,它的生命周期方法执行顺序是这样的:
A1 onNewIntent()----> A1 onRestart() ----> A1 onStart() ----> A1 onResume()

当然,我们也可以使用更简单的方式:

 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        recreate();
    }

这样,调用recreate();就会重新创建一个实例,然后从onCreate()方法开始,走生命周期方法。
将A1 所在的独立栈提到栈顶----> A1 onNewIntent()----> A1 onRestart() ----> A1 onStart() ----> A1 onResume()

注意:不管上述哪种方式,将执行返回操作,将Activity销毁之后,下次再展示该Activity都需要重新创建,系统并不会像创建单例一样,保存一个唯一的Activity对象。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值