1

アプリケーション A からアプリケーション B にデータを送信したいと考えています。これには 2 つの方法があります。

1 つの方法は、 を使用することstartService()です。データを に入れ、Intentを介してstartService()データを送信します。アプリケーション B はデータを取得し、データベースに書き込みます。

2 番目の方法は、a を使用しContentProviderてデータをアプリケーション B のデータベースに書き込むことです。送信するデータが非常に多いため、子スレッドを使用してデータを書き込みます。

それらはすべて正常に動作します。どちらの方法が優れているかを判断するのを手伝ってください。

インテントメソッド:

private ExecutorService mSingleThreadExecutor = Executors.newSingleThreadExecutor();

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG,
            "onStartCommand  #" + this.toString() + "  #"
                    + intent.getIntExtra(EXTRA_APP_CODE, -1) + "  #"
                    + SystemClock.elapsedRealtime());

    recordDataOfIntent(intent);
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
    super.onCreate();
}

private void recordDataOfIntent(Intent intent) {
    int dataType = intent.getIntExtra(EXTRA_DATA_TYPE, -1);
    switch (dataType) {
        case DataConstants.APP_START: {
            mSingleThreadExecutor.execute(getRecordAppStartRunnable(intent));
            break;
        }
        case DataConstants.USER_ACTION: {
            mSingleThreadExecutor.execute(getRecordUserActionRunnable(intent));
            break;
        }
        case DataConstants.PAGE_VISIT: {
            mSingleThreadExecutor.execute(getRecordPageVisitRunnable(intent));
            break;
        }
        case DataConstants.EVENT: {
            mSingleThreadExecutor.execute(getRecordEventRunnable(intent));
            break;
        }
        case DataConstants.KV_EVENT: {
            mSingleThreadExecutor.execute(getRecordKVEventRunnable(intent));
            break;
        }
        case DataConstants.EXCEPTION: {
            mSingleThreadExecutor.execute(getRecordExceptionRunnable(intent));
            break;
        }
        default: {
            break;
        }
    }
}

ContentProvider メソッド:

    private ExecutorService mSingleThreadExecutor = Executors.newSingleThreadExecutor();

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
    return 0;
}

@Override
public String getType(Uri arg0) {
    int option = mUriMatcher.match(arg0);
    switch (option) {
        case URI_TABLE_EVENT_CODE: {
            return URI_TABLE_EVENT_TYPE;
        }
        default: {
            throw new IllegalArgumentException("Unknown URI: " + arg0);
        }
    }
}

@Override
public Uri insert(Uri arg0, final ContentValues arg1) {
    Log.e(TAG, "insert");
    int option = mUriMatcher.match(arg0);
    switch (option) {
        case URI_TABLE_EVENT_CODE: {
            Runnable runnable = new Runnable() {

                @Override
                public void run() {
                    DBUtil.addKVEventInfo(mDatabase, arg1);                     
                }
            };

            mSingleThreadExecutor.execute(runnable);

            break;
        }
        default: {
            break;
        }
    }
    return getEventTableUri();
}

@Override
public boolean onCreate() {
    Log.e(TAG, "onCreate");
    mDatabase = DBUtil.initDatabase(getContext());
    mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    mUriMatcher.addURI(AUTHORITY, TABLE_EVENT, URI_TABLE_EVENT_CODE);
    return true;
}
4

2 に答える 2

2

送信するデータが非常に多いため、データが存在するアプリケーション A に ContentProvider を実装し、アプリケーション B で ContentResolver を使用して、必要なときにいつでもデータにアクセスすることをお勧めします。

別の方法として、インテントを使用して必要なすべてのデータをバンドルして送信することもできますが、何も欠落することなくすべてのデータ フィールドをバンドルしたことを確認する必要があります。

したがって、 ContentProvider がより良い解決策になるようです。

ありがとう。

于 2013-10-16T03:30:41.530 に答える