am start -W -n com.dfp.test/.TEstActivity
-W:等目标Activity启动后才返回
-n:用于设置Intent的Component
Am.java->run()->runStart()
——intent = makeIntent();
——intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
——mAm.startActivityAndWait(); //调用AMS处理startActivityAndWait
ActivityManagerService.java->startActivityAndWait(......)
//一般情况下Activity是由另一个应用发起的,此时IApplicationThread是应用和AMS交互的通道,也可算是调用进程的表示。am不是一个应用进程,所以IApplicationThread caller变量为null。
//requestCode为调用者发送的代码,具体含义由调用者解释。如果该值大于0,AMS会保存该值并通过onActivityResult返回给调用者。用于记录启动了哪个Activity的功能
————mMainStack.startActivityMayWait() //4.4中为mStackSupervisor.startActivityMayWait()
//Activity调度需要ActivityStack,是核心角色
//Activity对应管理类为ActivityRecord表示
//Task由一组Activity组成,用于完成一组特定的功能,对应管理类为TaskRecord表示。同一时间只有以个Task可以显示在前台,其余在后台。Task中只有最前端的Activity可以运行,其他会停止运行。以前很多应用,一个Task里的Activity都在同一个Application中,现在很多Task可以由不同Application的Activity组成。
//ActivityStack只保存ActivityStack不保存TaskRecord。直接管理ActivityStack,弱化了Task的概念。提高了效率,降低了结构清晰度。
ActivityStackSupervisor.java->startActivityMayWait()
4.4中新增了mStackSupervisor,部分函数从ActivityStack移到ActivityStackSupervisor,ActivityStack的一些调用会使用mActivityStackSupervisor进行,反之亦是。
对 Task 的操作,AMS 使用 mStackSupervisor 来进行。对于 Acitivity 的操作,AMS 使用 ActivityStack 来进行。
系统中只有两个 ActivityStack,一个是 mHomeStack,用于保存 Launcher 的Activity,另一个是 mFocusedStack,用于保存非 Launcher 的 App 的 Activity。
第一阶段:获取资源和变量
——intnent.getcomponent(); //查找Component,如果Component存在,则省去匹配搜索Intent(本例不为null)
——aInfo = resolveActivity(); //查询满足条件的ActivityInfo,在resolveActivity内部与uPKMS交互
——callingPid = Binder.getCallingPid(); //获取调用进程的PID,UID
——callingUid = Binder.getCallingUid();
第二阶段:启动Activity
——int res = startActivityLocked(); //启动Activity
————sourceRecord = isInAnyStackLocked(); //发送请求的ActivityRecord
————resultRecord = sourceRecord.resultTo; //接收启动结果的ActivityRecord。通常是同一个
————callerApp = mService.getRecordForAppLocked(caller); //如果caller不为空,需要找到对应的ProcessRecord,从而获得PID/VID
————launchFlags = intent.getFlags(); //获取启动Flags
————mService.checkPermission(); //检查权限
————mService.checkComponentPermission();
————mService.mController.activityStarting(); //(Monkey测试)交给回调对象处理,由他判断是否能继续后面的行程
————ActivityRecord r = new ActivityRecord(); //创建一个ActivityRecord对象
————mService.checkAppSwitchAllowedLocked(callingPid, callingUid); //检查调用进程是否有权限切换Application,如果没有则储存起来,有机会再启动它。将保存到mPendingActivityLaunchers中
//没有权限切换意味着当前显示的应用进行了stopAppSwitches。这个方法会使其他Task的Activity无法显示在前端,但同一个Task中的Activity则不受制约。取消禁止切换使用resumeAppSwitches。为了防止使用者不调用resumeAppSwitches,系统设置了一个超时时间(5s),超时则自动resume。在resume中不会处理Pending起来的Activity,但超时会触发处理Pending的Activity。
————mService.doPendingActivityLaunchesLockedd(false); //启动处于Pending状态的Activity,即之前由于上一步被禁止切换而保存起来的请求。它将先于本次需要启动的Activity处理
————startActivityUncheckedLocked(); //处理启动请求,为新建的ActivityRecord找到合适的Task
——————//单独分析
——mService.updateConfigureationLocked(); //如果configuration发生变化,则调用AMS更新configuration
第三阶段:处理结果
——outResult.result = res; //设置启动结果
——if (res == IActivityManager.START_SUCCESS) mService.wait(); //如果启动成功了,等待启动结果。为什么res返回成功还要等待呢?因为Activity要运行在一个新的应用i进程中,就必须等待那个应用进程正常启动并处理相关请求。注意,只有am设置了-W选项,才会进入wait状态。
——if (err != START_SUCCRSS) sendActivityResultLocked(); return err; //如果有问题,则返回错误
startActivityUncheckedLocked()
第一阶段
int launchFlags = intent.getFlags();
launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; //根据sourceRecord.launchMode判断是否需要设置FLAG_ACTIVITY_NEW_TASK。
第二阶段
boolean addingToTask = false;
boolean movedHome = false;
ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE ? findTaskLocked(r) : findActivityLocked(intent, r.info);
r.task = intentActivity.task; //ActivityRecord r
targetStack = intentActivity.task.stack;
//找到合适的Task做一些ActivityStack中的处理
第三阶段
boolean newTask = false;
boolean keepCurTransition = false;
//增加一个Task,如果前面设置了FLAG_ACTIVITY_NEW_TASK
mService.curTask++; //当前Task数量加一
- android 25 跨进程启动activity
跨进程启动activity,启动系统预定义的activity就是跨进程的. client项目启动server项目的activity. clientActivity.java package com.s ...
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6703247 上文介绍了Android应用程序的 ...
- Android - 使用Intent来启动Activity
本文地址: http://blog.csdn.net/caroline_wendy/article/details/21455141 Intent 的用途是 绑定 应用程序组件, 并在应用程序之间进行 ...
- [Android UI] Service里面启动Activity和Alertdialog
启动Activity源码:(记得要加上Intent.FLAG_ACTIVITY_NEW_TASK) Intent intent = new Intent(); intent.setFlags(Inte ...
- 我的Android进阶之旅------>启动Activity的标准Action和标准Category
Android内部提供了大量标准的Action和Category常量. 除了参考本文外,您还可以参考了以下链接: http://developer.android.com/reference/andr ...
- Android Framework层Power键关机流程(二,关机流程)
二,关机流程 从前一篇博文我们知道,当用户长按Power键时会弹出(关机.重启,飞行模式等选项)对话框,我们点击关机,则会弹出关机确认对话框.那么从选项对话框到关机确认对话框又是一个什么流程呢.下面我 ...
- Android Framework层Power键关机流程(一,Power长按键操作处理)
一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...
- 从零开始学android开发-用Intent启动Activity的方法
启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new ...
- Android 在Service里面启动Activity
直接在代码: Intent dialogIntent = new Intent(getBaseContext(), YourActivity.class); dialogIntent.addFlags ...
随机推荐
- JAVA开发工作流程
阶段 0 :拟出一个计划 决定在后面的过程中采取哪些步骤,思考整个开发任务如何实现,分步骤建立“路标”,这样可以帮助自己开发时一步一个脚印的逐步完成,有效的防止自己在开发过程中迷失方向. 阶段 1 : ...
- BZOJ 1022 小约翰的游戏(anti-sg)
这是个anti-sg问题,套用sj定理即可解. SJ定理 对于任意一个Anti-SG游戏,如果定义所有子游戏的SG值为0时游戏结束,先手必胜的条件: 1.游戏的SG值为0且所有子游戏SG值均不超过1. ...
- 【hdu4734】F(x) 数位dp
题目描述 对于一个非负整数 $x=\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...
- 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp
题目描述 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L ...
- [CH弱省胡策R2]TATT
description 洛谷 data range \[ n\le 5\times 10^4\] solution 这就是四维偏序了... 好象时间复杂度是\(O(n^{\frac{5}{3}})\) ...
- BZOJ 1342: [Baltic2007]Sound静音问题 | 单调队列维护的好题
题目: 给n个数字,一段合法区间[l,l+m-1]要求max-min<=c 输出所有合法区间的左端点,如果没有输出NONE 题解: 单调队列同时维护最大值和最小值 #include<cst ...
- 快速搭建http服务:共享文件--Java的我,不知Python你的好
在 Linux 服务器上或安装了 Python 的机器上, 我们可以在指定的文件目录下,使用 python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web ...
- H5背景音乐自动播放(兼容微信IOS,进程后台切换自动停止播放,本文例子为Vue写法)
<template> <audio src="./static/music.mp3" id="bgMusic" preload="a ...
- linux内存管理及手动释放机制
inux系统中查看内存状态一般都会用到free linux的free命令中,cached和buffers的区别 Free Mem:表示物理内存统计 -/+ buffers/cached:表示物理内存的 ...
- UIColor延伸:判断两个颜色是否相等
不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的.CoreGraphics中提供一个函数,用于判断两个CGColor是否相等,因此我们可以通过这 ...