Получить экземпляр активности

13 psct [2012-03-15 18:39:00]

Извините меня за простой вопрос, я полностью начинаю разработку 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);
        ....
    }
    }
}

java android android-activity


3 ответа


15 Решение Евгений Шевченко [2015-03-19 16:26:00]

Вот способ избежать утечек памяти с помощью статической переменной: сделать статическую слабую ссылку на экземпляр 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()
    

7 ivagarz [2013-10-03 07:39:00]

Activity a = (Activity) getContext();

Пока вы передаете текущую активность как контекст в конструкторе, как вы уже делаете.


4 Luke Alderton [2012-11-11 00:50:00]

Я просто устанавливаю переменную в своей основной деятельности, например... public static Activity activity = this;, тогда я могу ссылаться на нее из любого места, используя: MainActivity.activity.

Вы также можете установить его в методе onCreate(), просто настройте переменную в верхней части основного класса активности, как этот public static Activity activity;, а затем в методе onCreate() просто добавьте activity = this; в любом месте.

Это будет работать для любого класса, который расширяет Activity, например public class MainActivity extends Activity, однако вы можете вызывать переменную из любого класса, даже если они не расширяют Activity.

Надеюсь, что это поможет.