Android系统启动-->应用启动-->界面的展示(二)

在一个Lancher里面我们点击一个快捷键图表,Android系统做了什么?

我们先看Lancher.java中的源码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public final class Launcher extends Activity{

    //onCick事件

    public void onClick(View v) {

        Object tag = v.getTag();

        if (tag instanceof ApplicationInfo) {

          // 打开快捷键

          final Intent intent = ((ApplicationInfo) tag).intent;

          int[] pos = new int[2];

          v.getLocationOnScreen(pos);

          intent.setSourceBounds(new Rect(pos[0], pos[1], pos[0] + v.getWidth(), pos[1] + v.getHeight()));

          //重点就是这个方法

          this.startActivitySafely(intent);

        else if (tag instanceof FolderInfo) {

          this.handleFolderClick((FolderInfo) tag);

        }

   }

   //这个方法做了2件事

   void startActivitySafely(Intent intent) {

        //区别于默认优先启动在activity栈中已经存在的activity

        //如果之前启动过,并还没有被destroy的话

        //而是无论是否存在,都重新启动新的activity

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        this.startActivity(intent);

   }

}

通过上述代码 我们知道 有Lancher最后一步是startActivity( ),那我们继续看Activity的源码:


1

2

3

4

5

6

7

8

9

public void startActivity(Intent intent, Bundle options) {

    //-1标示不需要这个Activity结束后返回结果

    startActivityForResult(intent, -1);

}

public void startActivityForResult(Intent intent, int requestCode, Bundle options) {

        //Instrumentation监视应用程序和系统的交互

        Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(.....

}

我们走到这一步,返现一个我们不熟悉的类Instrumentation.java


1

2

3

4

5

6

7

8

public class Instrumentation {

    //内部类,从类名我们知道是Activity的监视类

    public static class ActivityMonitor {

    

    }

    //还有一些call方法,如下截图

}

我们继续看这个类,既然它是Activity的监听类,.我们看看


1

2

3

4

5

6

7

public Activity newActivity(...){

    //通过反射构造出Activity对象

    Activity activity = (Activity)clazz.newInstance();

    //按照我们的习惯,应该下一步是调用Activity.onCreate(),但是趋势attach()

    activity.attach(context, aThread,....);//初始化Activity,生成一个window对象,设置各种状态等等

    return activity;

}

ok,接下来从Instrumentation继续startActivity----------->创建任务栈AndroidStack,

一旦目标的任务栈就位,做了如下动作:

1,AndroidStack发消息给Lanucher的ActivityThread告诉Lanucher进入onPause阶段

详细步骤:

AndroidStack发送消息给ActivityThread<Launcher应用的主线程>

线程去OnPauser掉Lancher

2,AndroidStack发消息给目标应用的ActivityThread, 目标应用该启动起来了

流程图如下:

Android 手机上的应用一般情况下都在一个进程中运行,那一个进程的标示就是ActivityThread.

下面我们看一下 ActivityThread.java中的main()源码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static final void main(String[] args) {

    SamplingProfilerIntegration.start();

   ……

    Looper.prepareMainLooper();

    if (sMainThreadHandler == null) {

        sMainThreadHandler = new Handler();

    }

    ActivityThread thread = new ActivityThread();

    thread.attach(false);

   ……

    Looper.loop();//主线程while(true)? 分发消息

   ……

    thread.detach();

    ……

    Slog.i(TAG, "Main thread of " + name + " is now exiting");

}

我们接着看一下Looper.loop( );  里面是个死循环,即在主线程有个永真循环


1

2

3

4

5

6

7

public static final void loop() {

    Looper me = myLooper();

    MessageQueue queue = me.mQueue;

    while (true) {

        .....

    }

}

这也解释了为啥在主线程里面不能做耗时操作,即主线程不能被占用,因为主线程里面有个消息循环在转

时间: 2024-11-05 18:30:46

Android系统启动-->应用启动-->界面的展示(二)的相关文章

Android系统启动--&gt;应用启动--&gt;界面的展示(一)

参考资料: 1,老罗的Android之旅http://blog.csdn.net/luoshengyang/article/details/6689748 2,Android核心分析http://www.linuxidc.com/Linux/2011-04/33966.htm Android系统的启动: 我们想来一张系统架构图: 一,上面用Git下载编译过程略掉,直接看最后我们Build 的产物. Build 的产物中最重要的是三个镜像文件,位于 /out/target/product/<pro

Android系统启动--&gt;应用启动--&gt;界面的展示(三)

界面的展示部分:------->界面的加载(Activity.Window.View之间的关系) 我们知道在Instrumentation.java中有个newActivity(),通过反射创建了MainActivity对象,此时MainActivity对象并没有去调用其生命周期 的方法onCrteate( ),而是activity.attach(.....), ok ,但这里我们先去看看我们熟悉的代码; Activity中的生命周期方法onCreate(...)中调用了setContentVi

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么

Android仿iOS启动界面

第一部 -------------------------------------------------------------------------------- [问题] 由于Activity只能到onResume时,才能展示到前台,所以,如果为MainActivity设置背景的话,无论onCreate-onResume速度多快,都会出现短暂的带title的空页,这是我们不想要的. [方法] 只需在AndroidManifest.xml为你的<application>加上theme属性

Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter仅仅在这个包里有,在android.app.*这个包以

App启动界面效果设计

转载请标明出处:http://blog.csdn.net/u012637501/article/details/45746617 每个Android应用启动之后都会出现一个Splash启动界面,大多数的Splash界面都是会等待一定时间,然后切换到下一个界面.但如果app启动时间过长,可使用启动界面让用户耐心等待这段枯燥的时间.Splash界面一般用于显示产品的LOGO.产品名称.版本信息等,也可以完成对系统状况的检测,如网络是否连通.电源是否充足.检测新版本等,也可以预先加载相关数据.启动界面

Android教材 | 第三章 Android界面事件处理(二)—— 杰瑞教育原创教材试读

 编者按 JRedu 杰瑞教育原创系列教材将于年后与大家正式见面.为更好的借鉴读者意见,我们将会陆续地在博客园推出一系列教材试读.我们也热忱的欢迎广大博友与我们互动,提出宝贵意见. 本篇博客将推出教材第三章第二部分的试读(传送门:第一部分),请大家继续提出宝贵意见,我们也将为积极互动的博友,免费提供我们的原创教材以及更多福利,也欢迎大家加入最下方QQ群与我们交流,谢谢大家! 3.5 系统设置事件处理 3.5.1onConfigurationChanged响应事件 在App开发过程中,有时候需要获

Android基础之——startActivityForResult启动界面并返回数据,上传头像

在android应用的开发过程中,经常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在很多应用程序的模块中,都有"我的"这个模块,在未登录状态下点击其中的某一项,就会弹出登录界面,登录完成后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult. 下面通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用. demo的效果图如下: 主界面布局:

Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面

其实这是很简单的一个问题.但是这还是要对android中activity的启动模式有相当的理解才行,当点击home键的时候,懂Android的人都知道,他会把当前activity放到后退栈中, 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算.人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底.向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称为出栈或退栈,它是把栈