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原生 页面
vue 单页面(SPA) history模式调用微信jssdk 跳转后偶尔 "invalid signature"错误解决方案