如何通过AIDL在activity和service之间传递surfaceview?

How to pass a surfaceview between activity and service through AIDL?

我想使用 AIDL 将 SurfaceView 从 activity 传递到服务。 在服务中,我将渲染视频。

您不能使用 AIDL 传递 surfaceview。默认只支持某些数据类型,list 和 map。您也可以打包自定义对象,但 surfaceview 不是其中之一。更多 Info.

只有一种解决方案,但您需要使用单例 surfaceview 并确保您的实施中没有任何 UI 泄漏。有一件事,无论何时使用 surfaceview,您都需要重新初始化。每当您从 activity 移出时,已经初始化 surfaceview 的服务将被销毁。因为surfaceview/surface被windowmanager占用了。

android 中的

Service 旨在在 后台 中执行某些操作。如果您想播放视频文件或流,请使用全屏 activity 并在其布局中使用 VideoView。将媒体的 uri 传递给 VideoView.

找到解决方案, 代替传递表面视图应用程序可以传递实际实现可分割接口的 Surface,并且可以将 Surface class 的实例传递给 MediaPlayer.setSurface() 以呈现视频。

在 .aidl 文件中

import android.view.Surface;

oneway interface{
void startRender( in Surface surface)
}

服役

    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.stop();
    mediaPlayer.reset();
    mediaPlayer.setSurface(surfaceViewId);

申请中

 serviceInstance.startRender((((SurfaceView)findViewById(R.id.surfaceView)).getHolder()).getSurface());