Android读书笔记之内容提供者与服务

原创 2018年04月14日 16:10:37

使用内容提供者共享数据:

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()

EGquery()方法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()实现。

实例:IntentServiceService比较

多次启动普通服务,则会引起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...");

}

}

 

 

 

 

 

 


 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36347817/article/details/79941249

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

一:了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。 Activity之间通...
  • HoLee_BK
  • HoLee_BK
  • 2017-03-30 10:53:34
  • 2486

Android四大组件之内容提供者--ContentProvider

1,什么是ContentProvider 2,怎么创建 3,在手机上注册 4,其它应用怎么访问 5,Uri的处理 URI代表要操作的数据,由scheme、authorites、path三部分组成 ...
  • A__17
  • A__17
  • 2015-06-28 12:31:00
  • 1983

android 使用内容提供者获取手机联系人

最近在学习安卓的相关内容, 正好在写获取手机联系人的程序, 就想到了内容提供者, 这里有几点需要注意, 写到这里, 以后方便自己查询。 1. 手机联系人的数据库是存储在 data/data/com....
  • zhyh1435589631
  • zhyh1435589631
  • 2016-02-16 10:17:23
  • 1579

通过内容提供者获取手机上的音乐资源

本篇文章的主要学习内容为:使用内容提供者获取手机中的音乐资源
  • wxw20147854
  • wxw20147854
  • 2017-07-30 01:48:43
  • 592

android_内容提供者和内容解析者_简单入门

ContentProvider 内容提供者一般来说,应用程序创建的数据库只有自己才可以进行读写操作,其他的应用程序不具备这样的权利。但是如果真的想把数据库里面的数据暴露出去,供其他的程序进行CURD操...
  • xdd_lmd
  • xdd_lmd
  • 2016-03-15 15:50:20
  • 1000

内容提供者创建,访问和权限

1.四大组件之一,需要在Androidmanufest.xml中配置 //权限声明
  • u012360634
  • u012360634
  • 2015-04-15 09:36:24
  • 999

android日历代码

  • 2015年03月17日 15:45
  • 514KB
  • 下载

Android内容提供者(一)读取系统联系人

想要读取系统的联系人,必须先获取权限。 1.创建工程ReadContacts,在清单文件中添加读取联系人的权限。2.修改主布局,添加用来显示数据的listview...
  • u014523456
  • u014523456
  • 2016-06-23 13:56:13
  • 354

Android基础笔记(十三)- 内容提供者原理和简单使用

为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信...
  • biezhihua
  • biezhihua
  • 2015-03-17 21:21:56
  • 2330

Android基础笔记(十四)- 内容提供者读取联系人

利用内容提供者读取联系人 利用内容提供者插入联系人 内容观察者的原理 利用内容观察者监听系统应用数据库或者自己应用数据库的变化 利用内容提供者读取联系人读取联系人相对于读取短信来说就复杂很多了,我们一...
  • biezhihua
  • biezhihua
  • 2015-03-18 00:30:35
  • 1789
收藏助手
不良信息举报
您举报文章:Android读书笔记之内容提供者与服务
举报原因:
原因补充:

(最多只允许输入30个字)