Android_03--四大组件_Activity+BroadcastReceiver+service+ContentProvider

1.Activety 活动

  • 创建Activity
定义Activity
  1.  定义类继承Activity
  2.  在AndroidManifest.xml的节点中声明
显示意图创建
 
   
  1. 构造函数,代码少 new Intent(this, NewActivity.class);
  2. 类名形式,灵活,可扩展性强    intent.setClassName(this, "cn.itcast.activity.NewActivity");
  3. 包名类名形式,可启动其他程序中的Activity    intent.setClassName("cn.itcast.downloader", "cn.itcast.downloader.MainActivity");
Activity数据传递
 
   
  1. 在意图对象中封装了一个Bundle对象,可以用来携带数据
  2. 在新Activity中可以获得意图对象以获取其中Bundle保存的数据
  1. 使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity
  2. 重写onActivityResult(int requestCode, int resultCode, Intent data) 方法
  3. 新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用onActivityResult方法
隐式意图传递
隐式意图创建: 隐式意图不指定组件,通过动作、类型、数据匹配对应的组件
  • 在清单文件中定义时需要定义才能被隐式意图启动
  • 中至少配置一个和一个,否则无法被启动
  • Intent对象中设置的action、category、data在必须全部包含才能启动
  • 中的都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动
  • 生命周期
  1. onCreate:创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用
  2. onStart:onCreate之后或者从停止状态恢复时调用
  3. onResume:onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume
  4. onPause:进入暂停、停止状态,或者销毁时会调用
  5. onStop:进入停止状态,或者销毁时会调用
  6. onDestroy:销毁时调用
  7. onRestart:从停止状态恢复时调用
  • 启动模式
在AndroidManifest.xml中的标签中可以配置android:launchMode属性,用来控制Actvity的启动模式
  • standard:每次调用startActivity()启动时都会创建一个新的Activity放在栈顶
  • singleTop:如果启动的Activity时,指定Activity不在栈顶就创建,如在栈顶,则不再创建
  • singleTask:如果启动的Activity不存在就创建,如果存在直接跳转到指定的Activity所在位置
  • singleInstance:如果启动的Activity不存在就创建,如果存在就将指定的Activity移动到栈顶

2.BroadcastReceiver广播

  • 定义广播接收者
  1. 定义类继承BroadcastReceiver,重写onReceive方法
  2. 清单文件中声明,需要在其中配置指定接收广播的动作
  3. 当接收到匹配广播之后就会执行onReceive方法
  4. BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册Receiver
  • 发送广播
1.无序广播
  • 使用sendBroadcast方法发送
  • 被所有广播接收者接收,无序,不可中断
  • 广播时可设置接收者权限,仅当接收者含有权限才能接收
  • 接收者的也可设置发送方权限,只接收含有权限应用的广播
2.有序广播
  • 使用sendOrderedBroadcast方法发送
  • 接收者可以在中定义android:priority定义优先级,数字越大优先级越高
  • 被各个广播接收者逐个接收,中途可以中断或者添加数据
             abortBroadcast()            getResultExtras(true).putString("data", "新增数据");
  • 监听
监听短信接收

监听电话呼出

  • 生命周期
    • 广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
    • 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
    • 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
    • 耗时的较长的工作最好放在服务中完成

3.service服务

  • 概念
    • Service是一种在后台运行,没有界面的组件,由其他组件调用开始。
    • 创建Service,定义类继承Service,AndroidManifest.xml中定义
    • 开启Service,在其他组件中调用startService方法
    • 停止Service,调用stopService方法
  • 进程的优先级
    • Foreground process 前台进程 优先级最高  相当于activity执行了onResume 方法 用户正在交互
    • Visible process 可视进程 一直影响用户看得见  相当于activity执行了onPause方法
    • service process 服务进程   通过startService 方法开启了一个服务
    • background process 后台进程 相当于activity 执行了onStop方法  界面不可见 但是activity并没有销毁
    • Empty process  空进程  不会维持任何组件运行  
  • 绑定本地服务
    • 使用bindService绑定服务,传入一个自定义的ServiceConnection用来接收IBinder
    • 定义一个业务接口,其中定义需要的使用的方法
    • 服务中自定义一个IBinder继承Binder并实现业务接口,在onBind方法中返回
    • 调用端将IBinder转为接口类型,调用接口中的方法即可调用到服务中的方法
  • 绑定远程服务
    • 远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用AIDL技术
    • 将接口扩展名改为“.aidl”
    • 去掉权限修饰符
    • gen文件夹下会生成同名接口
    • 将服务中自定义的IBinder类改为继承接口中的Stub
    • ServiceConnection中返回的IBinder是代理对象,不能使用强转,改用Stub.asInterface()
  • AIDL进程间数据传递
    • AIDL默认只能使用Java中基本数据类型和String、List、Map,List和Map中的元素类型也只能是这些类型。
    • 如果需要使用其他类型数据,使用的类必须实现Parcelable接口以完成序列化和反序列化工作    重写 public void writeToParcel(Parcel dest, int flags)    定义 public static final Parcelable.Creator CREATOR
    • 定义该类对应的AIDL    package 包名    parcelable 类名
    • 在接口AIDL中导入该类,注意:即使是同一个包也需要导入

4.ContentProvider

内容提供者是应用程序之间共享数据的接口
  • 使用    
    • 定义类继承ContentProvider,根据需要重写内部方法(增删改查)
    • 在清单文件的节点下进行配置,标签中需要指定name和authorities属性(authorities:是访问Provider时的路径,要唯一)
    • URI代表要操作的数据,由scheme、authorites、path三部分组成
  1. content://cn.itcast.sqlite.provider/person
  2. scheme:固定为content,代表访问内容提供者
  3. authorites:节点中的authorites属性
  4. path:程序定义的路径,可根据业务逻辑定义
 访问ContentProvider
外部程序只需知道内容提供者的Uri路径信息,通过内容解析器ContentResolver即可调用内容提供者
Uri的组成:







你可能感兴趣的:(Android知识体系,android,Activity,service,ContentProvider)