如何从一个类发送回调到android中的活动?

时间:2015-03-24 18:07:45

标签: android android-intent android-activity

我有一个ScanActivity,我从中实例化一个类(预览),它点击图像并在Camera对象上设置回调。如果回调操作成功,我想返回ScanActivity。例如:

class Preview extends SurfaceView implements SurfaceHolder.Callback{
    Camera mCamera;
    Preview(){} //constructor to initialize mCamera
    public void start(){
      mCamera.startPreview();
      mCamera.setPreviewCallback(new Camera.PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
             /* 
              if(scanSuccessful){
                  return to activity
                } 
            */
        }
    }
}

class ScanActivity extends Activity{

    public void onCreate(){
        Preview p = new Preview();
        preview.start();
    }
}

在回调中,我希望在扫描成功的情况下返回到调用活动(ScanActivity)。我知道广播接收器是实现它的一种方式,还有其他方法吗?使用它们的利弊是什么?

2 个答案:

答案 0 :(得分:0)

很少有想法,不一定是完整列表 - 您可能想要:

  1. start activity for result
  2. 将工作委托给服务,如果耗费时间
  3. 使用侦听器界面 - how to create own listener interface in android
  4. 使用Android' dialogs
  5. 关于利弊的问题,这是非常主观的,AFAIK反对SO rules :) 但是,我认为第4点作为Android SDK的新增功能是一种方法。我还建议反对第3点 - 据我所知,这将在UI线程上运行,并且在繁重工作的情况下 - 可能会导致应用程序无响应。

答案 1 :(得分:0)

brainovergrow 是正确的。您需要setResult方法,以便将结果发送到父活动。我认为Parcelable也会对send data between activities机制提供帮助。

代码:

public interface PreviewCallback {
    void onPreviewFrame(byte[] data, Camera camera);
}

class Preview extends SurfaceView implements SurfaceHolder.Callback{
    Camera mCamera;
    PreviewCallback listener;
    Preview(){} //constructor to initialize mCamera

    public void setCallback(PreviewCallback callback) {
        listener = callback;
    }

    public void start(){
      mCamera.startPreview();
      mCamera.setPreviewCallback(new Camera.PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
              listener.onPreviewFrame(data,camera);
        }
    }
}

class ScanActivity extends Activity implements PreviewCallback {

    public void onCreate(){
        Preview p = new Preview();
        preview.setCallback(this);
        preview.start();
    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        // do your work
    }
}