Finish () не закрывает активность при вызове после первого запуска

У меня три действия

  • MessagesAttachPhotoActivity
  • MessageGalleryFolderSelectorActivity
  • ImagePickerActivity

MessagesAttachPhotoActivity вызывает MessageGalleryFolderSelectorActivity с startActivityForResult() .

MessageGalleryFolderSelectorActivity отображает папки фотографий на телефоне, а одна выбирает папку.

ImagePickerActivity вызывается с помощью setActivityForResult() . После того, как изображение выбрано из ImagePickerActivity , оно возвращается к MessagesAttachPhotoActivity через MessageGalleryFolderSelectorActivity .

Когда я запускаю приложение в первый раз, все работает нормально. Однако, если я попытаюсь снова выбрать изображение, MessageGalleryFolderSelectorActivity не закрывается после setResult() .

Я попытался вызвать finish() , this.finish() , ((Activity)getApplicationContext()).finish() super.onBackPressed() и 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) { } } 

Solutions Collecting From Web of "Finish () не закрывает активность при вызове после первого запуска"

Я думаю, что мы можем ссылаться на родительскую активность, используя getParent (). Итак, в классе MessageGalleryFolderSelectorActivity мы можем написать ((Activity) getParent ()). OnActivityResult (requestCode, resultCode, data) на переопределенном onActivityResult. Итак, мы передаем полученные значения родителям без его обработки.

Он отлично работает. Я проверил одно и то же с помощью 3 видов деятельности: 1. MainActivity 2. SecondActivity 3. ThirdActivity

В 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 я начал ThirdActivity, нажав на floatActionButton, код выглядит следующим образом:

 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 я начал ThirdActivity, нажав на floatActionButton, код выглядит следующим образом:

 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(); } }); } 

Надеюсь, это поможет вам найти точную проблему в вашем коде.

Попытайтесь использовать finishAffinity() вместо finish() для активности.

Я пробовал такую ​​же логику с тремя действиями, как это

Активность А

  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 я начал активность B, пропуская намерение с помощью startActivityForResult

Из действия 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 заканчивается os, возобновится действие B, а также вызывается onActivityResult (). В onActivityResult of Activity B я устанавливаю результат и заканчивая acitivity.Then OS возобновит активность B и вызовет onActivity результат активности AI многократно пытался это scenerio Отлично работает для меня.