使用内容提供者共享数据:
ContentProvider实现数据的共享
所要学习的内容:
内置的内容提供者;
自定义的内容提供者;
Content URI含义。
Android的系统是基于Linux的,文件访问权限控制很严格,不同的用户启动不同的应用。
内置的内容提供者:(当然可以自定义内容提供器)
多媒体音频文件、视频文件、图片、联系人、电话记录、短信访问。
Content URI:(识别寻找内容提供者)
Android平台内容资源定位符,是一种URL,全球唯一
包括:协议名字、权限、路径、id
通过下面Content URI获取系统资源:
联系人、、电话、短信、音视频、图片
实例:访问联系人信息
//创建SimpleCursorAdapter游标适配器对象
simpleCursorAdapter = new SimpleCursorAdapter(
this, R.layout.listitem,
null,//使用CursorLoader不需要游标对象了
new String[]{ContactsContract.Contacts._ID,ContactsContract.Contacts.DISPLAY_NAME},
new int[]{R.id.textview_no, R.id.textview_name},
//游标适配器注册内容监听器,监听游标内容变化
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
创建CursorLoader对象:构造方法API:
CursorLoader(context context, //上下文对象
Uri uri, //内容提供者URI
String [] projection, //要查询的字段名的String数组
String [] selection, //查询条件
String [] selectionArgs, //查询条件的参数
String sortOrder) //排序字段
普通权限和运行时权限(包括Android6.0及其之后)
普通权限:
不会导致危险的操作,只需要在AndroidManifest.xml中注册就可以
AndroidManifest.xml被打包成APK,所以称为安装时授权。
网址:
http://developer.ansroid.com/guide/topics/security/normal-permissions.html
<uses-permission android:name = “android.permission.INTERNET”>
运行时权限:
运行时权限称为危险权限,由用户同意或者在应用中进行设置
网址:
http://developer.ansroid.com/guide/topics/security/normal-permissions.html#normal-dangerous
1.代码ActivityCompat.checkSelfPermission()方法检查是否授权
2.代码ActivityCompat.requestPermissions()方法请求授权
getContentResolver()返回ContentResolve对象(内容提供者的代理对象)
ContentResolver提供对共享数据的insert()/delete()/query()/update()
EG:query()方法API定义如下:
Cursor query(Uri uri,
String [] projection,
String selection,
String selectionArgs,
String sortOrder)
实例:访问电话、短信
必须实现的方法:
//创建CursorLoader时调用
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//创建CursorLoader对象
return new CursorLoader(this, CONTENT_URI, null, null, null, null);
}
//加载数据完成时调用
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
//采用新的游标与老游标交换,老游标不关闭
simpleCursorAdapter.swapCursor(c);
}
//CursorLoader对象被重置时调用
@Override
public void onLoaderReset(Loader<Cursor> loader) {
//采用新的游标与老游标交换,老游标不关闭
simpleCursorAdapter.swapCursor(null);
}
应用不与用户交互,在后台处理任务,并且仍然能运行其他应用。
服务在Android中是一种长生命周期的后台运行组件(无界面)
例子:媒体播放程序:后台运行仍可以播放歌曲
创建服务:
1.编写组件类
2.在AndroidManifest.xml文件注册
1.public class MyService extends Service{
Public IBinder onBind(Intent intent){
}
Public void onCreate(){
}
Public void onDestroy(){
}
Public int onStartCommand(Intent intent ,int flags,int startId){
}
}
注册:
<service
android:name=”.MyService” //name属性名字
android:enabled =”true” //服务是否能被系统实例化
Android:exported=”true”/> //服务能否能够被其他应用启动
注:不要隐式意图启动服务
服务的分类:
启动类型服务:
活动、组件通过startService()启动服务,服务立即处于启动状态
松耦合关系,服务执行单一操作,不将结果返回给调用方
绑定类型服务:
活动、组件通过bindService()绑定服务,服务立即处于“绑定”状态
提供一个C/S接口,能够与服务进行交互、发送请求、返回数据,甚至可以通过进程间的通信跨进程操作
高耦合关系,多个组件可以同时绑定到该服务,全部取消绑定后,该服务会被销毁
启动服务的类型:(活动或者服务,一旦启动服务就不再管服务了,是一种松耦合的关系)
启动服务的生命周期:
两个嵌套循环:
整个生命周期的循环:
通过startService()方法并传递意图对象来启动服务
系统根据意图查找这个服务
系统调用服务的onCreate()
接着是onStartCommand()方法:启动组件数据(意图传递给服务)
开始运行服务后,在其他组件调用stopService()或当前服务调用stopself()
服务销毁时调用onDetory():释放资源
有效生命周期的循环:
在onStartCommand()与onDestroy()调用之间
组件多次启动会调用onStartCommand()
三个方法:
onCreate():第一次创建服务时调用该方法,在onStartCommand()之前
onStartCommand():启动组件调用StartService()请求服务时,系统调用此方法
onDestroy()服务不再使用时,释放资源
实例启动类型服务:
创建启动服务:(extends Service)
注册服务:(略)
启动组件代码:
//启动服务
Intent serviceIntent = new Intent(MainActivity.this,MyService.class);
startService(serviceIntent);
//停止服务
Intent serviceIntent = new Intent(MainActivity.this,MyService.class);
stopService(serviceIntent);
绑定类型服务:
绑定服务生命周期:
整个生命周期的循环:
通过bindService()方法
系统调用服务的onCreate()
接着是onBind()方法:
所有的绑定接触系统调用onUnbind()方法
服务销毁时调用onDetory():释放资源
有效生命周期的循环:
在onBind()与onUnbind()调用之间
四个方法:
onCreate()
onBind():绑定服务成功,系统调用此方法,必须返回IBinder接口类型对象,客户端与服务端的通信
onUnbind():所有客户端通过调用unbindService()解除绑定
onDestroy()
实例:绑定类型服务
创建启动服务:(extends Service)
启动组件代码:
//启动服务
Intent serviceIntent = new Intent(this,BinderService.class);
bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
//停止服务
unbindService(mConnection);
mBound = false;
IntentService:(特殊的服务类)
IntentService优势:
1.创建默认工作线程,用于在主线程之后执行传递给onStartCommand()所有意图
2.创建工作队列,将意图传递给onHandleIntent()方法来实现
3.处理完所有启动请求后自动停止服务,不需要调用stopSelf()方法
4.提供onBind()的默认实现,返回NUll
5.提供了onStartCommand()默认实现
,将意图依次发送到工作队列和onHandleIntent()实现。
实例:IntentService与Service比较
多次启动普通服务,则会引起ANR问题
启动INTENT服务则不会出现
普通服务:
public class MyService extends Service {
private static String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.v(TAG, "调用onCreate...");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG, "调用onStartCommand... startId = " + startId);
synchronized (this) {
try {
wait(5 * 1000);
stopSelf();
} catch (Exception e) {
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.v(TAG, "调用onDestroy...");
}
}
INTENT服务:
public class MyIntentService extends IntentService {
private static String TAG = "MyIntentService";
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {//不是主线程,不会ANR
Log.v(TAG, "调用onHandleIntent...");
synchronized (this) {
try {
wait(5 * 1000);
} catch (Exception e) {
}
}
}
@Override
public void onDestroy() {//不需要重写
super.onDestroy();
Log.v(TAG, "调用onDestroy...");
}
}