获取活动实例

psc*_*sct 22 java android android-activity

请原谅我的简单问题,我是初学java和android开发者.当调用surfaceChanged时,如何在setCameraDisplayOrientation中获取Activity的实例?

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);
        ....
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

Евг*_*нко 27

这是一种使用静态变量来避免内存泄漏的方法:对将在onCreate(Bundle)方法中设置的Activity实例进行静态弱引用.

  1. 在您的二级课程中写下如下内容:

    public Class SecondClass {
        private static WeakReference<Activity> mActivityRef;
        public static void updateActivity(Activity activity) {
            mActivityRef = new WeakReference<Activity>(activity);
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后在Activity类的onCreate(Bundle)方法中:

    @Override
    onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondClass.updateActivity(this);
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 以这种方式使用活动实例:

    mActivityRef.get()
    
    Run Code Online (Sandbox Code Playgroud)


iva*_*arz 8

Activity a = (Activity) getContext();
Run Code Online (Sandbox Code Playgroud)

只要您将当前活动作为构造函数中的上下文传递,就像您已经在做的那样.


Luk*_*ton 5

我只是在我的主要活动中设置一个变量,就像这样......public static Activity activity = this;然后我可以从任何地方使用:MainActivity.activity

您也可以在 onCreate() 方法中设置它,只需像这样public static Activity activity;在主活动类的顶部设置变量,然后在 onCreate() 方法中添加activity = this;任何地方即可。

例如,这适用于扩展 Activity 的任何类,public class MainActivity extends Activity但是您可以从任何类调用变量,即使它们不扩展 Activity。

希望这可以帮助。

  • 内存泄漏,如下所述 (9认同)
  • 你没有收到编译错误`不能在静态上下文中使用它`吗? (3认同)
  • 通过保持对静态上下文(活动)的引用,这肯定会导致内存泄漏。 (2认同)