Android中启动Activity-startActivity-流程图分析
Android之Activity启动流程详解(基于api28)

Android之Activity启动流程详解(基于api28)前⾔Activity作为Android四⼤组件之⼀,他的启动绝对没有那么简单。
这⾥涉及到了系统服务进程,启动过程细节很多,这⾥我只展⽰主体流程。
activity的启动流程随着版本的更替,代码细节⼀直在进⾏更改,每次都会有很⼤的修改,如android5.0 android8.0。
我这⾥的版本是基于android api28,也是⽬前我可以查得到的最新源码了。
事实上⼤题的流程是相同的,掌握了⼀个版本,其他的版本通过源码也可以很快地掌握。
因为涉及到不同的进程之间的通信:系统服务进程和本地进程,在最新版本的android使⽤的是AIDL来跨进程通信。
所以需要对AIDL有⼀定的了解,会帮助理解整个启动流程。
源码部分的讲解涉及到很多的代码讲解,可能会有⼀点不适,但还是建议看完源码。
源码的关键代码处我都会加上注释,⽅便理解。
代码不会过分关注细节,只注重整体流程。
想知道具体细节可以去查看源码。
每份代码所在的路径我都会在代码前⾯标注出来,各位可以去查看相对应的源码。
每部分源码前我都会放流程图,⼀定要配合流程图⾷⽤,不然可能会乱。
整体流程概述这⼀部分侧重于对整个启动流程的概述,在⼼中有⼤体的概念,这样可以帮助对下⾯具体细节流程的理解。
普通Activity的创建普通Activity创建也就是平常我们在代码中采⽤startActivity(Intent intent)⽅法来创建Activity的⽅式。
总体流程如下图:启动过程设计到两个进程:本地进程和系统服务进程。
本地进程也就是我们的应⽤所在进程,系统服务进程为所有应⽤共⽤的服务进程。
整体思路是:1. activity向Instrumentation请求创建2. Instrumentation通过AMS在本地进程的IBinder接⼝,访问AMS,这⾥采⽤的跨进程技术是AIDL。
3. 然后AMS进程⼀系列的⼯作,如判断该activity是否存在,启动模式是什么,有没有进⾏注册等等。
startactivityifneeded使用说明

startactivityifneeded使用说明`startActivityIfNeeded`是Android中的一个方法,用于在需要时启动一个新的活动(Activity)。
使用方法:```javaboolean startActivityIfNeeded(Intent intent, int requestCode)```参数说明:- `intent`:需要启动的活动的意图(Intent)。
包含了活动的基本信息,如包名、类名、数据等。
- `requestCode`:请求码,用于识别启动活动的结果。
使用示例:```javaIntent intent = new Intent(MainActivity.this, SecondActivity.class);startActivityIfNeeded(intent, REQUEST_CODE);```注意事项:1. 该方法会在当前活动和目标活动之间的活动栈进行检查,如果目标活动尚未启动,则会自动启动它。
2. 如果目标活动已经在栈顶,且没有指定`requestCode`,则不会启动新的活动。
3. 如果目标活动已经在栈顶,但指定了`requestCode`,则会以该请求码启动新的活动并获取结果。
4. 若启动了新的活动,则会将活动推入栈顶,并在返回时销毁中间的活动。
这个方法在某些场景下非常有用,例如:- 当需要在某个特定条件下启动一个新的活动,并且只有当该条件满足时才会启动。
- 当需要在某个操作完成后,根据不同的结果启动不同的活动。
`startActivityIfNeeded`方法可以确保在需要时正确启动目标活动,提供了更好的用户体验和流程控制。
activity流程操作

activity流程操作Activity是Android应用程序中的一个重要组件,它负责管理用户界面和用户交互。
在Android开发中,我们经常需要对Activity进行流程操作,以实现不同的功能和交互效果。
本文将介绍一些常见的Activity流程操作,帮助开发者更好地理解和使用Activity组件。
1. 启动Activity启动Activity是Android应用程序中最基本的操作之一。
我们可以通过Intent对象来启动一个新的Activity,并传递数据给新的Activity。
例如,我们可以通过以下代码启动一个新的Activity:```javaIntent intent = new Intent(this, SecondActivity.class);intent.putExtra("key", "value");startActivity(intent);```在新的Activity中,我们可以通过getIntent()方法获取传递过来的数据,并进行相应的处理。
2. 生命周期管理Activity有多个生命周期方法,如onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()等。
我们可以通过这些生命周期方法来管理Activity的状态和行为。
例如,我们可以在onCreate()方法中进行初始化操作,在onResume()方法中进行界面更新操作,在onPause()方法中保存数据等。
3. 返回数据在Activity之间进行数据交换是常见的操作。
我们可以通过startActivityForResult()方法启动一个新的Activity,并在新的Activity中通过setResult()方法返回数据给上一个Activity。
例如,我们可以通过以下代码启动一个新的Activity并获取返回数据:```javaIntent intent = new Intent(this, SecondActivity.class);startActivityForResult(intent, REQUEST_CODE);```在新的Activity中,我们可以通过以下代码返回数据给上一个Activity:```javaIntent intent = new Intent();intent.putExtra("result", "data");setResult(RESULT_OK, intent);finish();```在上一个Activity中,我们可以通过onActivityResult()方法获取返回的数据,并进行相应的处理。
android startactivityascaller方法

android startactivityascaller方法startActivityAsCaller方法是Android中的一个重要方法,用于启动一个新的Activity并将调用者的身份传递给新的Activity。
这个方法可以在一个应用中的不同组件之间实现页面的跳转和传递数据。
使用startActivityAsCaller方法,可以确保新的Activity以调用者的身份运行,这意味着新的Activity将继承调用者的权限和上下文信息。
这对于需要以特定权限或身份运行的操作非常有用。
要使用startActivityAsCaller方法,首先需要在调用者组件中获取一个Intent对象,用于指定要启动的Activity和传递的数据。
然后,可以使用该Intent对象调用startActivityAsCaller方法。
例如,以下代码演示了如何在一个Activity中使用startActivityAsCaller方法启动一个新的Activity:```javaIntent intent = new Intent(this, NextActivity.class);intent.putExtra("data", "Hello, World!");startActivityAsCaller(intent, null, null, null, false, 0);```在上面的代码中,我们创建了一个Intent对象,并将要启动的Activity以及需要传递的数据指定为其参数。
然后,通过调用startActivityAsCaller方法,我们可以将调用者的身份传递给新的Activity,并启动它。
需要注意的是,startActivityAsCaller方法还有其他参数,例如启动模式、Activity选项等,可以根据具体需求进行设置。
总结来说,startActivityAsCaller方法是Android提供的一个功能强大的方法,用于在应用组件之间实现页面的跳转和传递数据。
全面解析Activity-的4种启动模式

全面解析Activity 的4种启动模式说到Android的启动模式,首先来看一个实际的业务场景。
我之前在公司实习的时候,我所在的部门只负责一个品类〔国际机票〕,那用户从机票首页开始搜索机票到最终完成订单并支付大致分为以下几个流程〔实际流程因为考虑的问题比拟多,所以要比这稍微复杂些〕:1. 用户在机票首页确认好出发、到达目的地、日期与人数后,就可以点击“搜索〞进入到搜索结果页2. 用户根据意愿选择相应航班并点击进入确认订单页3. 用户确认好订单容点击下单,开始支付,支付完成跳支付完成页4. 用户可以选择回到首页,或者去公共订单系统查看订单详情〔这属于公共局部,不在我们讨论的围了〕经过上面4个步骤整个购票流程就算完毕了。
但是,这里有个问题,就是用户从首页到最后的支付完成页之间经历了这么多的Activity,那用户完成了支付后想回到首页是不是要一层一层的往回退才行?如果是这样的话,那就太不人性化了,那怎样才能在完成支付后一键回到首页呢?有人可能会说,那就直接从支付完成页跳转到首页不就可以了吗?这样当然是可以的,但是这样做那之前打开的那么多Activity怎么办呢?难道就让它们待在Activity任务栈中吗?这样岂不是太浪费存了!请看我画的示意图:如上图所示,如果我们在支付完成之后启动首页Activity那页面1-页面5之间的所有Activity对用户来说都是无用的,并且占用的存,极浪费这本来可能就很紧的Android 存资源。
那有没有一些优雅的方式来解决这个问题呢?我们可以想象一下,有没有可能在从页面4跳转首页的时候把原来处于首页之上的所有Activity全部干掉呢?这样不就刚好解决了我们刚刚所说浪费资源的问题了吗?就像下列图一样:很显然,无论从用户体验的角度还是从存优化的角度来看第二种方式都是最为优雅的。
那怎么实现这种需求呢?有人可能会说,可以将任务栈中页面1之上的所有Activity 一层一层地执行finish()方法销毁掉,这样就可以回退到页面1。
startactivityinner 源码 解析

startactivityinner 源码解析摘要:1.Android 中的StartActivity 方法介绍2.StartActivity 的工作原理3.StartActivity 参数解析4.常见问题及解决方法5.实战案例分享正文:作为一名Android 开发者,熟练掌握StartActivity 方法对于实现应用程序的跳转功能至关重要。
本文将详细介绍Android 中的StartActivity 方法,解析其工作原理,并分析常见问题及解决方法。
最后,将通过实战案例分享,帮助大家更好地理解和应用StartActivity。
1.Android 中的StartActivity 方法介绍在Android 中,StartActivity 方法是Activity 类中的一个方法,用于启动另一个Activity。
通过调用这个方法,可以实现不同界面之间的跳转,使得应用程序的功能更加丰富。
StartActivity 方法的定义如下:```javapublic void startActivity(Intent intent)```参数:- Intent:表示要启动的Activity 的Intent 对象。
2.StartActivity 的工作原理StartActivity 方法启动另一个Activity 的过程可以分为以下几个步骤:- 创建一个Intent 对象,表示要启动的Activity。
- 调用startActivity 方法,将Intent 对象传递给目标Activity。
- 目标Activity 接收到Intent 对象,根据Intent 中的信息创建对应的实例。
- 目标Activity 实例启动,并设置界面布局。
- 源Activity 完成跳转,退出屏幕。
3.StartActivity 参数解析在StartActivity 方法中,Intent 对象包含了要启动的Activity 相关信息。
以下是Intent 对象中常用的参数:- action:表示Activity 启动的类型,例如ACTION_VIEW、ACTION_EDIT 等。
activity流程

activity流程Activity流程是一种流程图,用于描述业务流程或系统流程。
它是一种非常常见的流程图,被广泛应用于软件开发、业务流程设计等领域。
Activity流程图可以帮助我们更好地理解业务流程或系统流程,从而更好地进行流程优化和改进。
下面,我们将详细介绍Activity流程的相关内容。
一、Activity流程的基本概念Activity流程是一种基于UML的流程图,它包括以下几个基本概念:1.活动(Activity):表示业务流程或系统流程中的一个步骤或操作。
2.开始(Start):表示业务流程或系统流程的开始。
3.结束(End):表示业务流程或系统流程的结束。
4.决策(Decision):表示业务流程或系统流程中的一个分支,用于判断流程的走向。
5.合并(Merge):表示业务流程或系统流程中的一个合并点,用于将分支汇聚。
6.流程线(Flow):表示业务流程或系统流程中的流程走向。
二、Activity流程的绘制方法Activity流程的绘制方法非常简单,只需要按照以下步骤进行即可:1.确定业务流程或系统流程的开始和结束。
2.确定业务流程或系统流程中的活动。
3.确定业务流程或系统流程中的决策和合并。
4.绘制流程线,将各个元素连接起来。
5.调整流程图的布局,使其更加清晰易懂。
三、Activity流程的优点Activity流程具有以下几个优点:1.易于理解:Activity流程图采用图形化的方式展示业务流程或系统流程,使得人们更容易理解和掌握。
2.易于优化:Activity流程图可以帮助我们发现业务流程或系统流程中的瓶颈和问题,从而更好地进行流程优化和改进。
3.易于沟通:Activity流程图可以帮助不同部门之间更好地沟通和协作,从而提高工作效率。
四、Activity流程的应用场景Activity流程图可以应用于以下几个场景:1.软件开发:Activity流程图可以帮助软件开发人员更好地理解软件系统的业务流程,从而更好地进行软件开发和测试。
intent在android中的用法

intent在android中的用法在Android开发中,Intent是一种用于在应用程序组件之间传递信息的消息对象。
它可以用于启动活动(Activity)、服务(Service)或发送广播(Broadcast)。
以下是Intent在Android 中的几种常见用法:1.启动活动(Starting Activities):使用Intent启动一个新的活动。
例如,从当前活动跳转到另一个活动。
2.传递数据给活动(Passing Data to Activities):通过Intent的putExtra()方法,可以传递基本数据类型、字符串、序列化对象等。
3.返回数据给调用活动(Returning Data to the Calling Activity):使用startActivityForResult()启动新活动,并在新活动中使用setResult()设置返回数据。
4.启动服务(Starting Services):使用Intent启动服务,服务可以在后台执行长时间运行的操作。
5.发送广播(Sending Broadcasts):使用Intent发送广播,所有注册了相应广播接收器的组件都可以接收到广播。
6.隐式意图(Implicit Intents):不指定具体的组件类,而是声明要执行的操作。
系统会选择能够处理该操作的组件。
7.PendingIntent:PendingIntent是一种特殊的Intent,它允许你在稍后的某个时间点执行一个操作,或者由其他应用程序执行。
常用于通知、闹钟等场景。
8.使用Intent过滤器(Intent Filters):在AndroidManifest.xml中,使用<intent-filter>标签来声明活动、服务等可以响应哪些类型的Intent。
这对于定义应用程序的主入口点或响应系统事件非常有用。