在安卓开发中,两个 app 进行通信可以采用多种方式,下面我将介绍其中两种常用的方式。
一、使用广播
广播是 Android 中一种广泛运用的机制,它可以在不同应用程序之间进行通信。通过广播传递数据时需要分为两个部分:发送广播和接收广播。
1. 发送广播:
- 创建一个 Intent 对象;
- 使用 sendBroadcast() 或 sendOrderedBroadcast() 方法发送广播。
代码示例:
```
Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_BROADCAST");
intent.putExtra("data", "hello world");
sendBroadcast(intent);
```
2. 接收广播:
- 创建一个 BroadcastReceiver 的子类;
- 实现 onReceive() 方法;
- 通过 registerReceiver() 注册 BroadcastReceiver。
代码示例:
```
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.d(TAG, "接收到广播,数据:" + data);
}
}
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.broadcast.MY_BROADCAST");
registerReceiver(receiver, filter);
```
二、使用 ContentProvider
ContentProvider 可以将一个应用程序的数据提供给其他应用程序使用。其他应用程序可以查询 ContentProvider 中的数据,也可以向 ContentProvider 中添加、修改和删除数据。
1. 创建 ContentProvider:
- 继承 ContentProvider 类;
- 实现 query()、insert()、update()、delete() 和 getType() 方法。
代码示例:
```
public class MyProvider extends ContentProvider {
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
static {
URI_MATCHER.addURI("com.example.provider", "books", 1);
}
private MyDatabaseHelper dbHelper; // 数据库辅助类对象
@Override
public boolean onCreate() {
dbHelper = new MyDatabaseHelper(getContext(), "bookstore.db", null, 1);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
switch (URI_MATCHER.match(uri)) {
case 1:
cursor = db.query("Book", projection, selection,
selectionArgs, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
switch (URI_MATCHER.match(uri)) {
case 1:
db.insert("Book", null, values);
break;
default:
break;
}
return uri;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updatedRows = 0;
switch (URI_MATCHER.match(uri)) {
case 1:
updatedRows = db.update("Book", values, selection, selectionArgs);
break;
default:
break;
}
return updatedRows;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deletedRows = 0;
switch (URI_MATCHER.match(uri)) {
case 1:
deletedRows = db.delete("Book", selection, selectionArgs);
break;
default:
break;
}
return deletedRows;
}
@Override
public String getType(Uri uri) {
return null;
}
}
```
2. 使用 ContentProvider:
- 通过 getContentResolver() 获取 ContentResolver 对象;
- 使用 ContentResolver 对象提供的方法查询、插入、修改和删除数据。
代码示例:
```
ContentResolver resolver = getContentResolver();
// 查询数据
Uri uri = Uri.parse("content://com.example.provider/books");
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
Log.d(TAG, "书名:" + name + ",作者:" + author);
}
cursor.close();
}
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "Android 开发艺术探索");
values.put("author", "任玉刚");
uri = Uri.parse("content://com.example.provider/books");
resolver.insert(uri, values);
// 修改数据
values = new ContentValues();
values.put("price", 29.8);
uri = Uri.parse("content://com.example.provider/books");
resolver.update(uri, values, "name = ?", new String[]{"Android 开发艺术探索"});
// 删除数据
uri = Uri.parse("content://com.example.provider/books");
resolver.delete(uri, "name = ?", new String[]{"Android 开发艺术探索"});
```
以上就是两个安卓应用程序进行通信的原理和详细介绍,希望能对你有所帮助。