1

我想将数据从应用程序 A 发送到应用程序 B。我可以使用两种方法来解决这个问题。

一种方法是使用startService(). 我把数据放入一个Intent,通过startService()发送数据。应用程序 B 获取数据并将其写入数据库。

第二种方法是使用aContentProvider将数据写入应用程序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;
        }
    }
}

内容提供者方法:

    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 随时访问数据。

或者,您可以使用 Intent 捆绑和发送所有必需的数据,但您必须确保您已经捆绑了所有数据字段而不会丢失任何内容 - 这对于 aPriori 来说可能有点过分。

因此,看起来 ContentProvider 可能是您更好的解决方案。

谢谢。

于 2013-10-16T03:30:41.530 回答
0

为了共享持久数据,内容提供者对于其他应用程序将来可能使用的东西来说是一个不错的选择。例如联系人。它更有条理。如果您不打算让其他应用程序使用这些数据,那么我会选择该服务,因为它的开销可能会更少。

于 2013-10-16T03:46:42.243 回答