ContentProvider工作过程

概要

ContentProvider主要用来给不同应用提供数据,当其所在进程启动时,ContentProvider会同时启动并发布到AMS中。

当android:multiprocess为true时,ContentProvider为多实例。

其提供了query、update、delete、insert等接口,方便我们进行数据操作。

启动流程

我们要使用ContentProvider,需要通过getContentResolver(),实际是ApplicationContentResolver对象。

我们从query方法入手

Read More

BroadcastReceiver工作过程

概述

BroadcastReceiver是一种消息型组件。由于BroadcastReceiver可以在不同的组件甚至不同的应用之间传递消息,所以其可以脱离Activity实现,
除了要在AndroidManifest.xml中注册广播类名外,还需要添加intentfilter,这样就可以让receiver选择性的接收广播。当注册完成之后,即使没有Activity启动,
也可以接收广播。在实现 BroadcastReceiver时,需要继承 BroadcastReceiver抽象类,但是不需要重写onCreat()方法,只需重写onReceive()方法,
因此,Service没有启动和停止的概念,更像是一个系统级的监听器。

流程分析

广播的注册分为静态注册和动态注册,其中静态注册的广播在应用安装时由系统自动完成注册,具体来说是由PMS(PackageManagerService)来完成整个注册过程的。

注册过程

动态注册的过程是从ContextWrapper的registerReceiver方法开始的。

我们从该方法开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//ContextWrapper.java

public Intent registerReceiver(
BroadcastReceiver receiver, IntentFilter filter) {
return mBase.registerReceiver(receiver, filter);
}


//ContextImpl.java

private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
IntentFilter filter, String broadcastPermission,
Handler scheduler, Context context, int flags) {
IIntentReceiver rd = null;
if (receiver != null) {
if (mPackageInfo != null && context != null) {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
//返回ReceiverDispatcher
rd = mPackageInfo.getReceiverDispatcher(
receiver, context, scheduler,
mMainThread.getInstrumentation(), true);
} else {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
rd = new LoadedApk.ReceiverDispatcher(
receiver, context, scheduler, null, true).getIIntentReceiver();
}
}
try {
//ActivityManagerService注册
final Intent intent = ActivityManager.getService().registerReceiver(
mMainThread.getApplicationThread(), mBasePackageName, rd, filter,
broadcastPermission, userId, flags);
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();
}
return intent;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

Read More

自定义View之Canvas

目录

自定义View
自定义View之Canvas
自定义View之Paint

API

颜色填充

1
2
3
4
canvas.drawColor(Color.BLACK);
canvas.drawColor(Color.parse("#88880000"); // 半透明红色
canvas.drawRGB(100, 200, 100);
canvas.drawARGB(100, 100, 200, 100);

画圆

1
2
3
4
5
6
7
8

/**
前两个参数 centerX centerY 是圆心的坐标,第三个参数 radius 是圆的半径,单位都是像素
*/
drawCircle(float centerX, float centerY, float radius, Paint paint)

canvas.drawCircle(300, 300, 200, paint);

Read More