- 浏览: 624952 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
记得公司同事也提过这个启动过程,共4个步骤:
1 .init进程启动
2 .Native服务启动
3 .SystemSever,Android服务Init2
4 .Home启动
现在我们按照执行顺序挨个来看:
1. init进程启动
Init.c[1047行]:看main函数可知,他在解析init.rc和/init.%s.rc脚本
/* -----------------init.rc-----------------------------*/
INFO("reading config file\n");parse_config_file("/init.rc");
qemu_init();import_kernel_cmdline(0); get_hardware_name();
/* -----------------init.%s.rcinit.%s.rc-----------------------------*/
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);parse_config_file(tmp);
Init.rc[383行]:这是一个Android自定义格式的脚本【详细我将用一片文档类别的日志粘贴上去】有4中类型:Action,Commands,Service,Options
那么他的启动如下:
Init.c打开rc文件解析服务,存于service_list中/*具体怎么解析不做研究*/
简单的解释下:int parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
/* DUMP();它解析内容:struct service *svc;struct action *act;struct command *cmd;struct listnode *node;struct listnode *node2;struct socketinfo *si;
是list_for_each()这个方法进行具体解析的,这里就不作更深的代码黏贴了,读者可以自己去看*/
int n;
return 0;
}
那么他是如何开启Native和Android的服务的呢?
Service的启动靠的是serivce_start在main函数启动,在死循环中:
for(;;) {
int nr, i, timeout = -1;
for (i = 0; i < fd_count; i++)
ufds[i].revents = 0;
drain_action_queue();
restart_processes();// 会遍历Service,restart_service_if_needed,调用serivce_start()
if (process_needs_restart) {
timeout = (process_needs_restart - gettime()) * 1000;
if (timeout < 0)
timeout = 0;
}
而serivce_start()做的时期就是初始化好srv[service],并调用execve()方法,从而建立Service进程。
//具体代码请作者自己去看,这里就不黏贴了。
启动Zygote:Zygote的职责就是产生Activity,(接受ActivityManagerService请求)将单独写文章理解
启动System Server:在ZygoteInit这个类中,他启动了SystemServer进程:
在ZygoteInit这个类的main函数中 :有这样一段代码
if (argv[1].equals("true")) {
startSystemServer();
//Zygote.forkSystemServe->启动了SystemServer进程
}
至于系统的Native服务和Android服务的启动过程,上一次日志,我们已经写过了,这里就不在缀诉。在每个服务启动后了之后,都会回调相应服务的onSystemReady()来执行回调的代码,同样的ActivityManager也是又这个回调函数:,
// 如下服务是构建回调ActivityManagerService所要的服务,我们单独列出来
final BatteryService batteryF = battery;
final ConnectivityService connectivityF = connectivity;
final DockObserver dockF = dock;
final ThrottleService throttleF = throttle;
final UiModeManagerService uiModeF = uiMode;
final AppWidgetService appWidgetF = appWidget;
final WallpaperManagerService wallpaperF = wallpaper;
final InputMethodManagerService immF = imm;
final RecognitionManagerService recognitionF = recognition;
final LocationManagerService locationF = location;
//我们告诉ActivityManagerService现在可以运行第三方代码了,他们一旦获得状态就会回调我们的CallBack来完成整个初始化过程。原文注释如下:
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (but before it has actually
// started launching the initial applications), for us to complete our
// initialization.
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
if (batteryF != null) batteryF.systemReady();
if (connectivityF != null) connectivityF.systemReady();
if (dockF != null) dockF.systemReady();
if (uiModeF != null) uiModeF.systemReady();
if (recognitionF != null) recognitionF.systemReady();
Watchdog.getInstance().start();
if (appWidgetF != null) appWidgetF.systemReady(safeMode);
if (wallpaperF != null) wallpaperF.systemReady();
if (immF != null) immF.systemReady();
if (locationF != null) locationF.systemReady();
if (throttleF != null) throttleF.systemReady();
}
});
这样就调用了ActivityManagerService的systemReady(final Runnable goingCallback)。
ActivityManagerService的systemReady(),当判断为mSystemReady为true的时候,便会回调goingCallback.run。这种多线程的代码的组织技巧也是我们应该学习的。我们甚至看到如果主题是CategoryHome,那么系统是不会回收的。
言归正传:在systemReady()里调用这么个方法:resumeTopActivityLocked(null),他引导了Home的启动。
在这个resumeTopActivityLocked (HistoryRecord prev)有这样一个代码
if (next == null) {// HistoryRecord next = topRunningActivityLocked(null);
// 没有其他Activity,只要启动Home就好
return startHomeActivityLocked();
}
付解释代码:
private final HistoryRecord topRunningActivityLocked(HistoryRecord notTop) {
int i = mHistory.size()-1;
while (i >= 0) {
HistoryRecord r = (HistoryRecord)mHistory.get(i);
if (!r.finishing && r != notTop) {
return r;
}
i--;
}
return null;
}
在这个函数里便启动了HomeActivity。
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1408当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 21521.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1579刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 986从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2435android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1508F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1124添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1121declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5217如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1036从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1754JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2786Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1610public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1603使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10033PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 860这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9281.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1073在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1010public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1902首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
Android 程序启动界面Demo.zip Android 精仿QQ登录界面源码.rar Android 网络监视器源码.zip android 遮罩层效果.zip Android_Home.rar Android之GPS定位.zip Android代码调用C++代码和C++代码调用Android代码.zip ...
Android应用源码之 程序启动界面Demo.zip项目安卓应用源码下载Android应用源码之 程序启动界面Demo.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android应用源码之网络判断,界面启动.zip项目安卓应用源码下载Android应用源码之网络判断,界面启动.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android 程序启动界面源码.zip项目安卓应用源码下载Android 程序启动界面源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载Android应用源码之程序启动界面Demo(动态).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目...
Android应用源码之隐藏安装包图标使用其他应用启动本应用.zip项目安卓应用源码下载Android应用源码之隐藏安装包图标使用其他应用启动本应用.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究...
Android应用源码之模仿UC等软件启动画面加载时闪烁点的样式.zip项目安卓应用源码下载Android应用源码之模仿UC等软件启动画面加载时闪烁点的样式.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习...
android启动及欢迎界面.zip项目安卓应用源码下载android启动及欢迎界面.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
本项目是一个基于安卓的天气预报项目源码,与这个项目(http://www./source/491.html)在功能和界面上有80%的相似度,只是增加了第一次启动引导页面,去掉了桌面小插件部分功能,同样采用www.weather.com.cn的天气接口...
Android应用源码之项目启动的时候,弹出的悬浮带有关闭按钮的dialog.zip项目安卓应用源码下载Android应用源码之项目启动的时候,弹出的悬浮带有关闭按钮的dialog.zip项目安卓应用源码下载 1.适合学生毕业设计研究...
Android 无闪烁启动画面程序源码.zip项目安卓应用源码下载Android 无闪烁启动画面程序源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
本项目是一套基于安卓的京东商城高仿应用最新版项目源码,实现了首页、搜索页、商品分类页、购物页、个人中心的登录注册、...二维码用的zxing,最新的源码加入了二维码、登录效验、和启动页想研究一下的朋友可以下载。
本项目是一套基于安卓的京东商城高仿应用最新版项目源码,实现了首页、搜索页、商品分类页、购物页、个人中心的登录注册、...二维码用的zxing,最新的源码加入了二维码、登录效验、和启动页想研究一下的朋友可以下载。
本项目是一套基于安卓的京东商城高仿应用最新版项目源码,实现了首页、搜索页、商品分类页、购物页、个人中心的登录注册、...二维码用的zxing,最新的源码加入了二维码、登录效验、和启动页想研究一下的朋友可以下载。
本项目是一套基于安卓的京东商城高仿应用最新版项目源码,实现了首页、搜索页、商品分类页、购物页、个人中心的登录注册、...二维码用的zxing,最新的源码加入了二维码、登录效验、和启动页想研究一下的朋友可以下载。
这个是 android Launcher2.20 源码,我最近在学习.希望对研究launcher2有点帮助
本项目是一套基于安卓的京东商城高仿应用最新版项目源码,实现了首页、搜索页、商品分类页、购物页、个人中心的登录注册、...二维码用的zxing,最新的源码加入了二维码、登录效验、和启动页想研究一下的朋友可以下载。
本项目是一个基于安卓的音乐播放器项目,本站之前发布过不下20个...有耐心研究的朋友可以自己研究一下具体的源码功能块.项目工具类注释详细,其他注释比较一般。搜了一下包名,貌似是武汉一家安卓培训机构的培训项目。
Android应用源码之监听自身应用卸载,并在卸载之后,使用libcurl三方库进行一次三方请求,或者启动网页的实例工程。.ziAndroid应用源码之监听自身应用卸载,并在卸载之后,使用libcurl三方库进行一次三方请求,或者...
本例子是不断保持后台唤醒的例子源码,这是修改之后的,安装之后就能不断的唤醒,实现后台service持续运行,并且唤醒之后进入自定义界面,4.2.2测试唤醒的时候程序可以直接绕过屏幕锁但是点一下还是会出现锁屏界面。...