Android四大应用组件
Activity
Activity的理解:
1). Activity用来提供能与用户进行交互的用户界面
2). 组件的特点:它的类必须实现特定接口或继承特定类 需要在配置文件中配置其全类名 它的对象不是通过new来创建的, 而是系统自动创建的 它的对象具有一定的生命周期, 它的类中有对应的生命周期回调方法
Intent的理解
Intent是Activity, Service和BroadcastReceiver这三个应用组件之间进行通信的信使, 可以携带所需要的数据 intent会被交给ActivityManager去完成
- 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
- Activity的使用:
1). 编写Activity
2). 启动Activity1. 定义Activity类的子类HelloActivity 2. 在AndroidManifest.xml配置定义的组件 3. 定义布局文件activity_hello.xml 4. 重写Activity的onCreate(), 加载布局文件
3). 关闭Activitya. 一般启动: startActivity(intent) b. 带回调启动: startActivityForResult(intent, int requestCode) onActivityResult(int reqCode, int resultCode, Intent data)
a. 一般关闭: finish(); b. 带结果的关闭 setResult(int resultCode, Intent data) finish();
Activity的生命周期
1). Activity(界面)的状态运行状态: 可见也可操作 暂停状态: 可见但不可操作 停止状态: 不可见,但对象存在 死亡状态: 对象不存在
2). 生命周期方法调用过程
TaskStack和lauchMode(理解)
1). TaskStacka. 在Android中,用一个称之为Task Stack (回退栈)结构来存储管理启动的Activity对象 b. 一个应用启动,系统就会为其创建一个对应的TaskStack来存储并管理Activity对象 c. 窗口中显示的Activity是最前端的Tasktack的顶部的Activity
2). lauchMode
Service
Service的理解:
1). 区别Service与Activity?①. Activity: Activity对应一应用界面 应用退出, 所有的activity都会死亡 ②. Service 不与任何界面关联 应用退出Service仍在运行
2). 区别Service与Thread?
①. Service 用来在后台完成一个时间跨度比较大的工作的应用组件 应用退出, Service不会停止, 且应用再次进入后可以与正在运行的Service进行通信 Service的生命周期方法运行在主线程, 如果Service想做持续时间比较长的工作, 需要启动一个分线程(Thread) ②. Thread 用来开启一个分线程的类, 做一个长时间的工作 应用退出, Thread不会停止, 但再次进入后不能再控制前面启动的Thread对象
Service的定义
1). 定义Service的一个实现类: public class MyService extends Service{ //重写生命周期方法 }
2). 注册:
<service name="MyService的全类名"> <intent-filter> <action name=""/>
Service的启动与停止
1). 启动:a. startService(intent) b. bindService(intent, serviceConnection)
2). 停止:
a. stopService(intent) b. unbindService(serviceConnection)
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). 特点和作用
广播事件处理属于系统级的事件处理(一般事件处理是属于View级的事件处理)
广播的发送和接收是异步处理的过程,通常一个广播会被订阅此广播的多个接收者接收
广播事件处理过程即针对某一广播作出响应过程
广播事件机制是应用程序(进程间)之间通信的一种手段
2). 相关APIa. 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- 发送广播
1). 发送一般广播
2). 发送有序广播context.sendBroadcast(intent)
3). 两种广播的区别context.sendOrderedBroadcast(intent)
注册广播接收器
1). 编写receiver类1
2
3
4
5public 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
3MyBroadcastReceiver2 receiver2 = new MyBroadcastReceiver2();
IntentFilter filter = new IntentFilter(action);
registerReceiver(receiver2, filter);
3). 两种注册方式的区别
ContentProvider
- 理解
1). 为会么要有ContentProvider?
2). ContentProvider是什么?a. 数据库文件只能当前应用访问, 别的应用不能直接访问 b. 在真实的应用需求中, 可能需要应用操作其它应用的数据库表数据
ContentProvider是四大应用组件之一 当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问 其它应用需要使用ContentResolver来调用ContentProvider的方法 它们之间的调用是通过Uri来进行交流的
相关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)
- 自定义ContentProvider
class StudentContentProvider extends ContentProvider {1). 编写ContentProvider子类
//实现inert、delete、update和query等方法
}
<provider2). 在manifest.xml中注册
android:name=".StudentContentProvider" android:authorities="com.atguigu.provider.studentprovider" android:exported="true"/> //标识是否允许其它应用访问,默认是false
- 使用ContentResolver访问ContentProvider
1). 得到ContentResolver的对象 2). 调用query(), delete(), update(), insert()方法调用ContentProvider对应的方法 操作ContentResolver: 注册, 解注册, 通知
——相关资料推荐
android 图片自定义三级缓存实现以及原理、图片错位解决
Android中IntentService与Service的区别