Получить экземпляр активности
Извините меня за простой вопрос, я полностью начинаю разработку java и android. Как я могу получить экземпляр Activity в setCameraDisplayOrientation при вызове функции surfaceChanged?
public class MyActivity extends Activity
{
private Camera mCamera;
private CameraPreview mPreview;
public final int cameraId = 0;
public Activity activity = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
activity = this;
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mPreview);
}
public void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
}
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
...
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
...
setCameraDisplayOrientation(activity, cameraId, mCamera);
....
}
}
}
Ответы
Ответ 1
Вот способ избежать утечек памяти с помощью статической переменной: сделать статическую слабую ссылку на экземпляр Activity, который будет установлен в методе onCreate (Bundle).
-
Напишите в своем вторичном классе что-то вроде ниже:
public Class SecondClass {
private static WeakReference<Activity> mActivityRef;
public static void updateActivity(Activity activity) {
mActivityRef = new WeakReference<Activity>(activity);
}
-
Затем в методе onCreate (Bundle) вашего класса Activity:
@Override
onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SecondClass.updateActivity(this);
...
}
-
Используйте экземпляр действия следующим образом:
mActivityRef.get()
Ответ 2
Activity a = (Activity) getContext();
Пока вы передаете текущую активность как контекст в конструкторе, как вы уже делаете.
Ответ 3
Я просто устанавливаю переменную в своей основной деятельности, например... public static Activity activity = this;
, тогда я могу ссылаться на нее из любого места, используя: MainActivity.activity
.
Вы также можете установить его в методе onCreate(), просто настройте переменную в верхней части основного класса активности, как этот public static Activity activity;
, а затем в методе onCreate() просто добавьте activity = this;
в любом месте.
Это будет работать для любого класса, который расширяет Activity, например public class MainActivity extends Activity
, однако вы можете вызывать переменную из любого класса, даже если они не расширяют Activity.
Надеюсь, что это поможет.