Android 页面跳转模式

Posted Haley_Wong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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对象。

以上是关于Android 页面跳转模式的主要内容,如果未能解决你的问题,请参考以下文章

Android与H5交互 -- 点击H5跳转到 Android原生 页面

移动端APP页面Webview模式跳转详解

浅谈BaseActivity写法,促使我们更高效开发

vue 单页面(SPA) history模式调用微信jssdk 跳转后偶尔 "invalid signature"错误解决方案

Android & Flutter 相互跳转

android开发中怎么在界面上实现曲线图