【Android开发艺术】ContentProvider进程间通信
前言:
已经开始考虑转Java后端,但是觉得Android毕竟是一门手艺,干脆把书读读然后消化掉。好像一个人多项技能,后端刚学,肯定没法以此作为高薪的突破口。
如果遇到机会,还可以用Android为主,后端为辅,打个漂亮的加分赛。毕竟既懂前端又懂后端还是听起来很厉害的。
也能达到一些触类旁通的效果。
正文:
ContentProvider底层也是Binder。所以用来进行IPC进程间通信非常适合。平时日常编码中很少用到ContentProvider,可能与我是写普通应用的缘故。
温故:
一、 服务端App:
写一个简单的ContentProvider测试demo,用来提供数据。(虽然本例,现在什么也没提供)
public class BookProvider extends ContentProvider {
private static final String TAG = "BookProvider";
public BookProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.e(TAG,"delete,current Thread:Thread.currentThread());
return 0;
}
@Override
public String getType(Uri uri) {
Log.e(TAG,"getType,current Thread:Thread.currentThread());
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.e(TAG,"insert,current Thread:Thread.currentThread());
return null;
}
@Override
public boolean onCreate() {
Log.e(TAG,"onCreate,current Thread:Thread.currentThread());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.e(TAG,"query,current Thread:Thread.currentThread());
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
Log.e(TAG,"update,current Thread:Thread.currentThread());
return 0;
}
}
注释:写一个BookProvider继承自ContentProvider。其中方法实现暂时都通过打日志实现。关键在于如何使外部访问到BookProvider这个服务端进程,在于manifest的使用:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="haibo.com.contentprovider1">
<permission
android:name="haibo.com.PROVIDER"
android:label="provider permission"
android:protectionLevel="normal" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name=".provider.BookProvider"
android:authorities="haibo.com.contentprovider1.book.provider"
android:enabled="true"
android:exported="true"
android:permission="haibo.com.PROVIDER"></provider>
</application>
</manifest>
第28行,exported属性为true,表明可以被其他应用使用当前组件。(四大组件都有该属性)。重点:先注册(第29行)后发布(第6行)权限。
第29行,设置权限为一个自定义字符串(该权限可更细化为读权限和写权限writeP