使用ContentProvider或Intent将数据从应用程序发送到其他应用程序?

时间:2013-10-16 02:49:51

标签: android android-intent android-contentprovider

我想将数据从应用程序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;
}

2 个答案:

答案 0 :(得分:2)

由于您要发送大量数据,我建议您在数据所在的应用程序A中实现ContentProvider,并在应用程序B中使用ContentResolver随时访问数据。

或者,您可以使用Intent捆绑并发送所有必需的数据,但是您必须确保捆绑了所有数据字段而没有遗漏任何内容 - 这对于询问aPriori来说可能有点太多了。

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

感谢。

答案 1 :(得分:0)

要共享持久数据,内容提供商是其他应用程序未来可能使用的一个不错的选择。例如联系人。它更有条理。如果您不打算让其他应用程序使用此数据,那么我会使用该服务,因为它可能会减少开销。