温故而知新,系统整理一下。

Activity

  1. Activity的理解:
    1). Activity用来提供能与用户进行交互的用户界面
    2). 组件的特点:

    它的类必须实现特定接口或继承特定类
    需要在配置文件中配置其全类名
    它的对象不是通过new来创建的, 而是系统自动创建的
    它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法
    
  2. Intent的理解

    Intent是Activity, Service和BroadcastReceiver这三个应用组件之间进行通信的信使, 
    可以携带所需要的数据
    intent会被交给ActivityManager去完成
    
  3. Intent的使用:
    1). 创建对象:
           显示意图: 明确指定目标的意图, 操作当前自己应用的组件
                Intent(Context context, Class c)
           隐式意图: 没有明确指定目标的意图, 操作不是当前应用自己的组件
                Intent(String action)
      2). 携带数据
           putExtra(String name, Xxx value);
           Xxx getXxxExtra(String name)
           setData(Uri uri)  //Uri.parse(prefix+":"+数据) //prefix: tel, smsto, content: , file, http
    
  4. Activity的使用:
    1). 编写Activity
    1. 定义Activity类的子类HelloActivity
     2. 在AndroidManifest.xml配置定义的组件
     3. 定义布局文件activity_hello.xml
     4. 重写Activity的onCreate(), 加载布局文件
    
    2). 启动Activity
    a. 一般启动:
        startActivity(intent)
    b. 带回调启动:
         startActivityForResult(intent, int requestCode)
         onActivityResult(int reqCode, int resultCode, Intent data)
    
    3). 关闭Activity
    a. 一般关闭:
         finish();
     b. 带结果的关闭    
           setResult(int resultCode, Intent data)   
           finish();
    
  5. Activity的生命周期
    1). Activity(界面)的状态

    运行状态: 可见也可操作
    暂停状态: 可见但不可操作
    停止状态: 不可见,但对象存在 
    死亡状态: 对象不存在
    

    2). 生命周期方法调用过程

  6. TaskStack和lauchMode(理解)
    1). TaskStack

    a. 在Android中,用一个称之为Task Stack (回退栈)结构来存储管理启动的Activity对象
    b. 一个应用启动,系统就会为其创建一个对应的TaskStack来存储并管理Activity对象
    c. 窗口中显示的Activity是最前端的Tasktack的顶部的Activity
    

    2). lauchMode

Service

  1. Service的理解:
    1). 区别Service与Activity?

    ①. Activity:
              Activity对应一应用界面
              应用退出, 所有的activity都会死亡
    ②. Service
              不与任何界面关联
              应用退出Service仍在运行
    

    2). 区别Service与Thread?

    ①. Service
                用来在后台完成一个时间跨度比较大的工作的应用组件
                应用退出, Service不会停止, 且应用再次进入后可以与正在运行的Service进行通信
                Service的生命周期方法运行在主线程, 如果Service想做持续时间比较长的工作, 需要启动一个分线程(Thread)
    ②. Thread
               用来开启一个分线程的类, 做一个长时间的工作
                应用退出, Thread不会停止, 但再次进入后不能再控制前面启动的Thread对象
    
  2. Service的定义

    1). 定义Service的一个实现类:
         public class MyService extends Service{
             //重写生命周期方法
         }
    

    2). 注册:

    <service name="MyService的全类名">
         <intent-filter>
              <action name=""/>
    
  3. Service的启动与停止
    1). 启动:

    a. startService(intent)
    b. bindService(intent, serviceConnection)
    

    2). 停止:

    a. stopService(intent)
    b. unbindService(serviceConnection)
    
  4. Service的生命周期

    4.1. startService
    第一次–>MyLocalService()–>onCreate()—>onStartCommand()
    后面的–>onStartCommand(intent)
    4.2. stopService()
    第一次–>onDetroy()
    后面的: 没有任何反应, 也不抛出异常
    4.3. bindService
    第一次: –>MyLocalService()–>onCreate()–>onBind()–>onServiceConnected()
    后面: 没有任何反应, 也不会抛出异常
    4.4. unbindServie
    第一次: –>onUnbind()–如果没有其它Client端绑定–>onDestroy()
    后面: 抛出异常
    注意如果是bindService: 如果Activity退出, 必须先解除绑定: onDetroy()中unbindService()
    4.5. 远程Service的使用(AIDL)
    1). 简单理解Service
    2). 根据PPT将测试做出来

4.6. 什么时候会用到反射?
1). 显示意图
2). API被隐藏
3). 功能清单文件配置应用组件的全类名
4). 布局文件

BroadcastReceiver

  1. 理解
    1). 特点和作用
    广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理)
    广播的发送和接收是异步处理的过程,通常一个广播会被订阅此广播的多个接收者接收
    广播事件处理过程即针对某一广播作出响应过程
    广播事件机制是应用程序(进程间)之间通信的一种手段
    2). 相关API

    a. Context
    

    sendBroadcast(Intent intent) : 发送一般广播
    sendOrderedBroadcast(Intent intent) : 发送有序广播
    registerReceiver(receiver, intentFilter) : 注册广播接收器
    unRegisterReceiver(receiver) : 解注册广播接收器

    b.  BroadcastReceiver
    

    onReceive(Context context, Intent intent) : 接收到广播的回调
    abortBroadcast() : 中断广播的继续传播
    boolean isOrderedBroadcast() : 判断是否是有序广播

    3). 常见广播:
    收到短信广播 : android.provider.Telephony.SMS_RECEIVED
    开机完成广播 : Intent.ACTION_BOOT_COMPLETED
    应用被卸载广播 : Intent.ACTION_PACKAGE_REMOVED
    手机锁屏 : Intent.ACTION_SCREEN_OFF
    手机开屏 : Intent.ACTION_SCREEN_ON

  2. 发送广播
    1). 发送一般广播
    context.sendBroadcast(intent)
    
    2). 发送有序广播
    context.sendOrderedBroadcast(intent)
    
    3). 两种广播的区别
  1. 注册广播接收器
    1). 编写receiver类

    1
    2
    3
    4
    5
    public class MyBroadcastReceiver extends BroadcastReceiver{
    public void onReceive(Context context, Intent intent){
    //处理广播
    }
    }

    2). 注册receiver

    方式一: 配置文件注册(静态注册)
    
    1
    2
    3
    4
    5
    6
    <receiver android:name="com.atguigu.t6_br.MyBroadcastReceiver">
    <!--priority指定当前receiver的优先级, 值是0-1000, 越大越好 -->
    <intent-filter android:priority="500">
    <action android:name="com.atguigu.t6_br.mybroadcastreceiver"/>
    </intent-filter>
    </receiver>
    方式二: 硬编码注册(动态注册)
    
    1
    2
    3
    MyBroadcastReceiver2 receiver2 = new MyBroadcastReceiver2();
    IntentFilter filter = new IntentFilter(action);
    registerReceiver(receiver2, filter);

3). 两种注册方式的区别

ContentProvider

  1. 理解
    1). 为会么要有ContentProvider?
    a. 数据库文件只能当前应用访问, 别的应用不能直接访问
    b. 在真实的应用需求中, 可能需要应用操作其它应用的数据库表数据
    
    2). ContentProvider是什么?
     ContentProvider是四大应用组件之一
     当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问
     其它应用需要使用ContentResolver来调用ContentProvider的方法
    它们之间的调用是通过Uri来进行交流的
    
  2. 相关API:
    1). ContentProvider: 内容提供者类

    a. CRUD的方法: query(), insert(), update(), delete()
    b. onCreate()
    

    2). ContentResolver: 内容解析器类 :

    a. CRUD的方法: 
          query(), 
          insert(),
          update(), 
          delete()
    b. 实现观察的相关方法:
           registContentObserver()
           unRegistContentObserver()
           notityChanged()
    c. 得到它的对象
         context.getCOntentResolver();
    

    3). ContentObserver: 内容观察者类

    void onChange(boolean selfChange) : 数据改变, 且执行了notityChanged()
    

    4). Uri: 包含一个具有一定格式的字符串所对应资源的类

    A : 是一个前缀,表示是由ContentProvider提供,固定不变
    

    B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
    C : 对应于哪张表 student
    D : id值, 对应表中的哪条记录
    5). UriMatcher: 用来识别uri的一个uri容器

    //添加一个合法的URI
    

    void addURI(String authority, String path, int code)
    //匹配指定的uri, 返回匹配码
    int match(Uri uri)
    6). ContentUris: 操作uri的工具类
    //解析uri, 得到其中的id
    long parseId(Uri contentUri)
    //添加id到指定的uri中
    Uri withAppendedId(Uri contentUri, long id)

  1. 自定义ContentProvider
    1). 编写ContentProvider子类
    
    class StudentContentProvider extends ContentProvider {
    //实现inert、delete、update和query等方法
    }
    2). 在manifest.xml中注册
    
    <provider
    android:name=".StudentContentProvider"
    android:authorities="com.atguigu.provider.studentprovider" 
    android:exported="true"/> //标识是否允许其它应用访问,默认是false
    
  2. 使用ContentResolver访问ContentProvider
    1). 得到ContentResolver的对象
    2). 调用query(), delete(), update(), insert()方法调用ContentProvider对应的方法
         操作ContentResolver: 注册, 解注册, 通知
    

——相关资料推荐
android 图片自定义三级缓存实现以及原理、图片错位解决
Android中IntentService与Service的区别