Android应用程序(APP)之间的通信对于构建复杂的应用程序来说是必不可少的。这篇文章将介绍Android中两个APP之间通信的常用方法,并提供相关的代码示例。

1. 广播(Broadcast)

广播是一种在Android中常用的跨应用程序通信方式。一个应用程序可以发送广播,而其他应用程序可以注册接收该广播。广播可以用于传递简单的信息,如通知其他应用程序在特定事件发生时采取相应的操作。

类图

classDiagram
    class Sender {
        + sendBroadcast()
    }

    class Receiver {
        + onReceive()
    }

    Sender --> Receiver

代码示例

发送广播:

public class Sender {
    public static final String ACTION_CUSTOM_BROADCAST = "com.example.android.CUSTOM_BROADCAST";

    public void sendBroadcast(Context context, String message) {
        Intent intent = new Intent(ACTION_CUSTOM_BROADCAST);
        intent.putExtra("message", message);
        context.sendBroadcast(intent);
    }
}

接收广播:

public class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Sender.ACTION_CUSTOM_BROADCAST)) {
            String message = intent.getStringExtra("message");
            // 处理接收到的广播消息
        }
    }
}

2. 内容提供者(Content Provider)

内容提供者允许一个应用程序在安全的情况下共享其数据给其他应用程序访问。内容提供者通过URI(统一资源标识符)公开数据,并使用标准的CRUD(创建、读取、更新、删除)操作进行管理。

类图

classDiagram
    class Provider {
        + query()
        + insert()
        + update()
        + delete()
    }

    class Consumer {
        + getContentResolver()
    }

    Consumer --> Provider

代码示例

提供者(Provider):

public class MyProvider extends ContentProvider {
    public static final String AUTHORITY = "com.example.android.myprovider";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/data");

    @Override
    public boolean onCreate() {
        // 初始化内容提供者
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        // 查询数据
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // 插入数据
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        // 更新数据
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // 删除数据
    }

    @Override
    public String getType(Uri uri) {
        // 返回MIME类型
    }
}

消费者(Consumer):

public class MyConsumer {
    public void fetchData(Context context) {
        Uri uri = MyProvider.CONTENT_URI;
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        // 处理查询结果
    }
}

3. 绑定服务(Bound Service)

绑定服务允许一个应用程序和另一个应用程序之间建立一个持久的连接,以便它们可以通过该连接进行双向通信。一个应用程序可以绑定到另一个应用程序的服务,然后调用服务提供的方法。

类图

classDiagram
    class Service {
        + onBind()
        + onUnbind()
    }

    class Client {
        + bindService()
        + unbindService()
    }

    Client --> Service

代码示例

服务(Service):

public class MyService extends Service {
    private final IBinder binder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }

    public void performAction() {
        // 执行操作
    }
}

客户端(Client):

public class MyClient extends AppCompatActivity {
    private MyService myService;
    private boolean isBound = false;

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.MyBinder binder = (MyService.MyBinder) service;
            myService = binder.getService();
            isBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name)