前言 最近遇到一个奇葩的问题,应用X的Activity1中点击一个Button跳转到Activity2,手机A比手机B上快500ms左右,虽然手机A比手机B的配置高,但是我不信差距会那么大。...一、Trace先分析一下 我抓了两台手机的Trace简化后如下图,在UI线程发现两者一个重要的差异点,在手机B中,Activity1 onStop竟然跑在了ViewRootImpl doTraversal...5.2 应用X 1085 2273 V KobeWang: Activity idle: null NS:1 应用X的代码竟然能让Activity1跳转Activity2,NS为1,这样子Activity1...错误1:Activity1跳转Activity2代码特殊,造成NS为1,导致了onStop的提前,不是由正常的ActivityIdle的触发。...思考 有时间我还是要继续研究以下,如何让Activity1启动到Activity2的时候,NS为1,我看了一下应用X的Activity1和Activity2在不同的Task,我也改了一下我的Demo,变成两个
按下Activity1中的Button, 会跳转到Activity2; 按下Activity2中的button, 会通过EventBus去通知Activity1; Activity1会通过OnEvent...:3.1.1' 下面是主布局(Activity1): <?...; } }); } } 运行效果图: Activity1: ? 跳到Activity2,点击按钮,弹出Toast: ?..."); // popOutToast("接收到Event:" + event.msg); } 接着运行代码, 老规矩,Activity1跳转到Activity2, 点击“发送信息...”按钮, 连续点击两次(根据以上SecondActivity中写的按钮点击事件, 这里可以理解成连续post两次,一前一后), 观察logcat: ?
零、前言 standard:默认的启动模式 |---启动一个Activity,该Activity就会在返回栈中入栈 |---该Activity处于栈顶的位置 |---每次启动都会创建该...Activity的新实例 singleTop: |---在启动活动时若栈顶已经是该Activity,则认为可以直接使用它 singleTask: |---整个应用程序的上下文中只存在一个实例...|---两次相同实例之间的Activity会被杀死 singleInstance: |---启用一个新的返回栈来管理这个活动 一、测试类 Activity1 public class...E/TASK_ID: Activity1 销毁 E/TASK_ID: Activity2 销毁 E/TASK_ID: Activity1 销毁 可见第二次打开Activity2时并无变化,因为singleTop...: Activity1 销毁 可见第二次打开Activity2时并无变化,第三次打开Activity2,Activity1销毁 ?
来做,程序启动时显现启动画面,当启动完成后,它会被隐藏来。...在这里只是说明如何来做启动画面,所以就不详细来完成Activity了。...上图的例子是 从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,第二层是 Activity1,当我们在 Activity2中调用 Activity2.finish...()方法时,Activity Manager 重新激活 Activity1 并入栈,Activity2 从 Active 状态转换 Stoped 状态,同时标注Activity2可以被“回收” 。...当启动完成后,它会被隐藏。
TASK_ID: Activity2 Task id is 89 依次返回 E/TASK_ID: Activity2 销毁 E/TASK_ID: Activity1 销毁 E/TASK_ID: Activity2...销毁 E/TASK_ID: Activity2 销毁 E/TASK_ID: Activity1 销毁 2:singleTop模式:顶复用栈 在启动活动时若栈顶已经是该Activity,则直接使用它..., Activity2 为singleTask 依次打开Activity1、2、2、1、2 E/TASK_ID: Activity1 Task id is 94 E/TASK_ID: Activity2...E/TASK_ID: Activity1 销毁 4:singleInstance 单独实例栈 启用一个新的活动栈来管理这个活动(够豪,够任性) 测试:Activity1为standard, Activity2...一直想总结一下Activity的启动流程(),这里从Activity的生命周期入手 本文所讲述的启动流程主要是ActivityThread的H在接收到消息之后,即handleMessage 至于消息如何传递过来的将在跨进程通信篇讲述
比如说:从mainactivity跳转到activity-A(或者继续从activity-A再跳转到activity-B),这时候,从后台强杀,只会执行mainactivity的onDestroy方法,...(1- 4) (2) 通过跨进程的binder调用,进入到ActivityManagerService中,其内部会处理Activity栈,通知Activity1 Pause,Activity1 执行Pause...后告知AMS。...主线程拿到Activity2的信息后,调用Instrumentation类的newActivity方法,其内通过ClassLoader创建Activity2实例。...(37 - 40) (5) 通知Activity2去performCreate,走生命周期流程。(41 - 最后) https://www.jianshu.com/p/cf6efb2d1832 3.
当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。...随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变: void onCreate(Bundle saveInstanceState) void onStart() void onRestart...在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。...Service会先调用onUnbind(),然后是onDestory(). android的接收员:BroadcastReceiver 广播接收者用于异步接收广播Intent 广播接收者没有界面,但是接收到消息后可以启动一个...Activity,或者可以使用NotifcationManager来通知用户。
Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重用栈顶的实例( 调用onNewIntent()) 具体使用(从MainActivity(入口Activity) 跳转到 Activity2...& 一键退出) 步骤1:在MainActivity 中设置 重写 onNewIntent() MainActivity.java // 设置 按钮 跳转到Activity2...的上层的Activity2会被销毁,此时MainActivity位于栈顶;由于步骤2的设置,所以不会新建MainActivity而是重用栈顶的实例&调用实onNewIntent()...(即Activity1 - Activity2 -Activity3(在Activity3调用上述两个方法)) 答: 结束Activity3(当前 Activity )& 结束进程 再次重新开启进程 &...启动 Activity1 、 Activity2 即在Android 中,调用上述Dalvik VM本地方法结果是: 结束当前 Activity & 结束进程 之后再重新开启进程 & 启动 之前除当前
具体使用(从MainActivity(入口Activity) 跳转到 Activity2 & 一键退出) 步骤1:在MainActivity 中设置 重写 onNewIntent() MainActivity.java...)启动MainActivity & 设置标记位 // 当需要退出时,启动入口Activity Intent intent = new Intent();...的上层的Activity2会被销毁,此时MainActivity位于栈顶;由于步骤2的设置,所以不会新建MainActivity而是重用栈顶的实例&调用实onNewIntent()...(即Activity1 - Activity2 -Activity3(在Activity3调用上述两个方法)) 答: 1....再次重新开启进程 & 启动 Activity1 、 Activity2 ? 即在Android 中,调用上述Dalvik VM本地方法结果是: 1.
,而是重用栈顶的实例( 调用onNewIntent()) 具体使用(从MainActivity(入口Activity) 跳转到 Activity2 & 一键退出) 步骤1:在MainActivity 中设置...)启动MainActivity & 设置标记位 // 当需要退出时,启动入口Activity Intent intent = new Intent();...的上层的Activity2会被销毁,此时MainActivity位于栈顶;由于步骤2的设置,所以不会新建MainActivity而是重用栈顶的实例&调用实onNewIntent()...(即Activity1 - Activity2 -Activity3(在Activity3调用上述两个方法)) 答: 结束Activity3(当前 Activity )& 结束进程 再次重新开启进程...& 启动 Activity1 、 Activity2 ?
先说Activity 的四种启动模式: 1:standard:默认模式,不需要配置LaunchMode,默认在从Activity1跳转到Activity2,然后从Activity2跳转到Activity3...,此时不管桟中有没有Activity2、3,程序都会新创建一个新的Activity,最后依次返回,会按照倒叙的顺序依次退出,类似退桟的过程。...4:singleInstance:也是只创建一个实例,启动一个程序可以看作创建了一个Task,这个Task中可以创建很多Activity,另外一个程序中Task,也会存放许多Activity,如果在第一个程序的
一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),我们可以通过action来启动对应Activity(隐式启动)。...接下来我们来正式看Activity的启动模式: 二、Activity启动模式: 1....每个Activity界面都只有一个显示当前界面名称的TextView和一个用来组跳转的Button,所以应用OneText的功能就是从活动1跳转到活动2,活动2继续跳转活动2,代码就不给大家展示了,都能写出来...同样我们也用代码来实现一下这个过程: 还是刚才的那一坨代码,只是我们修改一下Activity1的模式为singleTask,然后让Activity2跳转到Activity3,让Activity3跳转到Activity1...在跳回MainActivity之后点击back键发现直接退出引用了,这说明此时的MainActivity为task内的最后一个Activity。所以这个模式过。
它将为按钮与操作行为转换提供一些默认动画,我们可以定制触摸反馈,使用揭露效果,定制操作行为转换,指定定制转换,使用转换启动一个操作行为,以共享元素启动一个操作行为等等。...该方法一般写在startActivity()后和finish()后,如果我们想打开或者退出不显示动画,可将参数设置为0。...对于Activity 可能你不太理解为什么是设置了四种,假如有Activity1和Activity2。...当我们在Activity1中跳转到Activity2时,Activity1在页面上消失是执行的:activityOpenExitAnimation动画,Activity2出现在屏幕上执行的动画是activityOpenEnterAnimation...当Activity2 finish返回Activity1时,Activity2执行的动画是activityCloseExitAnimation,Activity1显示在屏幕执行的是activityCloseEnterAnimation
当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上...当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前 activity从task栈中移出后栈顶的那个activity。...启动activity2: 模式/分类 包容activity2的task 一个activity是否允许有多个实例 activity是否允许有其它activity共存于一个task 对于新的intent,是否总是实例化...activity对象 standard 如果不包含FLAG_ACTIVITY_NEW_TASK标记,则activity2放入 task1,否则按前面讲述的规则为activity2选择task 可被多次实例化...如果activity1的运行在该模式下,则activity2一定与activity1位于不同的task 对于新到的intent,如果是由新创建的activity对象来接收,则用户可以通过返回键回到之前的
比如: activity1 和 activity2 中有两个一模一样的内容,从 activity1 跳转到 activity2 时我们才运用共享元素的动画效果,达到更加的 ui 体验。...如何使用 我们知道开启一个 activity 只需 startActivity(); 即可,更多的是,我们要想加入过渡动画,也只需要在 startActivity(); 中传入需要的参数即可。...第一步: 例如,我要从 MainActivity 中启动 AnimationActivity,只需要在 MainActivity 中 startActivity(); 传入参数即可,代码如下: startActivity...import butterknife.ButterKnife; import butterknife.OnClick; @SuppressLint("NewApi") public class MainActivity...毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者! 腾讯T3大牛带你了解 2019 Android开发趋势及必备技术点!
本篇博文中用于汇总Android开发中的各种通用技巧,方便使用时复制 启动页 新建Activity,命名为Splash 跳转时间设为2000ms Splash.java public class...mainIntent); Splash.this.finish(); } },2000); } } 在Manifest中设置启动和主题...android.intent.category.LAUNCHER" /> 在themes.xml中添加主题,设置通知栏颜色和背景图片...Activity1: <ImageView android:id="@+id/share" android:layout_width="100dp...logo" android:adjustViewBounds="true" android:transitionName="shareElement"/> Activity2
其中重要的两个方法: onCreate() ,系统在创建Activity时调用此方法;在此方法实现视图绑定;一些 控件的初始化 onPuase(); 用户离开当前Activity调用的第一个方法 , 创建完成后必须在... 最简单的Activity 只绑定了一个视图 public class MainActivity...ImageView } } ---- 保存Activity的状态 当用户 离开Activity去往另一个Activity时;Activity会被压入返回栈,如果内存不够就会被销毁 ,当Activity被销毁后其中的数据当然就没了...Dialog Activity 你可以看到原本的Activity ,但是已经失去了焦点 ,无法交互 onStop() :当前Activity被覆盖时调用 例如 当前activity1跳往到activity2...,activity就会把activity1覆盖,这时就调用了此方法 onRestart(); 重新启动 onDestroy():activity再结束前调用的最后一个方法;这里可以进行一些释放资源的操作
启动方式有startService和bindService startService:onCreate只会在Service第一次创建的时候被调用,start一次之后,下次不会再onCreate了,每次会执行...再例如,Activity1创建了一个子线程,Activity2是无法对Activity1创建的子线程进行操作。...enabled:boolean类型,true表示该服务默认被系统启动。 exported:表示该服务是否能够被其他应用程序控制或连接,是否向外通过服务。 四....在Notification内部,操作本身由PendingIntent定义,后者包含在应用中启动Activity的Intent。...例如,如果要在用户点击抽屉式通知栏中的通知文本时启动Activity,则可通过调用setContentIntent()来添加PendingIntent。
下面以Activity为例详细介绍插件化如何支持组件生命周期的管理。...下图展示了启动插件Activity的过程: image.png 具体的过程如下: 首先需要通过统一的入口(如图中的PluginManager)启动插件Activity,其内部会将启动的插件Activity...hook方式 image.png Activity1调用startActivity,实际会调用Instrumentation类的execStartActivity方法,Instrumentation是系统用来监控...ApplicationThread将启动Activity2的信息通过H对象发送给主线程。...主线程拿到Activity2的信息后,调用Instrumentation类的newActivity方法,其内通过ClassLoader创建Activity2实例。
Activity的启动过程 ?...上图列出的是启动一个Activity的主要过程,具体步骤如下: Activity1调用startActivity,实际会调用 Instrumentation类的 execStartActivity方法,...ApplicationThread将启动Activity2的信息通过H对象发送给主线程。...主线程拿到Activity2的信息后,调用Instrumentation类的 newAcitivity方法,其内部通过ClassLoader创建Activity2实例。...属性,并将其置于mActivities中,而mInstrumentation的newActivity方法已经被我们hook了,所以该activity即为插件Activity,后续各个生命周期的调用都会通知给插件
领取专属 10元无门槛券
手把手带您无忧上云