四大组件:Activity、Service、ContentProvider、BroadcastReceiver
常用权限:
<uses-permission android:name="android.permission.INTERNET" /> 允许网络访问
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />允许读写SD卡
<uses-permission android:name="android.permission.SEND_SMS"/>发送短信
<uses-permission android:name="android.permission.READ_SMS"/>读取短信
<uses-permission android:name="android.permission.RECEIVE_SMS"/>监控短信接收
<uses-permission android:name="android.permission.CALL_PHONE"/>拨打电话
<uses-permission android:name="android.permission.READ_CONTACTS"/>读取联系人
五、数据存储
- 文件存储
- SharedPreferences:XML文件存储
- SQLite数据库
- ContentProvider:内容提供者
- 网络存储
七、内容提供者
-
ContentProvider:内容提供者
继承ContentProvider
-
AndroidManifest注册提供者
<provider android:name=".PersonProvider" android:authorities="cn.itcast.contentobserverdb" android:enabled="true" android:exported="true"> </provider>
与authorities中符合即可进行该提供者中获取数据
进入提供者后还需要使用
UriMatcher
判断路径
-
ContentResolver:访问其他程序数据
ContentResolver resolver = getContentResolver(); uri = Uri.parse("content://cn.itcast.contentobserverdb/info"); resolver.insert(uri, values); resolver.delete(uri, "name=?",new String[]{"itcast0"}); Cursor cursor = resolver.query(uri, new String[]{"_id", "name"}, null, null, null); resolver.update(uri, values, "name=?",new String[]{"itcast1"});
-
contentObserver:内容观察者
继承ContentObserver
-
注册观察者
getContentResolver().registerContentObserver()
Uri uri = Uri.parse("content://cn.itcast.contentobserverdb/info"); //注册内容观察者,参数uri指向要监测的数据库info表, //参数true定义了监测的范围,最后一个参数是一个内容观察者对象 ContentObserver obs = new MyObserver(new Handler()); getContentResolver().registerContentObserver(uri, true,obs); //取消注册内容观察者 getContentResolver().unregisterContentObserver(obs);
八、广播接收者
1、广播接收者是通过Binder机制在AMS(Activity Manager Service)中进行注册的
2、广播发送者是通过Binder机制向AMS发送广播。
3、AMS查找符合相应条件(IntentFilter/Permission)的广播接收者(BroadcastReceiver),将广播发送到相应的消息循环队列中
4、执行消息循环时获取到此广播,会回调广播接收者(BroadcastReceiver)中的onReceiver()方法。
MyBroadcastReceiver
继承BroadcastReceiver
成为广播接收者。并且重写onReceive()
方法
动态注册
在MainActivity中实例化广播接收者。使用IntentFilter
设置要过滤的广播
receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(receiver,intentFilter);
接收者的注销
unregisterReceiver(receiver);
静态注册
在AndroidManifest.xml
中注册
<application>
<receiver android:name=".MyReceiver"
android:enable="true" 是否可实例化
android:exported="true">是否接收当前程序之外的广播
</receiver>
</application>
在Android8.0后,无法使用静态注册。
广播的类型
-
无序
使用
sendBroadcast()
方法发送,接受和执行顺序不确定。无法被拦截。 -
有序
使用
sendOrderedBroadcast()
方法发送,按照优先级顺序依次接收,广播只会被优先级最高接收者拦截,然后根据逻辑执行决定是否需要传递。 -
优先级的设置
intentFilter.setPriority(1000)
九、服务
Myserver
继承Server
成为一个服务。并且需要重写onBind()
方法。
在AndroidManifext.xml
中注册
<application>
<service android:name=".Myserver"
android:enable="true" 是否可实例化
android:exported="true">是否被其他应用中的组件调用或交互
</service>
</application>
启用方式
服务的两种启动方式,startService
和bindService
生命周期
- startService:startService->onCreate()->onStartCommand()->onDestroy()
- bindService:bindService->onCreate()->onBind()->onUnbind()->onDestroy()
- onCreate:第一次创建服务时执行的方法。
- onStartCommand:调用startService()方法启动服务时执行的方法。
- onBind():调用bindService()方法启动服务时执行的方法
- onUnbind():调用unBindService()方法断开服务时执行的方法
- onDestroy():服务被销毁时执行的方法。
startService使用startService(intent)启动服务,stopService(intent)关闭服务
bindService使用bindService(intent,myconn,BIND_AUTO_CREATE)绑定服务,使用unbindService(myconn)解绑服务
通信
-
本地服务通信
触发Service中的onBind()返回IBinder对象,使用IBinder对象通信
-
远程服务通信
通过AIDL(Android Interface Denfinition Language),
- 源代码以.aidl结尾
- 除了基本类型,使用时需要导包
十、事件处理
- 键盘事件
- 触摸事件
Activity回调方法:(重写以下方法,可改变键盘和触摸事件触发处理逻辑)
- onKeyDown(int keyCode,KenyEvent event):按键按下
- onKeyUp(int keyCode,KenyEvent event):按键弹起
- onTouchEvent(MotionEvent event):触摸
- onFocusChanged(MotionEvent event):焦点改变
监听器的事件处理
事件监听的处理模型:
- Event Source(事件源):触发事件的控件
- Event(事件):触发的事件(按下,触摸)等。
- Event Listener(事件监听器):负责监听事件源发生的事件。
监听器接口
- OnClickListener:控件点击
- OnLongClickListener:控件长按
- OnFocusChangeListener:焦点改变
- OnKeyListener:键盘输入
- OnTouchListner:手机屏幕触摸
手势
识别手势类:GestureLibrary
手势监听组件:GestureOverlayView
- OnGesturePerformedListener:监听单击、滑动、长按等手势
- OnDoubleTapListener:监听双击和单击手势
- OnContextClickListener:监听鼠标/触摸板右击手势
- SimpleOnGestureListener:实现前三个接口中的所有回调方法。
Handle消息机制
- Message:可以携带少量的信息在不同线程间交换,what字段可以携带一些整型数据,obj字段可以携带一个Object对象。
- Handler:用于发送和处理消息。使用
sendMessage()
发送消息。处理消息回调handlerMessage()
- MessageQueue:消息队列,通过
sendMessage
的消息都会在队列中等待着handlerMessage()
处理 - Looper:消息队列管家,取出MessageQueue中的消息,分发到Hanlder的
handlerMessage
方法中
十一、网络编程
<uses-permission android:name="android.permission.INTERNET" />
HttpURLConnection
和HttpsURLConnection
都继承于URLConnection
- 创建URL对象
- 使用
URL.openConnection()
获取HttpURLConnection
- 调用
HttpURLConnection.setConnectiTimeout
设置连接超时时间 - 调用
HttpURLConnection.setRequestMethod
设置请求方式 - 设置其他参数
HttpURLConnection.setRequestProperty
- 获取输出流
HttpURLConnection.getOutputStream()和outputStream.write
来写入数据 - 获取输入流
HttpURLConnection.getInputStream()
来获取返回结果 - 调用
disconnect
关闭http连接
JSON解析使用JSONObject
和JSONArray
JSONObject处理
JSONObject obj = getJSONObject();
String name = obj.optString("name");
int age = obj.optInt("age");
boolean married = obj.optBoolean("married");
JSONArray处理
JSONArray array = getJSONArray();
for(int i=0;i<array.length();i++){
JSONObject obj = array.getJSONObject(i);
String name = obj.optString("name");
int age = obj.optInt("age");
boolean married = obj.optBoolean("married");
}
十三、图形图像处理
- Bitmap:表示一个位图
- BitmapFactory:用作读取资源解析为位图
- Paint:用来描述线宽、颜色、透明度、填充效果。
- Canvas:可使用Paint来根据Rect绘画指定位置宽高的画布
自定义View
- 继承View后重写onDraw(Canvas canvas)
- 使用canvas.drawBitmap()方法绘制到界面上
- 在layout文件中加入该view,标签为全类名
补间动画
-
AlphaAnimation:透明度渐变动画,参数解释P273
<!--透明度渐变--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:interpolator="@android:anim/linear_interpolator" android:repeatMode="reverse" android:repeatCount="infinite" android:duration="1000" android:fromAlpha="1.0" android:toAlpha="0.0"/> </set>
-
RotateAnimation:旋转动画,参数解释P273
<!--旋转--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:repeatMode="reverse" android:repeatCount="infinite" android:duration="1000"/> </set>
-
ScaleAnimation:缩放动画,参数解释P274
<!--缩放--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:toXScale="0.5" android:toYScale="0.5" android:pivotX="50%" android:pivotY="50%" android:repeatMode="reverse" android:repeatCount="infinite" android:duration="3000"/> </set>
-
TranslateAnimation:平移动画,参数解释P274
<!--平移--> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0.0" android:fromYDelta="0.0" android:toXDelta="100" android:toYDelta="0.0" android:repeatCount="infinite" android:repeatMode="reverse" android:duration="4000"/> </set>
逐帧动画
-
创建一个定义好的帧动画xml文件,
android:duration
代表该帧停留的时间<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/wifi01" android:duration="300"></item> <item android:drawable="@drawable/wifi02" android:duration="300"></item> <item android:drawable="@drawable/wifi03" android:duration="300"></item> <item android:drawable="@drawable/wifi04" android:duration="300"></item> <item android:drawable="@drawable/wifi05" android:duration="300"></item> <item android:drawable="@drawable/wifi06" android:duration="300"></item> </animation-list>
使用ImageView设置
android:backgroud
为这个帧动画。在程序中使用
findViewById
找出这个ImageView。(AnimationDrawable)ImageView.getBackground()
选出逐帧动画背景animation.start
启动动画
十四、多媒体应用开发
音频类
- MediaPlayer类播放音频
- SoundPool类播放音频
视频类
-
VideoView
<VideoView android:id="@+id/videovie" android:layout_width="match_parent" android:layout_height="match_parent"> </VideoView>
videoView.setVideoPath();//播放本地视频 videoView.setVideoURI();//加载网络视频 MediaController controller = new MediaController(context);//添加控制器 videoView.start();
-
MediaPlayer结合SuffaceView
<SurfaceView android:id="@+id/surfaceview"> </SurfaceView>
SurfaceView view = (SurfaceView)findViewById(); SurfaceHolder holder = view.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//数据由MediaPlayer提供,SurfaceView自己不缓存 MediaPlayer mediaplayer = new MediaPlayer(); mediaplayer.setAudioStreamType(AudioManage.STREAM_MUSIC);//设置视频声音类型 mediaplayer.setDataSource("视频资源路径");//视频资源路径 mediaplayer.setDisplay(holder);//SuffaceView与MediaPlayer关联 mediaplayer.prepareAsync();//将视频文件解析到内存中 mediaplyaer.start();