安卓高级应用多媒体和Service.docx

上传人:b****8 文档编号:10447089 上传时间:2023-02-11 格式:DOCX 页数:117 大小:532.53KB
下载 相关 举报
安卓高级应用多媒体和Service.docx_第1页
第1页 / 共117页
安卓高级应用多媒体和Service.docx_第2页
第2页 / 共117页
安卓高级应用多媒体和Service.docx_第3页
第3页 / 共117页
安卓高级应用多媒体和Service.docx_第4页
第4页 / 共117页
安卓高级应用多媒体和Service.docx_第5页
第5页 / 共117页
点击查看更多>>
下载资源
资源描述

安卓高级应用多媒体和Service.docx

《安卓高级应用多媒体和Service.docx》由会员分享,可在线阅读,更多相关《安卓高级应用多媒体和Service.docx(117页珍藏版)》请在冰豆网上搜索。

安卓高级应用多媒体和Service.docx

安卓高级应用多媒体和Service

第六章安卓高级应用

在Android中,熟练使用4大组件,对理解Andriod程序,开发高级功能有着至关重要的作用。

本章将会逐一讲解Activity以外的3大组件:

ContentProvider,BroadcastReceiver和Service的原理及应用,并且介绍以它们为基础开发的多媒体和电话短信等系统应用。

6.1ContentProvider

6.1.1ContentProvider简介

ContentProvider是Android的四大组件之一,用于保存和检索数据,是Android系统中不同应用程序之间共享数据的接口。

Android系统中对一些常见的公用数据提供了ContentProvider接口,例如视频,音频,图像,个人通信信息等,都定义在android.provider包下。

若开发着想将自己的程序的数据公开给其他应用程序使用,有两种方法:

一种是定义自己的ContentProvider子类,另一种是将当前的数据添加到已有的ContentProvider中,我们下面主要讨论第一种情况。

6.1.2使用ContentProvider

实现通过ContentProvider对外共享数据,需要2个步骤:

1)继承ContentProvider并重写下面方法

publicclassMyProviderextendsContentProvider{

publicbooleanonCreate(){}

publicUriinsert(Uriuri,ContentValuesvalues){}

publicintdelete(Uriuri,Stringselection,String[]selectionArgs){}

publicintupdate(Uriuri,ContentValuesvalues,Stringselection,

String[]selectionArgs){}

publicCursorquery(Uriuri,String[]projection,Stringselection,

String[]selectionArgs,StringsortOrder){}

publicStringgetType(Uriuri){}

}

这其中除了常用的增删改查方法外,onCreate方法用于启动时初始化ContentProvider,getType方法用于返回Uri指定的ContentProvider中的数据的MIME类型。

2)在Manifest文件中注册Provider

android:

authorities="com.spl.myprovider"

android:

name="spl.db.contentprovider.MyProvider"/>

为了能让其他应用找到该ContentProvider,ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站,authorities就是他的域名。

URI介绍

ContentProvider通过URI来共享数据。

URI是一个通用资源标识符,它的构成如图6-1所示:

图6-1URI的组成

从上图可见,一般URI由4部分构成:

1)sheme:

无法改变的标准前缀

2)主机名或authority:

ContentProvider的唯一标示,在Manifes中声明

3)路径:

可以理解为要操作的数据中表的名字

4)ID:

需要获取的记录的ID,如果没有则表示返回全部记录

UriMatcher

Android系统提供了UriMatcher类来对URI进行匹配。

使用步骤如下:

1)首先创建UriMatcher类

2)然后通过addURI方法增加需要匹配的路径,并给每个路径标记一个匹配码

3)最后通过match方法进行匹配,返回匹配码

代码片段如下:

privatestaticUriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);

privatestaticfinalintCONTACTS=1;//匹配码1

privatestaticfinalintCONTACT=2;//匹配码2

privatestaticfinalStringTABLENAME="person";

static{

matcher.addURI("com.spl.myprovider","person",CONTACTS);

matcher.addURI("com.spl.myprovider","person/#",CONTACT);

}

@Override

publicintdelete(Uriuri,Stringselection,String[]selectionArgs){

switch(matcher.match(uri)){

caseCONTACTS:

//执行相应操作

caseCONTACT:

//执行相应操作

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

上面代码中出现的“#”为通配符,代表任意数字,另外还可以使用通配符“*”来代表任意文本。

ContentResolver介绍

其他应用程序要想访问ContentProvider中的数据,就需要通过ContentResolver对象。

ContantResolver提供的方法和ContentProvider相对应,也有增删改查这4个方法。

每个Activity都有一个ContentResolver对象,可以通过getContentResolver方法获取到。

下面的实例展示了如何使用ContentProvider共享数据,以及如何让其他应用获取到ContentProvider中的数据。

该实例有两个应用组成:

第1个应用SQLiteDemo本质上是一个数据库应用,它维护一个数据表person,并通过MyProvider类对外共享了这张表的数据;第2个应用ContentResolverDemo只包含一个Activity,通过ContentResolver来访问person表中的数据。

SQLiteDemo中的MyProvider.java的代码如下:

packagespl.db.contentprovider;

importspl.db.DBHelper;

importandroid.content.ContentProvider;

importandroid.content.ContentUris;

importandroid.content.ContentValues;

importandroid.database.Cursor;

importandroid.database.sqlite.SQLiteDatabase;

import.Uri;

importandroid.content.UriMatcher;

publicclassMyProviderextendsContentProvider{

privateDBHelperhelper;

privatestaticUriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);

privatestaticfinalintCONTACTS=1;//匹配码1

privatestaticfinalintCONTACT=2;//匹配码2

privatestaticfinalStringTABLENAME="person";

static{

matcher.addURI("com.spl.myprovider","person",CONTACTS);

matcher.addURI("com.spl.myprovider","person/#",CONTACT);

}

@Override

publicbooleanonCreate(){

helper=newDBHelper(getContext());

returntrue;

}

@Override

publicUriinsert(Uriuri,ContentValuesvalues){

SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();

switch(matcher.match(uri)){

caseCONTACTS:

longid=sqLiteDatabase.insert(TABLENAME,"name",values);

UriinsertUri=ContentUris.withAppendedId(uri,id);

returninsertUri;

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

@Override

publicintdelete(Uriuri,Stringselection,String[]selectionArgs){

SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();

introwNum=0;

switch(matcher.match(uri)){

caseCONTACTS:

rowNum=sqLiteDatabase.delete(TABLENAME,selection,selectionArgs);

returnrowNum;

caseCONTACT:

longid=ContentUris.parseId(uri);

StringwhereClause="_id="+id;

if(selection!

=null){

whereClause+="and"+selection;

}

rowNum=sqLiteDatabase.delete(TABLENAME,whereClause,selectionArgs);

returnrowNum;

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

@Override

publicintupdate(Uriuri,ContentValuesvalues,Stringselection,

String[]selectionArgs){

SQLiteDatabasesqLiteDatabase=helper.getWritableDatabase();

introwNum=0;

switch(matcher.match(uri)){

caseCONTACTS:

rowNum=sqLiteDatabase.update(TABLENAME,values,selection,selectionArgs);

returnrowNum;

caseCONTACT:

longid=ContentUris.parseId(uri);

StringwhereClause="_id="+id;

if(selection!

=null){

whereClause+="and"+selection;

}

rowNum=sqLiteDatabase.update(TABLENAME,values,whereClause,selectionArgs);

returnrowNum;

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

@Override

publicCursorquery(Uriuri,String[]projection,Stringselection,

String[]selectionArgs,StringsortOrder){

SQLiteDatabasedb=helper.getReadableDatabase();

switch(matcher.match(uri)){

caseCONTACTS:

returndb.query(TABLENAME,projection,selection,selectionArgs,null,null,sortOrder);

caseCONTACT:

longid=ContentUris.parseId(uri);

StringwhereClause="_id="+id;

if(selection!

=null){

whereClause+="and"+selection;

}

returndb.query(TABLENAME,projection,whereClause,selectionArgs,null,null,sortOrder);

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

@Override

publicStringgetType(Uriuri){

switch(matcher.match(uri)){

caseCONTACTS:

return"vnd.android.cursor.dir/person";

caseCONTACT:

return"vnd.android.cursor.item/person";

default:

thrownewIllegalArgumentException("URI"+uri+"无法解析!

");

}

}

}

SQLiteDemo中的DBHelper.java的代码如下:

packagespl.db;

importandroid.content.Context;

importandroid.database.sqlite.SQLiteDatabase;

importandroid.database.sqlite.SQLiteOpenHelper;

publicclassDBHelperextendsSQLiteOpenHelper{

privatestaticfinalStringDATABASE_NAME="contactinfo.db";

privatestaticfinalintVERSION=1;

publicDBHelper(Contextcontext){

super(context,DATABASE_NAME,null,VERSION);

//TODOAuto-generatedconstructorstub

}

@Override

publicvoidonCreate(SQLiteDatabasedb){

//TODOAuto-generatedmethodstub

db.execSQL("CREATETABLEperson(_idINTEGERPRIMARYKEYautoincrement,namevarchar(20),ageINTEGER)");

}

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

//TODOAuto-generatedmethodstub

}

}

SQLiteDemo的Manifest文件中有关Provider注册的代码如下:

android:

authorities="com.spl.myprovider"

android:

name="spl.db.contentprovider.MyProvider"/>

ContentResolverDemo中的主Activity代码如下

package.jbit.activity;

importandroid.app.Activity;

importandroid.content.ContentResolver;

importandroid.content.ContentUris;

importandroid.content.ContentValues;

importandroid.database.Cursor;

import.Uri;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.ListView;

importandroid.widget.SimpleCursorAdapter;

publicclassResolverActivityextendsActivity{

/**Calledwhentheactivityisfirstcreated.*/

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

publicvoidBtnOnClick(Viewview){

ContentResolverresolver=this.getContentResolver();

Uriuri=Uri.parse("content:

//com.spl.myprovider/person");

switch(view.getId()){

//增加一条记录

caseR.id.button1:

{

ContentValuesvalues=newContentValues();

values.put("name","lilei");

values.put("age","13");

resolver.insert(uri,values);

break;

}

//删除一条记录

caseR.id.button2:

{

UrideleteIdUri=ContentUris.withAppendedId(uri,11);

resolver.delete(deleteIdUri,null,null);

break;

}

//修改一条记录

caseR.id.button3:

{

ContentValuesvalues=newContentValues();

values.put("name","wanggang");

UriupdateUri=ContentUris.withAppendedId(uri,5);

resolver.update(updateUri,values,null,null);

break;

}

//查询并显示所有记录

caseR.id.button4:

{

Cursorcursor=resolver.query(uri,null,null,null,null);

SimpleCursorAdapteradapter=newSimpleCursorAdapter(

this,

R.layout.dataview_layout,

cursor,

newString[]{"_id","name","age"},

newint[]{R.id.contact_id,R.id.contact_name,R.id.contact_age});

ListViewlistView=(ListView)findViewById(R.id.listView1);

listView.setAdapter(adapter);

break;

}

}

}

}

ContentResolverDemo中的main.xml代码如下

xmlversion="1.0"encoding="utf-8"?

>

android="

android:

orientation="vertical"

android:

layout_width="fill_parent"

android:

layout_height="fill_parent"

android:

background="#9e9e9e">

android:

id="@+id/button1"

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="增加一条记录"android:

textSize="20sp"android:

onClick="BtnOnClick"/>

android:

id="@+id/button2"

android:

layout_width="match_parent"

android:

layout_height="wrap_content"

android:

text="删除一条记录"android:

textSize="20sp"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1