一.在桌面或抽屉显示应用图标
桌面或抽屉就是一个普通APP应用,用于显示所有应用图标
含有以下intent意图的Activity会显示在桌面或抽屉
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
二.点击桌面或抽屉的应用图标
Launcher.java{
...
public void onClick(View v)
...
// 新建任务栈Stack,用于存放目标应用的Activity
intent.
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent)
}
}
三.startActivity(…)过程
1.启功目标应用的任务栈Stack
2.通知源应用的主线程ActivityThread-调用Activity的onPause方法
3.调用Process_start创建新进程,加入目标应用主线程ActivityThread,执行main方法
ActivityThread.java{
public static void main(String[] args) {
...
Looper.prepareMainLooper();
ActivityThread thread =
new ActivityThread();
thread.attach(
false);
if (sMainThreadHandler ==
null) {
sMainThreadHandler = thread.getHandler();
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException(
"Main thread loop unexpectedly exited");
}
}
4.在目标应用主线程中loadClass加载Activity类
Instrumentation.java{
newActivity(...)
callActivityOnCreate(...)
callActivityOnStart(...)
callActivityOnReStart(...)
callActivityOnResume(...)
callActivityOnPause(...)
callActivityOnStop(...)
callActivityOnDestroy(...)
callActivityOnSaveInstanceState(...)
callActivityOnRestoreInstanceState(...)
...
}
5.在Activity类setContentView加载布局
Activity.java{
attach(...) {
...
mWindow =
new PhoneWindow(
this, window);
...
}
onCreate(...){
setContentView(...)
}
setContentView(...) {
getWindow().setContentView(...);
}
getWindow(){
return mWindow;
}
}
PhoneWindow.java{
public void setContentView(
int layoutResID) {
if (mContentParent ==
null) {
installDecor();
}
else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
getContext());
transitionTo(newScene);
}
else {
mLayoutInflater.inflate(layoutResID, mContentParent);
}
...
}
public void setContentView(View view) {
setContentView(view,
new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent ==
null) {
installDecor();
}
else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
view.setLayoutParams(params);
final Scene newScene =
new Scene(mContentParent, view);
transitionTo(newScene);
}
else {
mContentParent.addView(view, params);
}
...
}
private void installDecor() {
mForceDecorInstall =
false;
if (mDecor ==
null) {
mDecor = generateDecor(-
1);
mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
mDecor.setIsRootNamespace(
true);
if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures !=
0) {
mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
}
}
else {
mDecor.setWindow(
this);
}
if (mContentParent ==
null) {
mContentParent = generateLayout(mDecor);
...
}
}
protected ViewGroup
generateLayout(DecorView decor) {
...
ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);
...
return contentParent;
}
}
简书: http://www.jianshu.com/p/30f61733fdaf 博客: http://blog.csdn.net/qq_32115439/article/details/72905465 GitHub博客:http://lioil.win/2017/06/07/Android_Launcher.html Coding博客:http://c.lioil.win/2017/06/07/Android_Launcher.html