我想将数据从应用程序A发送到应用程序B.我可以使用两种方法来解决这个问题。
一种方法是使用startService()
。我将数据放入Intent
,通过startService()
发送数据。应用程序B获取数据并将其写入数据库。
第二种方法是使用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;
}
答案 0 :(得分:2)
由于您要发送大量数据,我建议您在数据所在的应用程序A中实现ContentProvider,并在应用程序B中使用ContentResolver随时访问数据。
或者,您可以使用Intent捆绑并发送所有必需的数据,但是您必须确保捆绑了所有数据字段而没有遗漏任何内容 - 这对于询问aPriori来说可能有点太多了。
因此,看起来ContentProvider可能是更好的解决方案。
感谢。
答案 1 :(得分:0)
要共享持久数据,内容提供商是其他应用程序未来可能使用的一个不错的选择。例如联系人。它更有条理。如果您不打算让其他应用程序使用此数据,那么我会使用该服务,因为它可能会减少开销。