【问题标题】:finish() not closing activity when called after the first run在第一次运行后调用时完成()不关闭活动
【发布时间】:2016-12-26 03:28:15
【问题描述】:

我有三个活动

  • MessagesAttachPhotoActivity
  • MessageGalleryFolderSelectorActivity
  • ImagePickerActivity

MessagesAttachPhotoActivitystartActivityForResult() 调用MessageGalleryFolderSelectorActivity

MessageGalleryFolderSelectorActivity 活动显示手机上的照片文件夹,然后选择一个文件夹。

ImagePickerActivity 然后用setActivityForResult() 调用。一旦从ImagePickerActivity 中选择图像,它就会通过MessageGalleryFolderSelectorActivity 传回MessagesAttachPhotoActivity

当我第一次运行该应用程序时,一切正常。但是,如果我之后再次尝试选择图像,MessageGalleryFolderSelectorActivitysetResult() 之后不会关闭。

我尝试调用finish()this.finish()((Activity)getApplicationContext()).finish()super.onBackPressed(),但均未成功。

为什么活动在连续运行时不关闭?

这是我的代码:

调用MessageGalleryFolderSelectorActivity:

Intent intent;
Bundle arguments = new Bundle();

Bundle bundle;
intent = new Intent(this, MessageGalleryFolderSelectorActivity.class);
bundle = new Bundle();
bundle.putInt(Constants.INTENT_EXTRA_LIMIT, Constants.IMAGES_SELECT_LIMIT);
bundle.putInt("Request", MessageThread.MessageType.IMAGE);
intent.putExtras(bundle);
startActivityForResult(intent, MessageThread.MessageType.IMAGE);

ImagePickerActivity:

imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_MODE,
                      ImagePickerActivity.MODE_MULTIPLE);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_LIMIT, 10);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_SHOW_CAMERA, false);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_ALBUM,album);

//imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES, images);
startActivityForResult(imagesIntent, MessageThread.MessageType.IMAGE);

将数据传回 MessageGalleryFolderSelectorActivity:

Intent data = new Intent();
data.putParcelableArrayListExtra
     (ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES, selectedImages);               
data.putExtra(ImagePickerActivity.INTENT_EXTRA_ALBUM,album);
setResult(RESULT_OK, data);
finish();
return true;

尝试将数据传回初始调用活动,但此活动未关闭 MessageGalleryFolderSelectorActivity:

@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
        ArrayList<Image> selectedImages = data.getParcelableArrayListExtra
            (ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES);

        String album = data.getStringExtra(ImagePickerActivity.INTENT_EXTRA_ALBUM);

        Intent intent = new Intent();
        intent.putExtra(ImagePickerActivity.INTENT_EXTRA_ALBUM, album);
        intent.putParcelableArrayListExtra
          (ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES, selectedImages);

         setResult(Activity.RESULT_OK, intent);

         this.finish();
         return;
    } else if (resultCode == RESULT_CANCELED) {

    }
}

【问题讨论】:

  • 尝试使用startActivity
  • @ChiragArora 到底在哪里?
  • 在 startActivityForResult(intent, MessageThread.MessageType.IMAGE);使用 startActivity(intent);
  • @ChiragArora 没有帮助。
  • 这 3 项活动的清单?

标签: android android-intent android-activity startactivityforresult


【解决方案1】:

我认为我们可以使用 getParent() 来引用父活动。因此,在 MessageGalleryFolderSelectorActivity 类中,我们可以在覆盖的 onActivityResult 上编写 ((Activity)getParent()).OnActivityResult(requestCode,resultCode,data)。因此,我们将得到的值移交给父级而不进行处理。

【讨论】:

    【解决方案2】:

    尝试在活动中使用finishAffinity() 而不是finish()

    【讨论】:

      【解决方案3】:

      工作正常我用 3 个活动检查了同样的事情: 1. 主要活动 2.SecondActivity 3. 第三活动

      在 MainActivity 我通过点击按钮启动了 SecondActivity,代码如下:

      button.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      nextclick();
                  }
              });
          }
      
          public void nextclick()
          {
              Intent intent=new Intent(MainActivity.this, SecondAcivity.class);
              startActivityForResult(intent,1);
          }
      
      
      
      @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
      
              switch (requestCode)
              {
                  case 1:
      
      
                      break;
              }
          }
      

      在SecondActivity中我通过点击floatingActionButton启动了ThirdActivity,代码如下:

      FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
              fab.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      nextclick();
                  }
              });
          }
      
          public void nextclick() {
              Intent intent = new Intent(SecondAcivity.this, ThirdActivity.class);
              startActivityForResult(intent, 2);
          }
      
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
      
              if (resultCode == RESULT_OK) {
                  switch (requestCode) {
                      case 2:
                        //Set data for MainActivity
                          Intent intent = new Intent();
                          intent.putExtra("album", "dfdfd");
                          setResult(RESULT_OK, intent);
                          SecondActivity.this.finish();
                          break;
                  }
              }
          }
      

      在ThirdActivity中我通过点击floatingActionButton启动了ThirdActivity,代码如下:

      FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
          fab.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
               //Set data for SecondActivity
                  Intent data = new Intent();
      
                  data.putExtra("album","album");
                  setResult(RESULT_OK, data);
                  finish();
              }
          });
      }
      

      希望它能帮助您找到代码中的确切问题。

      【讨论】:

        【解决方案4】:

        我用三个这样的活动尝试了同样的逻辑

        活动 A

            public class A extends AppCompatActivity {
        
            private static final int BCODE = 100;
            private String Tag="A Activity";
            Button triggerButton;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                triggerButton= (Button) findViewById(R.id.triggerButton);
                triggerButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent;
                        Bundle arguments = new Bundle();
                        intent = new Intent(A.this, B.class);
                        intent.putExtras(arguments);
                        startActivityForResult(intent, BCODE);
                    }
                });
        
            }
        
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if(requestCode==BCODE){
                    if(resultCode==RESULT_OK){
                        Log.e(Tag,"succes");
                    }
                }
            }
        }
        

        从活动 A,我通过 startActivityForResult 传递意图来启动活动 B

        从活动 B 我又在做同样的事情

        public class B extends AppCompatActivity {
        
            private static final int CCODE =200 ;
            private String Tag="Activity B";
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_b);
                Intent intent;
                Bundle arguments = new Bundle();
                intent = new Intent(this, C.class);
                intent.putExtras(arguments);
                startActivityForResult(intent, CCODE);
            }
        
            @Override
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if(requestCode==CCODE){
                    if(resultCode==RESULT_OK){
                        Log.e(Tag,"suceess");
                        setResult(RESULT_OK,new Intent());
                        finish();
                    }
                }
            }
        }
        

        在活动 C 中,我只是在设置结果后完成活动

        public class C extends AppCompatActivity {
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_c);
                setResult(RESULT_OK,new Intent());
                finish();
            }
        }
        

        当活动 C 完成时,操作系统将恢复活动 B 并调用 onActivityResult()。在活动 B 的 onActivityResult 中,我正在设置结果并完成活动。然后操作系统将恢复活动 B 并调用活动的 onActivity 结果 AI 尝试了这么多这个场景对我来说很好用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多