我正在开发一个安卓应用程序,该应用程序安装了一个服务持续而昂贵的处理(它利用OpenCV获取相机图像并对其进行一些处理(。我希望我的活动连接到并断开连接从服务在设备上执行其他操作并查看处理(主要用于调试,但我也可以看到其他用例(。
问题是我不知道如何设计这个应用程序——我对安卓编程也相当陌生。
由于它是一个性能关键的应用程序,我想我无法从服务到活动,所以我想我想将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(); ... }
}
}
您将如何设计这样的应用程序?我还有什么需要考虑的吗?
好的,我就是这样做的:我在MainActivity的onServiceConnected/onServiceDisconnected中将SurfaceView设置为正确的视图(如果应用程序正在运行(,如果没有设置为null(即暂停(。在服务中,我检查视图是否存在。这不是最好的去耦,但它可以工作,据我目前所知,性能还可以。