ContentProvider(内容提供者)
概念:
Android为常见的一些数据提供了默认的ContentProvider(包括音频,视频图片和通讯录等)所以我们可以在其他应用程序通过那些contentProvider获取这些数据。
当我们想允许自己的应用的数据允许别的应用进行读取操作,我们可以让我们的APP实现ContentProvider类,同时注册一个URL,然后其他应用只要使用ContentResolver根据URL就可以操作我们APP中的数据了,而数据不一定是数据库,也可能是文件,xml或者其他,但是SharePreferernce使用基于数据库模型的简单表格来提供其中的数据。
1.简单的读取收件箱的信息:
其中:
ContentResolver resolver = getContentResolver();
//对ContentProvider中的数据进行添加,删除,修改和查询操作
Uri uri = Uri.parse();//将字符串转换成URI
Cursor cursor = resolver.query();//获取信息
ContentProvider的规定数据形式的URI组成,主要包括三部分:
1.scheme:contentProvider的scheme已经由Android所规定,scheme为Content://
2.Authority(主机名):用于唯一标识这个ContentProvider,比如www.baidu.wmw ,外部调用者可以根据这个标识来找到他
3.path(路径):路径可以用来表示我们要操作的数据,路径的构建应根据业务而定
Touch事件处理详解
1.简介
当我们手指按下时,Android采用层层传递-冒泡的方式处理点击事件。也就是说:消息从上到下依次传递,如果在传递的过程中被拦截了就停止下传。如果没有被拦截,就一直传递到底部,如果底部不能够消耗该消息,那么就又一层层的返回来,返给上层,直到被消耗或者是到达最顶层。在页面,touch事件的传递过程从外层到内层依次是:Activity>ViewGroup>View,Activity实际上是以ViewGroup的身份在处理事件,在此过程中,存在三个重要的方法:
首先我们知道touch事件,主要是在三个方法中传递和处理的,分别是:
1).dispathTouchEvent:负责事件分发,它的返回值就是表示是否消耗了当前事件
2).onInterceptTouchEvent:只存在于ViewGroup中,用于判断是否拦截该消息,如果当前View拦截了某个事件,那么在同一事件序列中,此方法不会被再次调用,返回结果表示是否拦截当前事件
3).onTouchEvent :事件处理。返回结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,当前view无法再次接收到事件
事件处理概述:
1.基于监听的事件处理:
事件处理流程:
2.基于回调的事件处理:
1).重写Android组件的回调方法
2).重写Activity的回调方法
通用性事件用回调事件处理,某些特定的事件用监听事件处理
物理按键事件处理:
指的是:音量键、电源键、菜单键、主屏键、菜单键等
onKeyDown():按下事件
onKeyup():抬起事件
onKeyLongPress():长按事件
触摸屏事件处理:
单击事件:setOnclickLister等
长按事件(长按两秒之后才会触发):setOnLongClickListener()
1.在ActivityMain中重写onCreateContentMenu()方法,为菜单添加选项值
menu.add("收藏");
<span style="color:#a9b7c6"> menu.add(<span style="color:#6a8759">"</span><span style="color:#6a8759">举报</span><span style="color:#6a8759">"</span>)<span style="color:#cc7832">;</span></span>
2.在Activity的onCreate()方法中为目标增加长按监听,将长按事件注册到菜单中
ImageView iv = (ImageView) findViewById(R.id.imageView);
iv.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
registerForContextMenu(v);
openContextMenu(v);
return false;
}
@Override
public boolean onLongClick(View v) {
registerForContextMenu(v);
openContextMenu(v);
return false;
}
触摸事件:
SetOnTouchListener()方法:
MotionEvent:保存发生触摸的位置,时间等细节信息的方法
触摸事件类型主要有三种:
1.MotionEvent.ACTION_DOWN:手指按下屏幕触发。
2.MotionEvent.ACTION_MOVE:手指在屏幕上移动触发
3.MotionEventACTION_UP:手指抬起时触发。
触摸事件与单击事件的区别:
01 Button button = (Button) findViewById(R.id.btn); //获得按钮对象
02
03 button.setOnClickListener(new View.OnClickListener() {
04 @Override
05 public void onClick(View v) { //为按钮添加单击事件监听器
06 Log.i("onClick", "这是单击事件");
07 }
08 });
09 //为按钮添加触摸事件监听器
10 button.setOnTouchListener(new View.OnTouchListener() {
11 @Override
12 public boolean onTouch(View v, MotionEvent event) {
13 if (event.getAction() == MotionEvent.ACTION_DOWN) { //表示手指按下
14 Log.i("onTouch", "按下");
15 } else if (event.getAction() == MotionEvent.ACTION_UP) {//表示手指抬起
16 Log.i("onTouch", "抬起");
17 }
18 return false; //表示未消耗掉这个事件
19 }
20 });
当触摸屏幕时,先进入触摸事件再进入单击事件进行判断,若onTouch()方法返回true,则不再进行单击事件,否则触发单击事件。
单击事件触动一个方法,触摸事件触动两个方法
手势:(Gestures)
1.Android中手势交互的执行顺序:
a.手指触碰屏幕时,触发MotionEvent事件,
b.该事件被OnToouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象
c.通过GestureDetector转发MotionEvent对象给OnGestureListener
d.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理。
下面通过一个简单的实例来进行验证:
我们知道监听手势的关键是:GestureListener
他给我们提供了下述的回调方法:
- 按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
- 抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
- 长按(onLongPress): 手指按在持续一段时间,并且没有松开。
- 滚动(onScroll): 手指在触摸屏上滑动。
- 按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
- 抬起(onSingleTapUp):手指离开触摸屏的那一刹那。
知道了GestureListener的相关方法后,实现手势检测也很简单,步骤如下:
- Step 1: 创建GestureDetector对象,创建时需实现GestureListener传入
- Step 2: 将Activity或者特定组件上的TouchEvent的事件交给GestureDetector处理即可! 我们写个简单的代码来验证这个流程,即重写对应的方法:
手势可分为:手势判断,手势添加,手势识别等