美文网首页
Activity篇

Activity篇

作者: SnailWalker | 来源:发表于2021-03-25 17:02 被阅读0次

    笔记地址:https://app.yinxiang.com/fx/b30ed8bc-0896-4c1b-b1cf-da4d08c75a02

    前言:
    Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接受用户的输入信息从而进行交互;

    1. 生命周期

    Google官方解释: https://developer.android.google.cn/guide/components/activities/activity-lifecycle?hl=zh_cn
    

    2. 启动模式{

    launchMode{
         1. standard (标准模式) [默认]
               >1. 多实例实现
         2. singleTop
            >1. 栈顶复用 {@link onNewIntent}
         3. singleTask
            >1. 栈内复用 
            >2. 默认具有clearTop的效果
         4. singleInstance
            >1. 单实例子模式;
            >2. 不论是指指定taskAffinity,都会为它创建一个新的任务栈;
     },
    Flags{
         1. FLAG_ACTIVITY_NEW_TASK
         2. FLAG_ACTIVITY_SINGLE_TOP
         3. FLAG_ACTIVITY_CLEAR_TOP
         4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
     }
    

    }

    3. IntentFilter匹配规则 (隐式调用)

    1Activity->nIntentFilter{
    naction {
    1. Intent中的action必须存在 & 过滤规则中的其中一个action相同;
    2. 区分大小写;
    3. 唯一性: Intent #setAction;
    },
    n
    category {
    1. Intent中没有category || Intent中的categorys必须是过滤规则中的;
    2. 系统调用startActivity / startActivityForResult时,会默认为intent添加categoryDefault( android.intent.category.DEFAULT) 这个所以过滤规则中必须制定这个categoryDefault
    3. 可以申明多个: Intent #addCategory;
    },
    ndata{
    1. 匹配规则类似action;
    2. 需要搭配action一起使用;
    3. Intent #setDataAndType, setData, setType;
    }->{
    1
    mimeType{
    1. 媒体类型
    2.举例: image/jpeg etc
    },
    1*URI{
    1. 结构: <scheme>://<host>:<port> /[<path>|<pathPrefix>|<pathPattern>] ;
    2. 类似: http://www.xxx.com:80/serach/info;
    3. 常见使用键下面补充部分
    }
    }
    }

    案例分析:
    [1] ActivityA使用Intent.FLAG_ACTIVITY_NEW_TASK启动ActivityB (设置taskAffility=":other"),并在B中使用Intent.FLAG_ACTIVITY_NEW_TASK启动ActivityB,会发现第二步启动基本没有任何效果,没有走onNewIntent或者onCreate回调;

    4. 源码解析

    Activity启动流程 9.0 (整体流程分析): https://blog.csdn.net/weixin_43766753/article/details/107746968
    Activity启动流程 10.0: http://www.zyiz.net/tech/detail-124642.html

    5. 补充(待定)

    1. Android为什么要有启动模式呢?
      1.方便Activity管理;
      1. 提高资源利用;
    2. 启动模式默认{
      launchMode="standard"
      taskAffinity="$app_packageName"
      };
    3. 使用ApplicationContext启动Activity(无论launchMode为任何值),需要添加Intent.FLAG_ACTIVITY_NEW_TASK标记位,这个启动类似SingleTask模式启动;
    4. taskAffinity属性不能单独使用,需要配合Intent.FLAG_ACTIVITY_NEW_TASK或者allowTaskReparenting或者singleTask模式etc;
    5. setDataAndType启动->{
      Intent().apply{
      启动浏览器浏览某个网页{
      action=Intent.ACTION_VIEW
      setData(Uri.parse("http://www.baidu.com")
      },
      启动拨号{
      action=Intent.ACTION_CALL
      setData(Uri.parse("tel:132****1222"))
      },
      打开文件{
      ...
      }
      }
      }
      6.启动Activity判断 PackageManager#resolveActivity
    6. Activity属性{
      label :
      1. app名: 入口Activity的lable>application的lable;
      2. 其它Activitiy的label属性可以用于通过隐式启动的时候,选择启动应用的显示
      }

    参考:
    <<Android开发艺术探索>>
    一只修仙的猿

    相关文章

      网友评论

          本文标题:Activity篇

          本文链接:https://www.haomeiwen.com/subject/yzlrhltx.html