Android的Launcher启动流程 “Launcher部分启动流程”
研究代码从:AndroidManifest.xml、自定义的Application.java开始。
Android系统启动时,系统需要一个Home应用程序来负责将这些应用程序展示出来;也就是该应用的目的在于:Android系统启动后,第一个启动的应用程序。在Android系统中,这个默认的Home应用程序就是Launcher。
要把某个应用程序作为Home,只需要在Android.xml文件中添加一个category:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.HOME" />
<category android:name="com.aliyun.ushell.action.detailpage" />
</intent-filter>
对于AndroidManifest.xml文件中的几个属性说明:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aliyun.ushell" coreApp="true" android:sharedUserId="android.uid.system"
android:versionCode="2"
android:versionName="1.2.3"
>
其中android:sharedUserId决定是否需要系统签名;android:theme决定整个应用的theme和style;andrid:debuggable决定应用是否处于调试模式。
疑问:
1. Launcher是如何被启动的?Android系统为什么在启动时会默认启动Launcher?
2. Launcher主要做什么工作?
Android系统开机会启动Launcher,Launcher是由ActivityManager启动的,而ActivityManager是由SystemServer启动。

此处就用到了在AndroidManifest.xml文件中添加的intent-filter属性值:category_home。一般绑定使用上述的三个category,也就是关键词:main/default/home。
Launcher的主要工作是:监听应用的安装、更新、删除等导致Launcher数据库变化的操作。Launcher数据都是使用ContentProvider来提供数据,也就是需要自定义ContentResolver监听指定Uri数据的变化。
private final ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange, Uri uri) {
final int nightSwitch = Global.getInt(UShellApplication.this.getContentResolver(), SWITCH_KEY, -1);
final int nightOn = Global.getInt(UShellApplication.this.getContentResolver(), ON_KEY, -1);
final boolean wallpaperOn = (Global.getInt(UShellApplication.this.getContentResolver(), WALLPAPER_KEY, DEFAULT_WALLPAPER) == 1);
mWallpaperOn = wallpaperOn;
if (readTime() || nightSwitch != mNightSwitch || nightOn != mNightOn) {
mNightSwitch = nightSwitch;
mNightOn = nightOn;
if (!Utilities.IS_ZHONGHONG) {
onTimeChanged();
} else {
onZHChanged(null);
}
}
}
};
Launcher启动的过程主要就是加载界面数据然后显示出来,界面数据都是系统App有关的数据(可能包含Launcher数据库)。
Android的Launcher启动流程 “Launcher部分启动流程”的更多相关文章
- Android解析ActivityManagerService(一)AMS启动流程和AMS家族
前言 此前在Android系统启动流程.应用进程以及深入四大组件这三个系列文章中,都提及到了AMS,但都没有系统的来讲解它,本文就以AMS为主来进行讲解,其中会有一些知识点与这些系列文章有所重合,这里 ...
- Android更改桌面应用程序launcher的两种方式
http://blog.csdn.net/mdx20072419/article/details/9632779/ launcher,也就是android的桌面应用程序.下图是我正在使用的魅族手机的l ...
- 【Android】Android 4.0 Launcher2源码分析——启动过程分析
Android的应用程序的入口定义在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="http://schemas. ...
- 【转】Android 4.0 Launcher2源码分析——启动过程分析
Android的应用程序的入口定义在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="http://schemas. ...
- 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
- 《转》深入理解Activity启动流程(三)–Activity启动的详细流程1
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
- 《转》深入理解Activity启动流程(一)–Activity启动的概要流程
本文原创作者:Cloud Chou. 原文地址:http://www.cloudchou.com/android/post-788.html Android中启动某个Activity,将先启动Acti ...
- 深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--A ...
- 深入理解Activity启动流程(一)–Activity启动的概要流程
概述 Android中启动某个Activity,将先启动Activity所在的应用.应用启动时会启动一个以应用包名为进程名的进程,该进程有一个主线程,叫ActivityThread,也叫做UI线程. ...
随机推荐
- CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑
1.服务器端目录结构: 1.__init__.py from django.conf import settings from repository import models import impo ...
- BOM:浏览器对象模型之浏览器剖析入门
BOM简介 BOM与DOM的关系 BOM对象包含的内容 重新认识浏览器 一.分裂的BOM和被收服的DOM BOM定义:是browser object model的缩写,简称浏览器对象模型. 主要处理浏 ...
- [物理学与PDEs]第3章第2节 磁流体力学方程组 2.2 考虑到电磁场的存在对流体力学方程组的修正
1. 连续性方程 $$\bex \cfrac{\p \rho}{\p t}+\Div(\rho{\bf u})=0. \eex$$ 2. 动量守恒方程 $$\bex \cfrac{\p }{\p ...
- [物理学与PDEs]第2章第4节 激波 4.2 熵条件
1. R.H. 条件仅仅给出了越过激波时的能量守恒定律, 即热力学第一定律; 但客观的流体运动过程还需满足热力学第二定律, 即越过激波是个熵增过程: $$\bex S_1>S_0\quad(0 ...
- [C++]数据结构-排序:插入排序之直接插入排序
得赶紧休息了,木有时间写原理了.直接上代码. /* <插入排序-直接插入排序> */ #include<iostream> using namespace std; void ...
- ve2.0 v-for循环报错的解决方案
<li v-for="(item,index) in mokeData" class="page" :key="index"> ...
- Notepad++崩溃后文件内容找不到问题
也许是因为Ctrl + s 摁太多太频繁,一不小心Notepad++崩溃了 重启后发现原来的文件还在,但是文件内容全部都被清空了 我没有手动备份这个文件, 如何找回??? 点击设置,首选项,里面有个备 ...
- 如何让vue项目兼容IE浏览器
一般来说项目开发到后期都需要做各种兼容性处理例如:360.IE9以上.QQ浏览器....等等 那么现在来介绍一个工具 babel-cli 跟 babel-preset-es2015 babel-cli ...
- mysl 常用函数 union all if ifnull exists case when
1.union all UNION 操作符用于合并两个或多个 SELECT 语句的结果集.请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 S ...
- 【原创】大叔问题定位分享(15)spark写parquet数据报错ParquetEncodingException: empty fields are illegal, the field should be ommited completely instead
spark 2.1.1 spark里执行sql报错 insert overwrite table test_parquet_table select * from dummy 报错如下: org.ap ...