当activity属性设置为singletask时,如果按home键,然后重新启动该activity,理应走到onNewIntent()中去,但是在搞music时发现并非如此, 虽然mediaplaybackactivity...android:taskAffinity=”” android:launchMode=”singleTask” 发现这样就可以走onNewIntent
只要在Activity中加入自己的onNewIntent(intent)的实现加上Manifest中对Activity设置lanuchMode=“singleTask”就可以。...onNewIntent()....而后面如果再有想启动Activity的时候,那就是执行onNewIntent()—- onResart()—— onStart()—– onResume()....当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的...总结 以上所述是小编给大家介绍的Android中Activity的四种启动模式和onNewIntent(),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。
那么onNewIntent()到底是什么?如何使用它呢? 带着好奇,我们来查询onNewIntent()这个方法: ?...由上述表达的意思,我们隐约可以理解,setIntent(Intent)在onNewIntent(Intent)里面,那么setIntent方法的参数无疑使用的也是onNewIntent的参数。...可是onNewIntent(Intent)方法是如何调用的呢?我们回到了上一个问题。...于是带着思考,我们去度娘了一下,结果找到了这样的代码: @Override protected void onNewIntent(Intent intent) { super.onNewIntent...我们将onNewIntent(Intent)方法写在了我们的Activity A里面,成功的得到了B传给A的数据(效果如图:1-3)。
--->onStart--->onResume---onPause>onNewIntent--->onResume 当ActivityA的LaunchMode为SingleInstance,SingleTask...: 如果ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法,生命周期调用顺序为: onCreate--->onStart--->onResume---按下Home键>onPause...--->onstop--->onNewIntent--->onRestart--->onstart--->onResume 注意:在内存吃紧的情况下,系统可能会kill掉后台运行的 Activity ,...如果不巧要启动的那个activity实例被系统kill了,那么系统就会调用 onCreate 方法,而不调用 onNewIntent 方法。...这里有个解决方法就是在 onCreate 和 onNewIntent 方法中调用同一个处理数据的方法, 总结:在activityA中设置了对应的启动模式后,其他(自己也行)activityB往A中使用intent
然后回调onNewIntent()方法处理这个Intent。...4、回到MainActivity中的onNewIntent方法 @Override protected void onNewIntent(Intent intent) { super.onNewIntent
1.2 单独 singletop activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent 被调用 activity 不在前台,创建 1.3 单独 cleartop activity...finish 后重建 activity 在启动它的栈里不存在,在启动它的栈里创建 1.4 cleartop + singletop activity 在前台(当前显示的栈的栈顶),不创建,它自己 onNewIntent...被调用 activity 不在前台 activity 在启动它的栈里存在,它上面的 activity 会出栈,它自己 onNewIntent 被调用 activity 在启动它的栈里不存在,在启动它的栈里创建...被调用 activity 不在前台 activity 需要的栈存在,在该栈中创建一个 activity 或将该栈移至前台(它自己 onNewIntent 被调用) activity 需要的栈不存在,...被调用 activity 不在前台 activity 在它需要的栈里存在,它上面的 activity 会出栈,它自己 onNewIntent 被调用 activity 在它需要的栈里不存在,在它需要的栈里创建
* 如果这个实例已经存在,intent就会通过onNewIntent传递到这个Activity。 * 否则新的Activity实例被创建。...*/ @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent);...} } 以上是核心代码,有几点需要说明的: 1、设置启动模式:launchMode="singleTask" 2、getDataFromBrowser()方法会在onCreate和onNewIntent...与此同时,Intent会通过onNewIntent传递到这个SingleTask Activity实例。...- 这就是为什么要在onNewIntent中调用的原因,当此Activity已存在时,值会通过onNewIntent传递过来。
当页面再次被调用的时候,先走onNewIntent方法再走onRestart。 所以需要重写onNewIntent方法,而且此方法在Activity Finish之后是不执行的。...//finish之后是不执行的 @Override protected void onNewIntent(Intent intent) { super.onNewIntent
:6386 14450-14450 D/$$$BActivity: onClickBtn: BActivity start BActivity 14450-14450 D/$$$BActivity: onNewIntent...() 14450-14450 D/$$$BActivity: onClickBtn: BActivity start BActivity 14450-14450 D/$$$BActivity: onNewIntent...如果系统中已经存在这样的一个activity则会重用这个实例,并且调用他的onNewIntent()方法。即,这样的一个activity在系统中只会存在一个实例。 ?...:6394 19684-19684 D/$$$AActivity: onClickBtn: AActivity start BActivity 19684-19684 D/$$$BActivity: onNewIntent...() 19684-19684 D/$$$BActivity: onClickBtn: BActivity start BActivity 19684-19684 D/$$$BActivity: onNewIntent
如果是,则不创建新的 activity B 实例而是直接引用这个栈顶实例,同时 B 的 onNewIntent 方法会被回调,通过该方法的参数可以取得当前 Intent 的信息;如果栈顶不是 activity...但是,如果这个 Activity 已经存在于另一个任务栈中,则系统会销毁该 Activity 以上的所有Activity,然后调用该 Activity的 onNewIntent() 方法,不会创建新的实例...Intent.FLAG_ACTIVITY_CLEAR_TOP:销毁目标Activity和它之上的所有Activity,重新创建目标Activity,不会调用onNewIntent方法。...Intent.FLAG_ACTIVITY_SINGLE_TOP :当该activity处于栈顶时,可以复用,直接onNewIntent。...方法同样打印栈信息: protected void onNewIntent(Intent intent) { super.onNewIntent(intent);
每次启动都会新建一个Activity实例,并进入当前任务栈 singleTop,如果要启动的Activity在栈顶存在实例,则不会重新创建Activity,而是直接使用栈顶的Activity实例,并回调onNewIntent...singleTask,如果要启动的Activity在栈中存在实例,则不会重新创建Activity,而是直接使用栈里的Activity实例,并回调onNewIntent方法。...singleInstance,有点单例的感觉,就是所启动的Activity会单独放在一个任务栈里,并且后续所有启动该Activity都会直接用这个实例,同样被重复调用的时候会调用并回调onNewIntent...所以生命周期调用是 (C)onPause→(B)onNewIntent→(B)onRestart→(B)onStart→(B)onResume→(C)onStop→(C)onDestory 2)A→B→...所以生命周期调用是 (C)onPause→(B)onNewIntent→(B)onRestart→(B)onStart→(B)onResume→(C)onStop 3)A→B→C,B启动模式为singleInstance
这种情况表现方式与默认的standard模式一致 2.如果我将之前的Activity堆栈稍作修改 C B A 再次启动C,此时Activity堆栈为 C (之前的实例C,新的intent数据可以通过onNewIntent....当前Activity堆栈为 D C B A 现在我对C添加launchMode="singleTask",并在D中启动C,此时Activity堆栈为 C (之前的实例C,新的intent数据可以通过onNewIntent...B A D会被从Activity堆栈中移除,然后再复用之前的实例 2.当前Activity堆栈为 C B A 再次启动C,此时Activity堆栈为 C (之前的实例C,新的intent数据可以通过onNewIntent...第二个Activity堆栈 E 现在我在D中启动E,此时Activity堆栈为 第一个Activity堆栈 D C B A 第二个Activity堆栈 E (之前的实例E,新的intent数据可以通过onNewIntent
当再次启动时若栈顶已经有,那么不会实例化一个新的,而是调用它的 onNewIntent()方法。...如果系统中已经有一个 singleTask 的实例,那么再次启动时会重用它,并且调用它的 onNewIntent()方法。...任何时候启动 activity如果系统中已经有目标 activity,则调用它的 onNewIntent()方法。 多说一句 关于 singleTask还有个有趣的东西。
onNewIntent protected void onNewIntent(Intent intent) singTask模式下,系统创建一个新的Task,并在Task的底部实例化Activities...然而,当一个实例存在于一个独立的Task时,系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。...Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(...而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume()....当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的
Activity 此时入口 Activity 上层的Activity实例都将自动关闭移除 & 自身被放置在栈顶(这是SingleTask启动模式的特点) 通过在入口 Activity 回调的onNewIntent...()中关闭自身即可 若在后面的Activity启动 任务栈底的Activity时,就会调用任务栈底Activity的onNewIntent() 具体实现 步骤1:将 App的入口 Activity...() // 在该方法传入一标志位标识是否要退出App & 关闭自身 @Override protected void onNewIntent(Intent intent) {...super.onNewIntent(intent); if (intent !...()传入一标识符 // 作用:标识是否要退出App @Override protected void onNewIntent(Intent intent) { super.onNewIntent
()中关闭自身即可 若在后面的Activity启动 任务栈底的Activity时,就会调用任务栈底Activity的onNewIntent() 具体实现 步骤1:将 App的入口 Activity...:栈内复用模式 //singleInstance:单例模式 //如不设置,Activity的启动模式默认为 标准模式(standard) 步骤2:在入口 Activity重写 onNewIntent...() // 在该方法传入一标志位标识是否要退出App & 关闭自身 @Override protected void onNewIntent(Intent intent) {...super.onNewIntent(intent); if (intent !...()传入一标识符 // 作用:标识是否要退出App @Override protected void onNewIntent(Intent intent) { super.onNewIntent
Activity 实例不在栈顶 , 说明该 Activity 在栈底 , 并且上面还有若干 Activity 压着 , 已经存在的 Activity 实例会接收到一个回调 , 调用 Activity.onNewIntent...常量标志位 ; ② Activity 实例就在任务栈栈顶 ( 返回堆栈仅有一个 Activity ) : 如果 Activity 实例就在返回堆栈的栈顶 , 那么只需要调用 Activity 的 onNewIntent...方法复用 ; 该 Activity 实例不在栈顶 : 调用 onNewIntent 方法 , 并且设置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 标志清空除该根 Activity...之外的其它 Activity 实例 ; ③ 有该 Activity 实例的任务栈在前台 : 先将该任务激活到前台 , 然后执行下面操作 ; 该 Activity 实例在栈顶 : 直接调用 onNewIntent...方法复用 ; 该 Activity 实例不在栈顶 : 调用 onNewIntent 方法 , 并且设置 FLAG_ACTIVITY_BROUGHT_TO_FRONT 标志清空除该根 Activity
() 通过在入口 Activity 回调的onNewIntent()中关闭自身即可 当需要退出 App时启动入口 Activity 将 App的入口 Activity 采用 SingleTask 启动模式...() // 在该方法传入一标志位标识是否要退出App & 关闭自身 @Override protected void onNewIntent(Intent intent) {...super.onNewIntent(intent); if (intent !...()) 具体使用(从MainActivity(入口Activity) 跳转到 Activity2 & 一键退出) 步骤1:在MainActivity 中设置 重写 onNewIntent() //...()传入一标识符 // 作用:标识是否要退出App @Override protected void onNewIntent(Intent intent) { super.onNewIntent
2.SingleTop 栈顶Activity不会被重复创建,会触发onNewIntent()事件,不在栈顶时可以多次实例化。...task,创建一个Activity; (2)如果存在一个不同的task包含这个Activity的实例,会切换到这个task,将这个Activity以上的Activity弹出,并且触发这个Activity的onNewIntent...Activity的实例,但是在当前的task中本身就存在这个Activity实例,不会新建task,而会在当前task中,将这个Activity以上的Activity弹出,并且触发这个Activity的onNewIntent...如果没有一个task包含这个Activity的实例,会新建一个task,创建一个Activity; (2)如果存在一个task包含这个Activity的实例,会切换到这个task,并且触发这个Activity的onNewIntent
singleTop: 如果当前要启动的Activity就是在栈顶的位置,那么此时就会复用该Activity,并且不会重走onCreate方法,会直接它的onNewIntent方法,如果不在栈顶,就跟standard...此时不想让接收推送的消息的activity再次创建,那么此时正好可以用该启动模式,如果之前activity栈中是A–>B–>C如果点击了推动的消息还是A–>B–C,不过此时C是不会再次创建的,而是调用C的onNewIntent...FLAG_ACTIVITY_SINGLE_TOP 如果在上面的基础上再加上FLAG_ACTIVITY_SINGLE_TOP此时就不重新创建B了,也就直接走B的onNewIntent。...FLAG_ACTIVITY_CLEAR_TOP+FLAG_ACTIVITY_SINGLE_TOP=singleTask,此时要打开的activity不会被重建,只是走onNewIntent方法。...FLAG_ACTIVITY_NEW_TASK+FLAG_ACTIVITY_SINGLE_TOP 用在当app正在运行点击push消息进到某个activity中的时候,如果当前处于该activity,此时会触发activity的onNewIntent
领取专属 10元无门槛券
手把手带您无忧上云