学习计划_Android 入门学习指南

基础知识

Part 1:四大组件

一、Activity

掌握生命周期、IntentFilter、启动模式、页面状态保存与恢复

1.1 生命周期
onCreate():表示 Activity 正在被创建
可以做一些初始化工作,比如调用 setContentVire() 加载布局资源、初始化数据等

onRestart():表示 Activity 正在重新启动,对应着 Activity 从不可见重新变为可见

onStart():表示 Activity 正在被启动,Activity 已经可见,但是还不在前台,无法和用户交互

onResume():表示 Activity 已经可见且在前台

onPause():表示 Activity 正在停止
可以做一些存储数据、停止动画等工作,但是不要太耗时,否则会影响新 Activity 的显示,因为当前 Activity#onPause() 执行完,新 Activity#onResume() 才会被执行

onStop():表示 Activity 即将停止
可以做一些稍微重量级的回收工作,但是不要太耗时

onDestroy():表示 Acivity 即将被销毁
可以做一些回收工作和资源的释放
1.2 IntentFilter

启动 Activity 分为两种方式:显式调用和隐式调用。显式调用需要明确指定组件信息,所以这里主要介绍的是隐式调用

隐式调用需要 Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,匹配通过才能启动目标 Activity,匹配时考虑三个方面:

  • 动作(action)
    匹配规则:
    ① 如果 <intent-filter> 标签中有多个 <action/>,则 Intent 中只要有和过滤规则中的其中一个 <action/> 相同即为匹配成功
    ② Intent 中必须含有 action,如果没有则匹配失败
  • category(类别)
  • 匹配规则:
    ① Intent 中存在的 category 都必须和过滤规则中的其中一个 <category/>相同才算匹配成功
    ② Intent 中可以没有指定 category,但是这种情况下过滤规则必须指定 "android.intent.category.DEFAULT" 这个 category
  • data(url 和 mimeType)
    URI 结构:<scheme>://<host>:<port/>/[<path>|<pathPrefix>|<pathPattern>]
    如:http://www.baidu.com:80/search/info
    mimeType:媒体类型
    如:image/jpeg、video/* 等
    过滤规则:
    ① 过滤规则没有指定 URI,使用默认值 content 和 file,Intent 中 URI 中的 scheme 必须为 content 或 file 才能匹配
    ② 过滤规则中 <data> 明确指定的必须出现在 Intent 中的 data 中
1.3 启动模式

Activity 默认的启动模式,多次启动同一个 Activity 时,会创建多个实例,所以系统提供了其它启动模式来修改系统的默认行为

Activity 的启动模式有四种:

  • Standard:标准模式
  • SingleTop:栈顶复用模式
    要启动的 Activity 在当前栈中存在且位于栈顶,调用其 onNewIntent() 方法
    要启动的 Activity 在当前栈中存但不位于栈顶,创建 Activity 实例压入栈中
    要启动的 Activity 当前栈中不存在且位于栈顶,创建 Activity 实例压入栈中
  • singleTask:栈内复用模式
  • 要启动的 Activity 所需的栈存在且位于栈顶,调用其 onNewIntent() 方法
  • 要启动的 Activity 所需的栈存但不位于栈顶,将其之上的所有 Activity 全部出栈,然后调用其 onNewIntent() 方法
  • 要启动的 Activity 所需的栈不存在,先创建 Activity 所需的栈,再创建 Activity 实例压入栈中
  • singleInstance:单实例模式
    启动时系统会为 Activity 单独创建一个栈,且栈中只存在一个 Activity,再次启动时,会调用其 onNewIntent() 方法
1.4 页面状态保存与恢复

出现异常情况的生命周期情况:
(1)资源相关的系统配置发生改变后,Activity 就会被销毁并重新创建
(2)资源内存不足导致低优先级的 Activity 被杀死
使用场景:屏幕旋转导致的 Activity 重建(其它的使用场景不多见)
① 在 onSaveInstanceState() 方法中保存当前 Activity 的状态,正常情况下系统不会调用该方法,只在 Activity 被异常终止的情况下调用
② 在 onRestoreInstanceState() 或 onCreate() 方法中取出之前保存的数据并恢复,如果用 onCreate() 来恢复数据之前还应对 Bundle 参数做判空操作,系统建议使用 onRestoreInstanceState() 方法来恢复数据

二、Fragment

2.1 生命周期
Activity StateFragment Callbacks
CreateedonAttach() -> onCreate() -> onCreateView() -> onActivityCreated()
StatedonStart()
ResumedonResumed()
PausedonPaused()
StopedonStop()
DestroyedonDestroyView() -> onDestroy() -> onDetach()
2.2 与 Activity 通信方式

a. Activity -> Fragment 通信方式

在 Activity 中设置要传递给 Fragment 的数据:
1. 获取 FragmentManager 管理对象
2. 获取 FragmentTransaction 事务对象
3. new 对象创建 Fragment 实例new 对象
4. 创建 Fragment 实例创建 Bundle 对象
5. 往 Bundle 中添加数据往 Bundle 中添加数据
6. 通过 Fragment#setArguments() 方法设置数据
7. 通过 FtragmentTransaction 事务对象动态添加 Fragment
8. 提交事务提交事务

在 Fragment 中获取数据:
1.onCreateView() 方法中调用 getArguments() 方法获取 Bundle 对象 
2. Bundle 根据 key 获取对应的 value

b. Fragment -> Activity 通信方式:
接口回调方式:
① 在 Fragment 中定义接口,Activity 实现接口
② Fragment 调用接口中的方法(应先对接口对象做判空操作)

2.3 创建 Fragment

a. 静态创建
① 定义 Fragment 的布局文件
② 自定义 Fragment 类(继承 V4 包下的 Fragment),重写 onCreateView() 方法
③ 在 Activity 的布局文件中添加 <Fragment/> 标签,标签中 name 对应 ② 中自定义的 Fragment 类的全类名,同时设置 idtag

b. 动态创建
① 创建 FragmentManager 对象
② 创建 FragmentTransaction 事务对象
③ new 对象创建需要的 Fragment 实例
④ 通过 FtragmentTransaction 事务对象动态添加 Fragment
⑤ 提交事务

三、Service

3.1 生命周期调用

a. startService() 下生命周期
① 首次调用 startService():执行 onCreate()、onStartCommand()、onStart()
② 多次调用 startSetvice():执行 onStartCommand()、onStart(),不再执行 onCreate()
③ 多次调用 stopService():只打印一次 onDestroy()

b. bindService() 下生命周期
① 多次 bindService():只执行一次 onCreate()、onBind()
② 多次 unBind():会抛异常,可声明一个 boolean,在 bindService() 置为 true,在 unBind() 中置为 false,防止多次 unBind() 后抛异常

c. 同一个 Service,先 startService,然后再 bindService
先 startService(),再 bindService(),经测试,要停止那个 Service 需要执行完 stopService() 和 unbindService(),执行顺序不分先后,只要 stopService() 和 unbindService() 这两个方法执行完,就可以停止那个 Service,只是打印的效果不一样
① 先 stopService() 后 unbindService() 时,先执行 stopService(),但是不打印 onDestory,当执行 unbindService() 后依次打印 onUnbind: 、onDestory
② 先 unbindService() 后 stopService() 时,执行 unbindService() 打印 onUnbind,执行 stopService() 打印 onDestroy

3.2 与 Activity 通信

Activity -> Service 通信方法:
Activity 调用 bindeService() 方法,获取 Binder 实例操作 Service 的方法

Service -> Activity 通信方法:
接口回调
① 在 Service 中定义接口,Activity 实现接口
② Service 调用接口中的方法(应先对接口对象做判空操作)

3.3 IntentService

① IntentService 继承自 Service,是一个抽象类,抽象方法 onNewIntent() 用于对响应结果的处理
② IntentService 内部有一个 HandlerThread,用于接收和处理消息,且因为是一个子线程,所以可以执行耗时任务,不必担心 ANR
③ IntentService 发送消息到内部的 HandlerThread#Looper 消息队列,在处理完消息之后,IntentService 会调用 onNewIntent() 响应处理结果

3.4 Foreground-Service

通过 Context#startForegroundService() 启动一个前台服务
注意:
① Android 8.0 不允许后台应用创建后台服务,可以创建前台服务
② 前台服务创建后,要在 5s 内调用 Service#startForeground() 方法在状态栏显示一个通知,否则会出现 ANR

未完待续…
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值