当前位置: 首页 > news >正文

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一、Service 服务:

一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。

比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。

Service使用步骤如下

   1>继承service类
   2>AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置<service name=".SMSService"/>

服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务

通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()–>onStart(),如果服务已经启动再次调用只会触发onStart()方法

使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()–>onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()–>onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()–>onDestory();

二、Content Provider内容提供者

android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,

其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),

只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中

它的好处:统一数据访问方式。
android系统自带的内容提供者(顶级的表示数据库名,非顶级的都是表名)这些内容提供者在SDK文档的android.provider Java包中都有介绍。见:http://developer.android.com/reference/android/provider/package-summary.html

├────Browser

├────CallLog

├────Contacts

│ ├────Groups

│ ├────People

│ ├────Phones

│ └────Photos

├────Images

│ └────Thumbnails

├────MediaStore

│ ├────Albums

│ ├────Artists

│ ├────Audio

│ ├────Genres

│ └────Playlists

├────Settings

└────Video

CallLog:地址和接收到的电话信息

Contact.People.Phones:存储电话号码

Setting.System:系统设置和偏好设置

使用Content Provider对外共享数据的步骤

1>继承ContentProvider类并根据需求重写以下方法:

public boolean onCreate();//处理初始化操作

       /**
        * 插入数据到内容提供者(允许其他应用向你的应用中插入数据时重写)
        * @param uri
        * @param initialValues 插入的数据
        * @return
        */
       public Uri insert(Uri uri, ContentValues initialValues);

       /**
        * 从内容提供者中删除数据(允许其他应用删除你应用的数据时重写)
        * @param uri
        * @param selection 条件语句
        * @param selectionArgs 参数
        * @return
        */
       public int delete(Uri uri, String selection, String[] selectionArgs);

       /**
        * 更新内容提供者已存在的数据(允许其他应用更新你应用的数据时重写)
        * @param uri
        * @param values 更新的数据
        * @param selection 条件语句
        * @param selectionArgs 参数
        * @return
        */
       public int update(Uri uri, ContentValues values, String selection,
                     String[] selectionArgs);

       /**
        * 返回数据给调用者(允许其他应用从你的应用中获取数据时重写)
        * @param uri
        * @param projection 列名
        * @param selection 条件语句
        * @param selectionArgs 参数
        * @param sortOrder 排序
        * @return
        */
       public Cursor query(Uri uri, String[] projection, String selection,
                     String[] selectionArgs, String sortOrder) ;         

       /**
        * 用于返回当前Uri所代表数据的MIME类型
        * 如果操作的数据为集合类型(多条数据),那么返回的类型字符串应该为vnd.android.cursor.dir/开头
        * 例如要得到所有person记录的Uri为content://com.bravestarr.provider.personprovider/person,
     *   那么返回的MIME类型字符串应该为"vnd.android.cursor.dir/person"
        * 如果操作的数据为单一数据,那么返回的类型字符串应该为vnd.android.cursor.item/开头
        * 例如要得到id为10的person记录的Uri为content://com.bravestarr.provider.personprovider/person/10,
     *   那么返回的MIME类型字符串应该为"vnd.android.cursor.item/person"
        * @param uri
        */
       public String getType(Uri uri)

这些方法中的Uri参数,得到后需要进行解析然后做对应处理,Uri表示要操作的数据,包含两部分信息:

   1.需要操作的contentprovider

   2.对contentprovider中的什么数据进行操作,一个Uri格式:结构头://authorities(域名)/路径(要操作的数据,根据业务而定)

          content://com.bravestarr.provider.personprovider/person/10

说明:contentprovider的结构头已经由android规定为content://

authorities用于唯一标识这个contentprovider程序,外部调用者可以根据这个找到他

路径表示我们要操作的数据,路径的构建根据业务而定.路径格式如下:

   要操作person表行号为10的记录,可以这样构建/person/10

   要操作person表的所有记录,可以这样构建/person

2>在AndroidManifest.xml中使用对ContentProvider进行配置注册(内容提供者注册它自己就像网站注册域名),ContentProvider采用authoritie(原意授权,可理解为域名)作为唯一标识,方便其他应用能找到

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <!-- authorities属性命名建议:公司名.provider.SomeProvider-->
        <provider android:name=".PersonProvider" android:authorities="com.bravestarr.provider.personprovider"/>
         ...
</application>

相关文章:

  • Android四大基本组件(3)之四大组件总结
  • Android 使用Gson解析json案例详解
  • 网络加载数据和解析JSON格式数据案例之空气质量监测应用
  • Android抽屉菜单DrawerLayout的实现案例
  • 进程注入的学习(中)
  • Android程序之全国天气预报查询(聚合数据开发)
  • 什么时候用webserver,什么时候用一般处理文件
  • Android注册短信验证码功能
  • Android程序解析XML文件的方法及使用PULL解析XML案例
  • 西安Uber优步司机奖励政策(12月21日-12.27日)
  • Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台
  • Ubuntu下hadoop2.4搭建集群(单机模式)
  • 如何获取Android项目的VersionName的getPackageManager()
  • Android实现在线更新的过程案例
  • phpMyAdmin 手动输入数据库服务器IP
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • “大数据应用场景”之隔壁老王(连载四)
  • Android框架之Volley
  • Apache Zeppelin在Apache Trafodion上的可视化
  • happypack两次报错的问题
  • js作用域和this的理解
  • Linux gpio口使用方法
  • MobX
  • nginx 配置多 域名 + 多 https
  • Python十分钟制作属于你自己的个性logo
  • 聚类分析——Kmeans
  • 理清楚Vue的结构
  • 嵌入式文件系统
  • 深度学习中的信息论知识详解
  • 一文看透浏览器架构
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Nginx实现动静分离
  • ​Linux·i2c驱动架构​
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (6)添加vue-cookie
  • (AngularJS)Angular 控制器之间通信初探
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)winform之ListView
  • (转)母版页和相对路径
  • (转)平衡树
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net Stream篇(六)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET开发者必备的11款免费工具
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @ResponseBody
  • @synthesize和@dynamic分别有什么作用?
  • [.net]官方水晶报表的使用以演示下载
  • []T 还是 []*T, 这是一个问题
  • [1] 平面(Plane)图形的生成算法
  • [20150321]索引空块的问题.txt
  • [android] 练习PopupWindow实现对话框