`
smiky
  • 浏览: 257776 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

android activy加载

 
阅读更多

Looper这个东东很重要,线程之间的通信全靠它,Activity能运行起来也是因为它

 

下面是启动时的方法调用:

 

Instrumentation.callActivityOnCreate(Activity, Bundle) line: 1079	
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2023	
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2084	
ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 130	
ActivityThread$H.handleMessage(Message) line: 1195	
ActivityThread$H(Handler).dispatchMessage(Message) line: 99	
Looper.loop() line: 137	
ActivityThread.main(String[]) line: 4745	

 

 

ThradActivity:

 

 public static void main(String[] args) {
        SamplingProfilerIntegration.start();

        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Process.setArgV0("<pre-initialized>");

        Looper.prepareMainLooper();
        if (sMainThreadHandler == null) {
            sMainThreadHandler = new Handler();
        }
	//这里的线程应该就是所谓的UI线程,每个线程有自己的Looper, 用Handler的sendMessage可以向Looper的
//消息队列加消息,Handler在初始化里会找到当前的线程并加与之对应的Looper的消息队列取到,
//这样其它线程就可以给它发送消息,而Looper里面的loop方法会不停的执行处理消息,这样来处理线程之间的通信
        ActivityThread thread = new ActivityThread();
        thread.attach(false);//这里完成部分初始化

        AsyncTask.init();

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        Looper.loop();//这是个死循环,它里面有个消息队列,它不停的遍历并处理消息,它会触发主Activity的加载

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }
 

 

 

public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    handleLaunchActivity(r, null);//处理启动Activity
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;

 

 performLaunchActivity会完成Activity的加载

 

 Activity activity = null;
        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
//加载Activity
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            StrictMode.incrementExpectedActivityCount(activity.getClass());
            r.intent.setExtrasClassLoader(cl);
            if (r.state != null) {
                r.state.setClassLoader(cl);
            }
        } 


attach方法会完成Activity主窗口的创建
activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config);
activity.mCalled = false;
                mInstrumentation.callActivityOnCreate(activity, r.state);会触发Activity的onCreate事件
 

 

Activity:

 

 mWindow = PolicyManager.makeNewWindow(this);
 

 

View之类的组件是在setContentView时才开始绘的

下面以PhoneWindow为例:

 

  public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
            installDecor();//这里才是用于显示的窗,decor它是一个FrameLayout,可以看下里面的chrild
        } else {
            mContentParent.removeAllViews();
        }
        mContentParent.addView(view, params);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    android 各种加载动画效果

    在Android开发中,加载动画效果是提升用户体验的重要一环,特别是在数据加载、网络请求或界面切换时,良好的加载动画能够使用户在等待过程中感受到趣味性和专业性。本资源包"android 各种加载动画效果"提供了多种...

    Android-使用Glide在Android中加载SVG

    在Android开发中,图片加载和展示是至关重要的一个环节,特别是在设计用户界面时。SVG(Scalable Vector Graphics)是一种矢量图格式,它能够提供高质量、无损缩放的图像,非常适合用在多种分辨率的Android设备上。...

    Android内容预加载View占位

    在Android开发中,"内容预加载View占位"是一种优化用户体验的重要技术,它涉及到如何高效地展示数据并减少用户等待时间。本知识点主要探讨的是如何在数据加载完成之前,通过占位符显示预计内容区域,以提升应用的...

    Android-AndroidWebView加载PDF文件实现

    Android WebView 加载 PDF 文件实现。其原理就是在 app 本地搭建一个 website ,然后利用 WebView 加载这个站点,站点去实现加载显示 PDF 的目的,站点其原理也是采用 js 框架去实现的。

    Android异步加载图片例子

    在Android开发中,异步加载图片是一项至关重要的技术,尤其对于那些包含大量图像的移动应用而言,如社交网络、电商应用等。异步加载能够提高用户体验,避免UI线程阻塞,防止应用出现"卡死"现象。在这个"Android异步...

    Android WebView加载网页以及本地图片缓存问题

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。WebView不仅能够加载远程HTTP/HTTPS网址,还能处理本地HTML、CSS和JavaScript资源,极大地增强了应用...

    Android高德加载谷歌卫星瓦片,并缓存本地

    本示例探讨的是如何在Android应用中利用高德地图API加载谷歌的卫星瓦片,并将其缓存到本地,同时展示如何在地图上加载多个Marker并显示其title。这个项目基于Android Studio 3.0,以下将详细介绍实现这些功能的关键...

    Android NDK开发动态加载so

    3. **平台兼容性**:不同的Android设备可能需要不同的.so库版本,动态加载允许根据设备特性加载合适的库。 4. **权限管理**:某些.so文件可能包含敏感代码,动态加载可以提高安全性和隐私保护。 使用`System.load`...

    Android studio加载本地html的文档问题

    ### Android Studio加载本地HTML文件详解 #### 一、引言 在进行Android应用开发时,有时需要在应用内部展示HTML内容。例如,显示帮助文档、用户手册或是简单的网页信息等。传统的Eclipse环境下,通常的做法是将...

    android webView加载html 并引用本地资源(图片、字体库)

    注意,加载本地资源时,路径一定要正确,对于`assets`目录下的资源,需要以`file:///android_asset/`开头。对于`res`目录下的资源,可以使用`android.resource://[package_name]/[resource_type]/[resource_id]`格式...

    Android Webview 加载 H5Video

    搜索很多资料后发现很多问题,都是关键代码片段,因为每个项目每个人产生的问题不同,Video在webview中加载不出来原因很多,可能是客户端少了参数,也可能是前端出了问题,经过研究后对Android WebView 加载H5Video...

    android三种自定义Loading加载框

    在Android开发中,为了提升用户体验,开发者经常需要创建各种自定义的Loading加载框来提示用户应用正在处理数据或执行操作。本教程将详细介绍三种不同的自定义加载框实现方法,帮助你的应用程序在等待过程中呈现更...

    android使用jpct加载三维模型

    在Android上使用JPCT加载三维模型,通常涉及到以下几个关键知识点: 1. **Android OpenGL ES**: JPCT基于OpenGL ES,这是Android系统支持的用于绘制2D和3D图形的API。OpenGL ES是桌面版OpenGL的一个子集,专为移动...

    Android loading...加载动画

    在Android开发中,用户体验是至关重要的,而加载动画(loading animation)则是提升用户体验的一个关键元素。当应用程序需要处理一些后台任务,如数据加载、网络请求等,加载动画可以提供反馈,让用户知道应用正在...

    android网络加载显示进度条

    在Android开发中,当应用程序需要从网络下载数据时,为了提供良好的用户体验,通常会使用进度条(ProgressDialog)来展示加载状态。"android网络加载显示进度条"这一主题主要涉及两个关键概念:ProgressDialog和多...

    Android各种加载效果Eclipse版

    在Android应用开发中,加载效果是提升用户体验的重要一环,特别是在数据加载、网络请求或页面切换时。Eclipse作为早期广泛使用的Android集成开发环境,提供了丰富的工具和资源来实现这些加载效果。本资源包"Android...

    ArcGIS Android API加载GoogleMap及自动离线

    使用ArcGIS for Android开发的加载GoogleMap地图。并判断无网络时自动加载本地图片。图片存放在/ArcGIS/samples/tiledcache/下。在有网络时自动存储地图图片。未做容量控制及清空策略。并集成了从ArcGIS Server缓存...

    Android实现WebView懒加载

    "Android实现WebView懒加载"这一技术就是为了优化这个问题,通过延迟加载部分资源,提升应用的启动速度和响应性。 首先,我们要理解什么是懒加载(Lazy Loading)。懒加载是一种优化策略,它推迟非关键资源的加载,...

    Android动态加载技术的研究.pdf

    "Android动态加载技术的研究" Android动态加载技术是指在Android系统中,通过加载Class文件实现应用程序的更新和升级,而无需重新安装APK文件。这种技术可以提高用户体验,减少用户更新应用程序的麻烦。 Android...

    android加载刷新框架

    在Android开发中,加载刷新框架是提升用户体验的关键组件,它使得用户可以轻松地查看和加载更多的数据,尤其是在处理网络请求和大数据集时。本篇将深入探讨“android加载刷新框架”,以及如何使用开源库实现这一功能...

Global site tag (gtag.js) - Google Analytics