每个Activity的创建,都会执行到ActivityThread类中的
Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) 此类负责创建Activity实例和一些information。并回调一些Activity 的回调函数 onXXX().
其中调用了 activity.attach(*******)。
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
Object lastNonConfigurationInstance,
HashMap<String,Object> lastNonConfigurationChildInstances,
Configuration config) {
attachBaseContext(context);
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info.softInputMode);
}
mUiThread = Thread.currentThread();
mMainThread = aThread;
mInstrumentation = instr;
mToken = token;
mIdent = ident;
mApplication = application;
mIntent = intent;
mComponent = intent.getComponent();
mActivityInfo = info;
mTitle = title;
mParent = parent;
mEmbeddedID = id;
mLastNonConfigurationInstance = lastNonConfigurationInstance;
mLastNonConfigurationChildInstances = lastNonConfigurationChildInstances;
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
mCurrentConfig = config;
}
创建Window ,创建的是PhoneWindow
private static final String POLICY_IMPL_CLASS_NAME =
"com.android.internal.policy.impl.Policy";
static {
// Pull in the actual implementation of the policy at run-time
try {
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);
} catch (InstantiationException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(
POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);
}
}
上面代码是静态模块,类被加载时就被执行。
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
public PhoneWindow makeNewWindow(Context context) {
return new PhoneWindow(context);
}
下面是创建WindowManger
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
public void setWindowManager(WindowManager wm,
IBinder appToken, String appName) {
mAppToken = appToken;
mAppName = appName;
if (wm == null) {
wm = WindowManagerImpl.getDefault();
}
mWindowManager = new LocalWindowManager(wm);
}
wm = WindowManagerImpl.getDefault();是返回一个默认的WindowManagerImpl 的静态实例,在android系统中的所有应用程序,都共用一个WindowManagerImpl实例。
Window 被创建的时候,会执行如下代码来生成Window Attrivute
private final WindowManager.LayoutParams mWindowAttributes =
new WindowManager.LayoutParams();
下面是更改此属性:
/**
* Specify custom window attributes. <strong>PLEASE NOTE:</strong> the
* layout params you give here should generally be from values previously
* retrieved with {@link #getAttributes()}; you probably do not want to
* blindly create and apply your own, since this will blow away any values
* set by the framework that you are not interested in.
*
* @param a The new window attributes, which will completely override any
* current values.
*/
public void setAttributes(WindowManager.LayoutParams a) {
mWindowAttributes.copyFrom(a);
if (mCallback != null) {
mCallback.onWindowAttributesChanged(mWindowAttributes);
}
}
要更改mWindowAttributes此属性,只能用此方法,并回调。
分享到:
相关推荐
Activity启动模式设置: <activity android:name=".MainActivity"android:launchMode="standard" /> Activity的四种启动模式: 1.standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。 ...
要在Activity启动时播放动画,我们可以在onCreate()方法中使用`overridePendingTransition()`函数。例如,我们可以创建两个XML动画资源文件,一个用于进入动画(right_in.xml),另一个用于退出动画(right_out.xml...
### Activity启动过程详解 #### 一、概述 在Android系统中,**Activity**与**Service**作为核心组件,共同构建了应用程序的基础结构。这两种组件通过应用程序框架层提供的完整机制进行协同工作,包括启动Activity...
标准模式是最常见的Activity启动模式,每个启动请求都会创建一个新的Activity实例。如果新的实例被叠加到栈顶,那么它会覆盖之前显示的Activity。这种模式适用于大部分Activity,因为它允许灵活的导航和回退操作,...
`Android Hook Activity 启动劫持`是一种高级技术,它允许开发者利用动态代理(Dynamic Proxy)技术来拦截并控制AMS的行为,从而在不修改系统源码的情况下,实现对Activity启动流程的监控或修改。 首先,我们需要...
一、Activity启动模式概述 1. **标准模式(Standard)**:这是Activity的默认启动模式,每次启动都会创建一个新的实例,无论是否已在栈中存在。因此,同一个Activity可能会有多个实例。 2. **单实例模式...
本实例"Activity启动模式demo"全面展示了Activity启动模式的各种情况,下面将详细解释这些模式及其应用场景。 1. **标准模式(Standard)** 标准模式是Activity的默认启动模式,每次启动都会创建一个新的实例。...
1. **Activity启动模式**: - **Standard**(标准模式):默认模式,每次启动新的实例,无论当前栈中是否存在该Activity。 - **SingleTop**(单顶模式):如果目标Activity已经在栈顶,则直接使用该实例,不创建新...
本资源"Android高级应用源码-Activity启动和退出动画.rar"提供了一套实现此类动画的示例代码,对于深入理解Android应用开发,尤其是动画效果的实现具有很大的学习价值。 1. **Activity的生命周期** Activity的生命...
Activity启动流程源码分析,使用eclipse代码跟踪,图片详解
Activity启动时候获取View宽高的四种方法,因为Activity的生命周期回调和view的measure过程不是同步执行的,所以无法在activity的onCreate、onStart和onResume里面准确的获取view的宽和高,可以通过以下四个方法来...
了解和掌握不同的Activity启动模式对于优化应用程序的行为至关重要。本文将详细讲解四种主要的Activity启动模式:standard、singleTop、singleTask以及singleInstance,并通过实际案例分析它们的应用场景。 1. ...
Activity启动流程是Android系统中一个非常核心的部分,它是应用程序组件之一,负责创建和管理应用的用户界面。当我们想要启动一个新的Activity时,背后有一系列复杂的交互过程,涉及多个组件和类。本文将通过代码...
这里,`Instrumentation`类对象的`execStartActivity`函数被调用,标志着Activity启动流程的开始。 2. **跨进程通信**:`execStartActivity`通过Binder机制,将请求传递到系统服务端。`ActivityManagerNative`作为...
本示例项目"Activity启动模式实例"深入探讨了四种主要的Activity启动模式:标准模式(Standard)、单实例模式(SingleInstance)、单任务模式(SingleTask)和单栈顶模式(SingleTop)。以下是对这四种启动模式的...
本示例项目“Android中Activity启动模式demo”旨在帮助开发者深入理解Activity的不同启动模式,以便更好地控制应用的行为和流程。Activity有四种基本的启动模式:标准模式(Standard)、单实例模式(SingleInstance...
这个压缩包“安卓启动退出网络判断相关-Activity启动和退出动画.zip”包含了关于Activity启动动画、退出动画的实现以及可能的网络状态判断的示例代码。 首先,我们来看“Activity启动和退出动画”。在安卓中,...
Activity启动过程
在Android应用开发中,Activity是用户界面的基本组件,它负责与用户进行交互。理解Activity的启动模式至关...在实际项目中,灵活运用Activity启动模式,可以有效地管理应用的生命周期,避免资源浪费,提升应用性能。
Android Activity 启动流程详解 Android 操作系统中,Activity 是一个非常重要的组件,它负责处理用户交互、显示界面和执行业务逻辑。Activity 的启动流程是一个复杂的过程,涉及到多个组件和对象之间的交互。在...