Android IPC机制(四)用ContentProvider进行进…
2018-07-11 03:31:16来源:博客园 阅读 ()
前言
ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的。ContentProvider底层实现也是Binder,但是使用起来比AIDL要容易许多。系统也预制了很多的ContentProvider,例如通讯录,音视频等,这些操作本身就是跨进程进行通信。这篇文章主要是我们来自己实现用ContentProvider来进行进程间通信,而非介绍ContentProvider怎么使用。
1. 建立数据库,方便ContentProvider使用
我们创建数据库,并创建表”game_provider.db”,里面有两个字段分别存储游戏的名字和游戏的描述。(DbOpenHelper.java)
public class DbOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME="game_provider.db"; static final String GAME_TABLE_NAME="game"; private static final int DB_VERSION=1; private String CREATE_GAME_TABLE="create table if not exists " + GAME_TABLE_NAME +"(_id integer primary key," + "name TEXT, "+"describe TEXT)"; public DbOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_GAME_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
2. 使用ContentProvider对数据库进行操作
在initProvoder方法中,我们开启线程来对数据库进行操作,删除表的所有数据,再添加数据,并实现了query和insert方法。(GameProvider.java)
import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class GameProvider extends ContentProvider { public static final String AUTHORITY = "com.example.liuwangshu.mooncontentprovide.GameProvider"; public static final Uri GAME_CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/game"); private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private SQLiteDatabase mDb; private Context mContext; private String table; static { mUriMatcher.addURI(AUTHORITY, "game", 0); } @Override public boolean onCreate() { table = DbOpenHelper.GAME_TABLE_NAME; mContext = getContext(); initProvoder(); return false; } private void initProvoder() { mDb = new DbOpenHelper(mContext).getWritableDatabase(); new Thread(new Runnable() { @Override public void run() { mDb.execSQL("delete from " + DbOpenHelper.GAME_TABLE_NAME); mDb.execSQL("insert into game values(1,'九阴真经ol','最好玩的武侠网游');"); } }).start(); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String table = DbOpenHelper.GAME_TABLE_NAME; Cursor mCursor = mDb.query(table, projection, selection, selectionArgs, null, sortOrder, null); return mCursor; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { mDb.insert(table, null, values); mContext.getContentResolver().notifyChange(uri, null); return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
在manifest文件中,我们要让ContentProvider运行在另一个进程
<provider android:authorities="com.example.liuwangshu.mooncontentprovide.GameProvider" android:name=".GameProvider" android:process=":provider" ></provider>
3. 在Activity中调用另一个进程的GameProvider的方法
在Activity中我们在GameProvider再插入一条数据(此前GameProvider初始化时已经插入了一条数据),然后调用GameProvider的query方法来查询数据库中有几条数据并打印出来。
import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class ContentProviderActivity extends AppCompatActivity { private final static String TAG = "ContentProviderActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_content_provider); Uri uri = Uri.parse("content://com.example.liuwangshu.mooncontentprovide.GameProvider"); ContentValues mContentValues = new ContentValues(); mContentValues.put("_id", 2); mContentValues.put("name", "大航海时代ol"); mContentValues.put("describe", "最好玩的航海网游"); getContentResolver().insert(uri, mContentValues); Cursor gameCursor = getContentResolver().query(uri, new String[]{"name", "describe"}, null, null, null); while (gameCursor.moveToNext()) { Game mGame = new Game(gameCursor.getString(0), gameCursor.getString(1)); Log.i(TAG, mGame.gameName + "---" + mGame.gameDescribe); } } }
Game.java
public class Game implements Parcelable { public String gameName; public String gameDescribe; public Game(String gameName, String gameDescribe) { this.gameName = gameName; this.gameDescribe = gameDescribe; } protected Game(Parcel in) { gameName = in.readString(); gameDescribe = in.readString(); } public static final Creator<Game> CREATOR = new Creator<Game>() { @Override public Game createFromParcel(Parcel in) { return new Game(in); } @Override public Game[] newArray(int size) { return new Game[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(gameName); dest.writeString(gameDescribe); } }
我们运行程序,发现GameProvider运行在另一个进程
log中也打印出了我们想要的结果,打出了两条游戏信息:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:01-JVM内存模型:程序计数器
下一篇:MyBatis动态创建表
- 数据源管理 | Kafka集群环境搭建,消息存储机制详解 2020-06-11
- 深入浅出 Java 类加载机制! 2020-06-05
- Java连载120-反射机制获取构造方法和父类、父接口 2020-06-05
- CGLIB动态代理机制,各个方面都有写到 2020-06-04
- Java 从入门到精通-反射机制 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash