SurfaceView の作成とその後の ANativeWindow の取得に関して質問があります。
- 次のようにするのは適切ですか
mSurfaceView = new SurfaceView(this);
?
onCreate()
onStart()
質問の理由: 私が理解しているように、フォーカスを失うと (他の何かが画面全体を覆い隠す)、SurfaceView が破壊されるので、フォーカスを得る (onStart() が実行される) たびに再作成する必要があります。それとも、SurfaceView は休止状態のままで再利用可能ですか?
次に、上記のサーフェスから (ネイティブ コードで) ネイティブ ウィンドウを作成したいと思います。次のようにするのは適切ですか
ANativeWindow* newwindow = ANativeWindow_fromSurface(jniEnv, joSurface)
?onSurfaceCreated_native(..., jobject surface)
onSurfaceChanged_native(..., jobject surface)
質問の理由: onSurfaceChanged は常に後で呼び出されるように見えるonSurfaceCreated
ため、ネイティブ ウィンドウをいつ作成するかを選択できます。一方で、これを で行うのは理にかなっているように見えますonSurfaceCreated
が、この 2 つjobject surface
は異なるオブジェクトを参照しているように見えます! (onSurfaceCreated でサーフェスへの弱いグローバル参照を作成し、onSurfaceChanged で NULL とサーフェスの両方に対してそれをチェックすることによってチェックされるように、以下のコードを参照してください)
onSurfaceCreated_native(JNIEnv env, ... ,jobject surface) {
myWeakObjectGlobal = env->NewWeakGlobalRef(surface);
}
onSurfaceChanged_native(JNIEnv env, ... ,jobject surface) {
if (env->IsSameObject(surface, myWeakObjectGlobal)) {
LOGW("onSurfaceChanged_native: new surface is SAME as old surface");
} else {
LOGW("onSurfaceChanged_native: new surface is DIFFERENT as old surface");
}
if (env->IsSameObject(NULL, myWeakObjectGlobal)) {
LOGW(" furthermore, old surface is NULL");
} else {
LOGW(" furthermore, old surface is NOT null");
}
}
したがって、実際に onSurfaceCreated と onSurfaceChanged に送信される 2 つの異なるサーフェス オブジェクトがある場合は、最新のものを使用し、古いサーフェス参照に固執しないようにします。したがって、onSurfaceChanged で ANativeWindow_from_Surface を実行します。
誰かが私のためにこの問題に光を当てることができれば、本当に感謝しています.