`
venus585625
  • 浏览: 254787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity启动

阅读更多
每个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此属性,只能用此方法,并回调。
分享到:
评论

相关推荐

    android中的Activity启动方式

    Activity启动模式设置: &lt;activity android:name=".MainActivity"android:launchMode="standard" /&gt; Activity的四种启动模式: 1.standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。 ...

    Activity启动和退出动画

    要在Activity启动时播放动画,我们可以在onCreate()方法中使用`overridePendingTransition()`函数。例如,我们可以创建两个XML动画资源文件,一个用于进入动画(right_in.xml),另一个用于退出动画(right_out.xml...

    Activity启动过程简要介绍

    ### Activity启动过程详解 #### 一、概述 在Android系统中,**Activity**与**Service**作为核心组件,共同构建了应用程序的基础结构。这两种组件通过应用程序框架层提供的完整机制进行协同工作,包括启动Activity...

    activity启动模式测试

    标准模式是最常见的Activity启动模式,每个启动请求都会创建一个新的Activity实例。如果新的实例被叠加到栈顶,那么它会覆盖之前显示的Activity。这种模式适用于大部分Activity,因为它允许灵活的导航和回退操作,...

    Android Hook Activity 启动劫持

    `Android Hook Activity 启动劫持`是一种高级技术,它允许开发者利用动态代理(Dynamic Proxy)技术来拦截并控制AMS的行为,从而在不修改系统源码的情况下,实现对Activity启动流程的监控或修改。 首先,我们需要...

    Activity启动模式实验代码

    一、Activity启动模式概述 1. **标准模式(Standard)**:这是Activity的默认启动模式,每次启动都会创建一个新的实例,无论是否已在栈中存在。因此,同一个Activity可能会有多个实例。 2. **单实例模式...

    Activity启动模式demo

    本实例"Activity启动模式demo"全面展示了Activity启动模式的各种情况,下面将详细解释这些模式及其应用场景。 1. **标准模式(Standard)** 标准模式是Activity的默认启动模式,每次启动都会创建一个新的实例。...

    Activity启动模式及Intent的Flag属性对Intent传值的影响

    1. **Activity启动模式**: - **Standard**(标准模式):默认模式,每次启动新的实例,无论当前栈中是否存在该Activity。 - **SingleTop**(单顶模式):如果目标Activity已经在栈顶,则直接使用该实例,不创建新...

    Android高级应用源码-Activity启动和退出动画.rar

    本资源"Android高级应用源码-Activity启动和退出动画.rar"提供了一套实现此类动画的示例代码,对于深入理解Android应用开发,尤其是动画效果的实现具有很大的学习价值。 1. **Activity的生命周期** Activity的生命...

    Activity启动流程源码分析

    Activity启动流程源码分析,使用eclipse代码跟踪,图片详解

    Activity启动时候获取View宽高的四种方法

    Activity启动时候获取View宽高的四种方法,因为Activity的生命周期回调和view的measure过程不是同步执行的,所以无法在activity的onCreate、onStart和onResume里面准确的获取view的宽和高,可以通过以下四个方法来...

    android activity启动模式详解

    了解和掌握不同的Activity启动模式对于优化应用程序的行为至关重要。本文将详细讲解四种主要的Activity启动模式:standard、singleTop、singleTask以及singleInstance,并通过实际案例分析它们的应用场景。 1. ...

    Activity启动流程图

    Activity启动流程是Android系统中一个非常核心的部分,它是应用程序组件之一,负责创建和管理应用的用户界面。当我们想要启动一个新的Activity时,背后有一系列复杂的交互过程,涉及多个组件和类。本文将通过代码...

    Activity启动流程

    这里,`Instrumentation`类对象的`execStartActivity`函数被调用,标志着Activity启动流程的开始。 2. **跨进程通信**:`execStartActivity`通过Binder机制,将请求传递到系统服务端。`ActivityManagerNative`作为...

    Activity启动模式实例

    本示例项目"Activity启动模式实例"深入探讨了四种主要的Activity启动模式:标准模式(Standard)、单实例模式(SingleInstance)、单任务模式(SingleTask)和单栈顶模式(SingleTop)。以下是对这四种启动模式的...

    Android中Activity启动模式demo

    本示例项目“Android中Activity启动模式demo”旨在帮助开发者深入理解Activity的不同启动模式,以便更好地控制应用的行为和流程。Activity有四种基本的启动模式:标准模式(Standard)、单实例模式(SingleInstance...

    安卓启动退出网络判断相关-Activity启动和退出动画.zip

    这个压缩包“安卓启动退出网络判断相关-Activity启动和退出动画.zip”包含了关于Activity启动动画、退出动画的实现以及可能的网络状态判断的示例代码。 首先,我们来看“Activity启动和退出动画”。在安卓中,...

    Activity启动过程

    Activity启动过程

    Android之Activity启动模式Demo

    在Android应用开发中,Activity是用户界面的基本组件,它负责与用户进行交互。理解Activity的启动模式至关...在实际项目中,灵活运用Activity启动模式,可以有效地管理应用的生命周期,避免资源浪费,提升应用性能。

    Activity启动流程进程启动

    Android Activity 启动流程详解 Android 操作系统中,Activity 是一个非常重要的组件,它负责处理用户交互、显示界面和执行业务逻辑。Activity 的启动流程是一个复杂的过程,涉及到多个组件和对象之间的交互。在...

Global site tag (gtag.js) - Google Analytics