私は、継続的かつコストのかかる処理を行うサービスをインストールする 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(); ... }
}
}
そのようなアプリケーションをどのように設計しますか? 他に考慮すべきことはありますか?