通信方式 | 特点 | 适用场景 |
---|---|---|
BroadcastReceiver | 通过广播意图(Intent)传递数据,支持系统内或跨应用广播 | 事件通知、系统级消息(如网络状态变化) |
ContentProvider | 提供统一数据访问接口,支持跨应用共享数据(如联系人、文件) | 数据共享、跨应用数据操作 |
AIDL | Android 接口定义语言,支持进程间双向通信,需配合 Binder 机制 | 复杂数据交互、需要调用对方方法的场景 |
Socket | 基于网络协议(TCP/UDP)的通信,需手动处理线程和数据序列化 | 实时数据传输、长连接通信 |
工具/框架 | 特点 | 适用场景 |
---|---|---|
EventBus/RxBus | 事件订阅发布模式,简化组件间通信(需依赖库) | 事件驱动、解耦模块间的直接调用 |
SharedPreferences | 轻量级键值存储,仅支持简单数据类型(跨应用需相同签名和权限) | 配置共享、简单状态同步 |
静态注册:在 AndroidManifest.xml
中声明接收器,可接收系统广播或指定应用的广播。
动态注册:在代码中通过 registerReceiver()
注册,需手动取消注册。
示例:
// 发送广播 Intent intent = new Intent("com.example.CUSTOM_ACTION"); intent.putExtra("data", "message"); sendBroadcast(intent); // 接收广播 public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); // 处理数据 } }
定义Provider:继承 ContentProvider
并实现 query/insert/update/delete
方法。
权限控制:需在 AndroidManifest.xml
中声明 provider
的读写权限。
示例:
// 定义Provider @Override public Cursor query(Uri uri, String[] projection, Bundle extras) { // 返回数据游标 } // 访问Provider ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://com.example.provider"); Cursor cursor = resolver.query(uri, null, null, null, null);
步骤:
.aidl
接口文件。Service
并处理客户端请求。示例:
// IMyAidlInterface.aidl interface IMyAidlInterface { String getData(String input); } // Service端实现 public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return new MyAidlImpl(); } private class MyAidlImpl extends IMyAidlInterface.Stub { @Override public String getData(String input) { return "Processed: " + input; } } }
<uses-permission>
(如 INTERNET
、READ_CONTACTS
)。android:exported="true"
并定义权限。解答:
推荐使用 Socket 或 WebSocket 结合服务端中转:
解答: