接前五篇
基础篇
bundle篇
文件共享篇
Messenger篇
AIDL篇
ContentProvider是Android提供的专用于不同应用间进行数据共享的一种方式,天然适合进程间通信。底层同样是通过Binder实现,但是因为Android系统已经帮我们进行了封装,因此使用起来很简单
Android系统内置了许多ContentProvider,常用的是通讯录、日程表等,我们只需要通过insert、delete、update、query方法就可以完成
本篇我们来用ContentProvider实现进程间通信
1、创建一个MyContentProvider继承自ContentProvider,并实现onCreate,getType,query,insert,delete,update这6个方法
其中OnCreate顾名思义就是做一些初始化的工作,getType是来返回一个Uri所对应的MIME类型,比如图片、视频,较为复杂,如果用不到这个方法时返回nul即可,剩下的query,insert,delete,update是实现增删改查。这6个方法中,只有OnCreate运行在主线程,其他都在Binder线程池中
public class MyContentProvider extends ContentProvider {
private static final String TAG = "MyContentProvider";
@Override
public boolean onCreate() {
Log.d(TAG,"onCreate, current Thread:" + Thread.currentThread().getName());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Log.d(TAG,"query, current Thread:" + Thread.currentThread().getName());
return null;
}
@Override
public String getType(Uri uri) {
Log.d(TAG,"getType, current Thread:" + Thread.currentThread().getName());
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.d(TAG,"insert, current Thread:" + Thread.currentThread().getName());
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.d(TAG,"delete, current Thread:" + Thread.currentThread().getName());
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.d(TAG,"update, current Thread:" + Thread.currentThread().getName());
return 0;
}
}
2、在manifest文件中注册MyContentProvider
android:authorities是ContentProvider的唯一标识,外部应用通过这个标识访问我们的MyContentProvider;android:permission表示外部应用想要用我们的MyContentProvider就必须声明这个权限;
<provider
android:authorities="com.practise.contentprovider.mycontentprovider"
android:name=".MyContentProvider"
android:process=":provider"
android:permission="com.practise.PROVIDER">
</provider>
3、现在就可以访问MyContentProvider了,我们来用一个Activity访问它
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);