<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Android IPC機制(四)用ContentProvider進行進程間通信

      前言

      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中也打印出了我們想要的結果,打出了兩條游戲信息: 
      這里寫圖片描述

        

        

      posted on 2018-07-10 11:06  安卓筆記俠  閱讀(430)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 2021av在线| 久久大香萑太香蕉av黄软件| 久热综合在线亚洲精品| 久久久久国色av免费看| 亚洲伊人久久大香线蕉| 国产精品免费视频不卡| 亚洲风情亚aⅴ在线发布| 国产精品不卡一区二区在线| bt天堂新版中文在线| 1区2区3区高清视频| 国产老熟女一区二区三区| 中文字幕av无码不卡| 精品久久久久中文字幕日本| 成人综合人人爽一区二区| 白嫩少妇无套内谢视频| 欧美不卡一区二区三区| 少妇被粗大的猛烈进出69影院一| 亚洲精品一区二区制服| 遂溪县| 亚洲AV无码不卡在线播放| 天天澡日日澡狠狠欧美老妇| 色婷婷日日躁夜夜躁| 日韩人妻一区中文字幕| 中文字幕乱码一区二区免费| 利辛县| 久久99久久99精品免观看| 午夜男女爽爽影院免费视频下载| 久久综合97丁香色香蕉| 亚洲色在线v中文字幕| 漂亮人妻被修理工侵犯| 97精品尹人久久大香线蕉| 亚洲一二三区精品与老人| 97在线视频人妻无码| 成人精品老熟妇一区二区| 秋霞电影院午夜无码免费视频 | 亚洲欧美国产日韩天堂区| 美女胸18下看禁止免费视频| 一区二区三区午夜无码视频| 国产亚洲精品AA片在线爽| 国产三级国产精品久久成人| 国色天香中文字幕在线视频|