アプリケーション 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;
}