3

我正在开发一个 Android 应用程序,该应用程序安装了一项服务,该服务进行一些持续且昂贵的处理(它利用 OpenCV 抓取相机图像并对其进行一些处理)。我希望我的活动连接到服务并从服务断开连接以在设备上执行其他操作并查看处理(主要用于调试,但我也可以查看其他用例)。

问题是我不确定如何设计这个应用程序——我对 Android 编程也很陌生。

由于它是一个性能关键的应用程序,我想我无法将位图从服务传递到活动,所以我想我想在活动进入前台后立即将 SurfaceView 耦合到服务。

如下所示 - 注意:它不是一个完整的示例,它只是显示流程

public class MainActivity extends Activity {
    private OpenCVCameraService mService;
    private SurfaceView mSurfaceView;
    @Override
    public void onCreate() {
        // show UI
        // start mService with mSurfaceView
    }
}

public class OpenCVCameraService extends Service {
    private Processing mProcessing;
    private SurfaceView mSurfaceView;
    @Override
    public void onCreate() {
        // setup OpenCV camera stuff
        // init mProcessing with mSurfaceView
    }
}

public class Processing extends Thread {
    private VideoCapture mCamera;
    private SurfaceView mSurfaceView;   // maybe just the SurfaceHolder
    Processing(VideoCapture camera, SurfaceView surfaceView) {
        mCamera = camera;
        mSurfaceView = surfaceView;
    }
    @Override
    public void run() {
        mCamera.grab();
        mCamera.retrieve(...);
        // process retrieved images
        // image to bitmap
        // What now, how to get bitmap to MainActivity? Passing using intent is a performace hit I guess
        // maybe something like if (mSurfaceView != null) { Canvas canvas = mSurfaceView.lockSurface(); ... }
    }
}

你会如何设计这样的应用程序?还有什么我需要考虑的吗?

4

1 回答 1

1

好的,这就是我的做法:我在 MainActivity 的 onServiceConnected/onServiceDisconnected 中将 SurfaceView 设置为正确的视图(如果应用程序正在运行),如果不是(即暂停)则设置为 null。在服务中,我检查视图是否存在。这不是最好的解耦,但它可以工作,而且据我现在所知,性能还可以。

于 2013-02-26T13:33:59.983 回答