PendingIntent认识
- PendIntent其实是Intent的封装
- 不是立刻执行某个行为,而是满足某些条件或触发某些事件后才执行指定的行为
- 我们的 Activity 如果设置了 exported = false,其他应用如果使用 Intent 就访问不到这个 Activity,但是使用 PendingIntent 是可以的。
- 即:PendingIntent将某个动作的触发时机交给其他应用;让那个应用代表自己去执行那个动作(权限都给他)
获取PendingIntent
| 12
 3
 4
 5
 
 | getActivity()getActivities()
 getBroadcast()
 getService()
 getForegroundService()
 
 | 
| 12
 3
 4
 5
 
 | 参数:Context - 上下文对象
 requestCode - 请求码
 Intent - 请求意图用以指明启动类及数据传递
 flags -关键标志位
 
 | 
| flags |  | 
| FLAG_CANCEL_CURRENT | 先将当前已有的PendingIntent取消,然后重新生成一个PendingIntent对象。 | 
| FLAG_NO_CREATE | 如果当前系统中不存在相同的PendingIntent对象,系统将返回null,否则返回已有对象 | 
| FLAG_ONE_SHOT | 该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。 | 
| FLAG_UPDATE_CURRENT | 更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras | 
| FLAG_IMMUTABLE | 创建的PendingIntent是不可变的,使用send方法发送的附加Intent会被忽略 | 
原理
- A应用希望让B应用帮忙触发一个行为,这是跨应用的通信
- 需要 Android 系统作为中间人,这里的中间人就是 ActivityManager。 
- A应用创建建 PendingIntent,在创建 PendingIntent 的过程中,向 ActivityManager 注册了这个 PendingIntent,所以,即使A应用死了,当它再次苏醒时,只要提供相同的参数,还是可以获取到之前那个 PendingIntent 的。
- 当 A 将 PendingIntent 调用系统 API 比如 AlarmManager.set(),实际是将权限给了B应用,这时候, B应用可以根据参数信息,来从 ActivityManager 获取到 A 设置的 PendingIntent
Canvas
- 相当于一个透明图层
- 每次调用canvas.drawXXXX系列函数来绘图,都会产生一个全新的Canvas画布。
- 如果在DrawXXX前,调用平移、旋转等函数来对Canvas进行了操作,那么这个操作是不可逆的!每次产生的画布最新位置都是这些操作后的位置。
- 在Canvas与屏幕合成时,超出屏幕范围的图像是不会显示出来的。
rotate函数

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | public class MyTextView extends TextView { public MyTextView(Context context, AttributeSet attrs) {
 super(context, attrs);
 }
 @Override
 protected void onDraw(Canvas canvas) {
 canvas.rotate(-90);
 super.onDraw(canvas);
 }
 }
 
 | 

translate函数
| 12
 3
 
 | void translate(float dx, float dy)
 
 
 | 
扭曲(skew)
其实我觉得译成斜切更合适,在PS中的这个功能就差不多叫斜切。但这里还是直译吧,大家都是这个名字。看下它的构造函数:
| 12
 3
 
 | void skew (float sx, float sy)
 
 
 | 
save restore
每次save,将当前画布状态保存到一个状态栈中,restore从栈顶取出一个状态恢复到画布上
SDCard
| 12
 3
 4
 5
 6
 
 | Environment.MEDIA_UNMOUNTED Environment.MEDIA_REMOVED
 Environment.MEDIA_BAD_REMOVAL
 Environment.MEDIA_SHARED
 Environment.MEDIA_CHECKINGS
 Environment.MEDIA_MOUNTED
 
 |