我正在开发一个安装了一些服务的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(); ... }
}
}
您将如何设计此类应用程序?还有什么我需要考虑的吗?
答案 0 :(得分:1)
好的,我就是这样做的:我已经将SurfaceView设置为正确的视图(如果app正在运行),如果没有(即暂停),则将其设置为MainActivity的onServiceConnected / onServiceDisconnected。在服务中,我检查视图是否存在。它不是最好的解耦,但它的工作原理,据我所知,现在表现还不错。