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

启动activity过程(转)

 
阅读更多

启动activity:
**android.process.acore进程
1.Acticity.startActivityForResult()
2.Instrumention.execStartActivity();
3.ActivityManagerNative.getDefault()
                .startActivity()
  3.1 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy的实例,
  它只是一个代理类,这个代理类实际上代理的是IBinder b = ServiceManager.getService("activity");
  这个Service。
  3.2 这个Service是什么时候添加进来的呢?
  在SystemServer.java的run()中有调用
  ActivityManagerService.setSystemProcess();
      ServiceManager.addService("activity", m);
      这里还会添加许多系统关键服务。
      (TODO:查看在SystemServer的Log输出)
      
**system_process进程 
4 ActivityManagerNative
    |--ActivityManagerService
    
    在ActivityManagerNative的onTransact方法中最终提供了服务:
    case START_ACTIVITY_TRANSACTION:
      ActivityManagerService.startActivity();
        --startActivityLocked(IApplicationThread caller,
            Intent intent, String resolvedType,
            Uri[] grantedUriPermissions,
            int grantedMode, ActivityInfo aInfo, IBinder resultTo,
            String resultWho, int requestCode,
            int callingPid, int callingUid, boolean onlyIfNeeded,
            boolean componentSpecified) 
          --startActivityUncheckedLocked(r, sourceRecord,
                grantedUriPermissions, grantedMode, onlyIfNeeded, true)
          在这个方法里面检查权限,解析intent中的Flag。。。
          --startActivityLocked(HistoryRecord r, boolean newTask)
            --resumeTopActivityLocked(HistoryRecord prev)
              --startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig) 
                --startProcessLocked(String processName,ApplicationInfo info, boolean knownToBeDead, int intentFlags,String hostingType, ComponentName hostingName)
                  --startProcessLocked(ProcessRecord app,String hostingType, String hostingNameStr)
                    在这里启动一个进程用来host这个应用
                    int pid = Process.start("android.app.ActivityThread",
                    mSimpleProcessManagement ? app.processName : null, uid, uid,
                    gids, debugFlags, null);
                    
ActivityManagerService.java
--startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig)
  --realStartActivityLocked(HistoryRecord r,ProcessRecord app, boolean andResume, boolean checkConfig)
    --app.thread.scheduleLaunchActivity                                   //scheduleLaunchActivity()@IApplicationThread.java
      --scheduleLaunchActivity()@ActivityThread.java                      //这里实际是ApplicationThreadNative提供的服务
        --handleMessage()@H$ActivityThread.java
          --handleLaunchActivity()@ActivityThread.java
            --Activity performLaunchActivity(ActivityRecord r, Intent customIntent)@ActivityThread.java  //这时真正的Activity对象被构造出来
              --mInstrumentation.newActivity()                            //通过反射构造出Activity对象
              --activity.attach()                                         //初始化Activity,生成一个window对象,设置各种状态等等
              --mInstrumentation.callActivityOnCreate(activity, r.state);  //调用Activity的onCreate()方法
            
              到这里,我们自己写的activity的onCreate()方法已经被系统调用了,接下来依次回调生命周期方法:
              --activity.performStart();
                --mInstrumentation.callActivityOnStart(this);
              --mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
              --mInstrumentation.callActivityOnPostCreate(activity, r.state);
              --mActivities.put(r.token, r);                               //将这个activity入栈
              
            然后就要调用onResume()方法了:
            --handleResumeActivity(IBinder token, boolean clearHide, boolean isForward)
              --performResumeActivity(token, clearHide);
                --r.activity.performResume();
                  --performRestart()@Activity.java;
                    --mInstrumentation.callActivityOnRestart(this);
                    --mInstrumentation.callActivityOnStart(this);
                --mInstrumentation.callActivityOnResume(this);
                onResume()已经调用完毕,一个activity的逻辑处理结束了,但是这时候屏幕上还不会显示任何东西,因为View还没有添加进去
                
                
              --r.window.getDecorView();                                   //开始把DecorView添加进Window
              --wm.addView(decor, l);
            
            至此一个Activity启动结束。

分享到:
评论

相关推荐

    从application启动activity

    在处理启动Activity的过程中,还需注意以下几点: 1. **权限管理**:如果启动的Activity需要特定权限,记得在AndroidManifest.xml中声明这些权限。 2. **任务栈管理**:通过Intent的FLAG_ACTIVITY_NEW_TASK标志...

    浅谈android性能优化之启动过程(冷启动和热启动)

    无论是通过 Launcher 来启动 Activity,还是通过 Activity 内部调用 startActivity 接口来启动新的 Activity,都通过 Binder 进程间通信进入到 ActivityManagerService 进程中,并且调用 ActivityManagerService....

    Activity启动过程

    Activity启动过程

    从网页启动Activity

    【标题】"从网页启动Activity"这一主题主要探讨的是如何在Android应用开发中,通过网页链接触发Android设备上的Activity启动,实现Web与App之间的交互。这通常涉及到WebView组件的使用,以及利用Intent过滤器来捕获...

    分析Android Activity的启动过程

    startActivity方法是用于启动Activity组件的关键方法,他可以将Intent对象传递给ActivityManagerService,请求启动MainActivity组件。startActivity方法还可以设置Activity的启动标志位,例如“Intent.FLAG_ACTIVITY...

    启动Activity

    当我们谈论“启动Activity”时,这是Android应用中一个至关重要的过程。本文将深入探讨如何使用`startActivityForResult` API来启动一个Activity,并理解其背后的机制。 首先,让我们了解Activity的基本概念。...

    Android利用Intent启动和关闭Activity

    ### 一、Intent启动Activity #### 1. 显式启动 显式启动是通过Intent明确指定要启动的Activity的类名。创建Intent时,你需要在构造函数中传入当前Activity(`this`)和目标Activity的Class对象,如下所示: ```...

    带返回值的Activity启动

    `startActivityForResult`方法是Android SDK提供的一种特殊启动Activity的方式,主要用于实现从一个Activity(我们称之为"启动者"或"父Activity")启动另一个Activity("被启动者"或"子Activity"),并在子Activity...

    Activity 启动过程源码+分析过程

    - **系统服务层**:AMS接收到消息后,执行`ActivityManagerService.startActivity()`,开始创建和启动Activity。 3. **AMS中的启动步骤** - **验证权限**:检查发起启动请求的应用是否有启动目标Activity的权限。...

    仿IOS activity界面翻转3D动画

    6. 添加动画的监听器,确保在动画结束后启动新的Activity(Activity B)。 在Activity B中,我们需要反转动画过程,即从180度翻转回0度。可以通过复制Activity A的动画逻辑并在适当的地方调整参数来实现这一点。 ...

    android两个Activity的转换

    7. **Intent Flag**:启动Activity时可以设置Intent的Flag,例如FLAG_ACTIVITY_NEW_TASK表示启动一个新的任务,FLAG_ACTIVITY_CLEAR_TOP则会清除目标Activity之上所有未完成的Activity。 8. **Transition动画**:...

    Hook技术activity启动过程中拦截

    然而,通过Hook技术,我们可以在运行时动态地创建和启动Activity,绕过传统的注册流程。这在插件化开发中尤其有用,因为插件可能在主应用安装时不存在,或者为了实现动态加载和更新。 3. **Hook Activity的启动过程...

    动画启动Activity

    "动画启动Activity"是一个关于如何为应用程序的Activity添加各种进入动画效果的专题,非常适合初级到中级水平的开发者进行学习和实践。这个专题主要涉及到Android中的视图动画(View Animation)和属性动画...

    activity切换翻转效果

    为了添加翻转效果,我们可以在Intent的启动过程中添加自定义的过渡动画。 Android提供了多种内置的Activity转场动画,如淡入淡出、推动等,但翻转效果需要我们自定义。我们可以创建一个XML动画资源文件,定义一个从...

    activity四大启动方式demo

    在“activity四大启动方式demo”中,开发者可能会通过Logcat打印出每个Activity的启动过程,包括调用的方法如onCreate()、onStart()、onResume()等,以及相关的taskID。taskID是Android系统分配给每个Task的唯一标识...

    Intent启动Activity样例

    总的来说,这个项目提供了一个实践平台,让我们能够了解并练习如何使用Intent启动Activity,以及如何在Android项目中配置和管理构建过程。通过研究这些文件,开发者可以加深对Android应用生命周期、组件通信以及构建...

    Android应用程序的Activity启动过程简要介绍和学习计划

    Android应用程序的Activity启动过程简要介绍和学习计划

    安卓开发实现开机启动跳转到指定activity

    在应用的启动Activity中添加以下代码: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (getSelfPermission(Manifest.permission.RECEIVE_BOOT_COMPLETED) != PackageManager.PERMISSION_...

Global site tag (gtag.js) - Google Analytics