文档章节

Intent源码原理初探

o
 osc_tybx1rlt
发布于 07/01 10:41
字数 443
阅读 26
收藏 0

精选30+云产品,助力企业轻松上云!>>>

Cloneable       clone      new Intent(this)

setAction  COMPONENT_NAME addCategory            addFlags

getIntent   parseUri setData    category identified launchFlags 


package component schemas extra 

getAction getData getScheme getType        getCategories

getExtra


Activity
 public boolean dispatchTouchEvent(MotionEvent ev) {
2739        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
2740            onUserInteraction();
2741        }
2742        if (getWindow().superDispatchTouchEvent(ev)) {
2743            return true;
2744        }
2745        return onTouchEvent(ev);
2746    }
2747










        PhoneWindow
            superDispatchTouchEvent
            
              @Override
1718    public boolean superDispatchTouchEvent(MotionEvent event) {
1719        return mDecor.superDispatchTouchEvent(event);
1720    }






        mDecor = DecorView
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
        
              public boolean superDispatchTouchEvent(MotionEvent event) {
2369            return super.dispatchTouchEvent(event);
2370        }
        superDispatchTouchEvent
        dispatchTouchEvent
        








    ViewGroup
     dispatchTouchEvent

     Activity
     startActivity
        startActivityForResult 
        
        Instrumentation
          executeStartActivity     




          ActivityManagerNative.startActivity
     
     
     startActivityForResult
     
     上面这个方法就是Intent获取到ActivityInfo的核心,它的大致过程如下:




首先获取Intent的Component对象,如果不为空,说明指定了Component,
那么就直接通过Component找到ActivityInfo列表,并且这个列表size为1,
所以这个ActivityInfo就是指定需要跳转的组件。


如果没有指定Component,那就是隐式Intent调用,
接着获取Intent传递的需要跳转的包名。

如果包名为空,则会通过ActivityIntentResolver等进行模糊匹配,
比如根据Action、Category等。

如果包名不为空,则直接根据包名来获取到对应的ActivityInfo对象,
而mActivities就是PMS存储的activity信息表。


 // 获取Intent的Component对象
   ComponentName comp = intent.getComponent();
   if (comp == null) {
       if (intent.getSelector() != null) {
           intent = intent.getSelector();
           comp = intent.getComponent();
       }
   }
    // 不为空,是显式Intent,直接获取到ActivityInfo返回
   if (comp != null) {
       final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
       final ActivityInfo ai = getActivityInfo(comp, flags, userId);
       if (ai != null) {
           final ResolveInfo ri = new ResolveInfo();
           ri.activityInfo = ai;
           list.add(ri);
       }
       return list;
   }
    
   // 为空,是隐式Intent
   synchronized (mPackages) {
       final String pkgName = intent.getPackage();
       if (pkgName == null) {
           // 代码省略
           return result;
       }
       // 通过包名获取到Package对象
       final PackageParser.Package pkg = mPackages.get(pkgName);
       if (pkg != null) {
            // 在获取到ActivityInfo对象
           return filterIfNotSystemUser(
                   mActivities.queryIntentForPackage(
                           intent, resolvedType, flags, pkg.activities, userId),
                   userId);
       }
       return new ArrayList<ResolveInfo>();
   }
}   






































PackageManagerService 
queryIntentActivities 
 componentName 
 
    mPackages.get pkgName
 
 
 
 







PackageManager 

ContextWraper 

     @Override
    public PackageManager getPackageManager() {
        return mBase.getPackageManager();
    }


    ActivityThread 
    
        getPackageManager
    
    ServiceManager.getService
    
    SystemServer       SystemServer  run 
      mSystemServiceManager = new SystemServiceManager(mSystemContext);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        
        PackageManagerService  main函数创建出来,并通过ServiceManager
        
        addService











 
 
 

o
粉丝 0
博文 50
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Intent源码原理初探

Cloneable clone new Intent(this) setAction COMPONENT_NAME addCategory addFlags getIntent parseUri setData category identified launchFlags package component schemas extra getActi......

卖火柴的小男孩2020
06/30
0
0
Kafka很难吗?10小时搞定!

现在,这儿有份 Kafka 进阶精品视频——《Kafka 生产者源码解析》,能让你系统理解 Kafka 底层原理,满足开发者们不同阶段的工作需求: 本文分享自微信公众号 - 码农小胖哥(Felordcn)。 如...

码农小胖哥
06/22
0
0
Kafka 生产者源码解析,奥利给!

现在,这儿有份 Kafka 进阶精品视频——《Kafka 生产者源码解析》,能让你系统理解 Kafka 底层原理,满足开发者们不同阶段的工作需求: 本文分享自微信公众号 - 武培轩(wupeixuan404)。 如...

武培轩
07/08
0
0
【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结

前言 想说的话 这里已经梳理完Eureka、Ribbon、Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图。 说明 原创不易,如若转载 请标明来源! 博客地址:一枝...

一枝花算不算浪漫
01/13
0
0
Netty学习之旅

Netty 学习之旅------ByteBuf 篇之 ByteBuf 内部结构与 API 学习 Netty学习之旅------ByteBuf源码解读之初探UnpooledHeapByteBuf、UnpooledDirectByteBuf Netty学习之旅------源码分析Netty...

chenssy
01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka如何在千万级别时优化JVM GC问题?

大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发...

hummerstudio
06/18
6
0
我打赌!90%程序员都破解不了这个粽子,不信你试!

放假了 各位读者朋友们,马上就是端午小长假啦,开心激动有木有? 新的故事文章还在创作中,写了初稿感觉不太满意又推倒重来。其实写故事还是挺难的,读者可能第一次第二次有新鲜感,写多了就...

轩辕之风
06/24
11
0
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据

前言 “删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解...

后端技术漫谈
01/14
22
0
PHP设计模式之代理模式

PHP设计模式之代理模式 代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分...

硬核项目经理
2019/09/23
7
0
Redis的复制模式

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 1. 旧版本的执行步骤 从服务器...

osc_s9cni3go
16分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部