当前位置:   article > 正文

Android AIDL RemoteCallbackLIst

Android AIDL RemoteCallbackLIst

RemoteCallbackLIst

RemoteCallbackList 是 Android SDK 中的一个类,用于帮助管理进程之间的回调。它专为进程间通信 (IPC) 场景而设计,在该场景中,应用程序的不同部分甚至不同的应用程序可能在不同的进程中运行。

以下是其关键功能的细分:

  • 维护回调列表:您可以使用 register() 向列表注册多个回调对象。
  • 将消息传递给所有注册的回调:当您在 RemoteCallbackList 上调用 broadcast() 等方法时,它将调用每个注册的回调对象上的相应方法。
  • 处理死掉的 Binder:如果托管回调的进程死亡,RemoteCallbackList 会自动从列表中删除该回调。

使用 RemoteCallbackList 的优势:

  • 安全且高效:它处理 Binder 死亡并确保回调仅传递给活动的进程。
  • 方便:简化了管理多个回调的过程,避免了手动处理 Binder 死亡。

常见用例:

  • 在进程之间实现事件侦听器(例如,通知活动服务更新)。
  • 在系统组件和应用程序之间传递回调。

其他资源:

RemoteCallbackList 的用途:

RemoteCallbackList 可用于在进程之间传递回调。这意味着您可以将一个进程中的回调注册到另一个进程中的对象。当该对象发生更改时,它会调用回调以通知第一个进程。

这在许多情况下都很有用,例如:

  • 在服务和活动之间进行通信:服务可以使用 RemoteCallbackList 通知活动其状态已更改。
  • 在不同的应用程序之间进行通信:两个应用程序可以使用 RemoteCallbackList 相互通知事件。

使用 RemoteCallbackList 的示例:

以下是一个简单示例,演示如何在两个活动之间使用 RemoteCallbackList 进行通信:

MyService.java:

public class MyService extends Service {

    private RemoteCallbackList<MyCallback> mCallbacks = new RemoteCallbackList<>();

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

    public void doSomething() {
        // Notify all registered callbacks.
        for (MyCallback callback : mCallbacks) {
            callback.onSomethingChanged();
        }
    }

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

        public void registerCallback(MyCallback callback) {
            mCallbacks.register(callback);
        }

        public void unregisterCallback(MyCallback callback) {
            mCallbacks.unregister(callback);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

MyActivity.java:

public class MyActivity extends AppCompatActivity implements MyCallback {

    private MyService mService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Bind to the service.
        Intent intent = new Intent(this, MyService.class);
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public void onSomethingChanged() {
        // Do something in response to the change.
        Log.d("MyActivity", "Something changed!");
    }

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = ((MyService.MyBinder) service).getService();

            // Register the callback with the service.
            mService.registerCallback(MyActivity.this);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;

            // Unregister the callback with the service.
            mService.unregisterCallback(MyActivity.this);
        }
    };
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

在这个示例中,MyService 是一个简单的服务,它提供一个 doSomething() 方法来通知所有注册的回调。MyActivity 是一个活动,它绑定到 MyService 并注册为回调。当 MyService 调用 doSomething() 时,MyActivity 中的 onSomethingChanged() 方法将被调用。

参考地址

chatgpt

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/174325
推荐阅读
相关标签
  

闽ICP备14008679号