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 に答える