在第一次运行后调用时完成()不关闭活动
Posted
技术标签:
【中文标题】在第一次运行后调用时完成()不关闭活动【英文标题】:finish() not closing activity when called after the first run 【发布时间】:2016-12-26 03:28:15 【问题描述】:我有三个活动
MessagesAttachPhotoActivity
MessageGalleryFolderSelectorActivity
ImagePickerActivity
MessagesAttachPhotoActivity
用startActivityForResult()
调用MessageGalleryFolderSelectorActivity
。
MessageGalleryFolderSelectorActivity
活动显示手机上的照片文件夹,然后选择一个文件夹。
ImagePickerActivity
然后用setActivityForResult()
调用。一旦从ImagePickerActivity
中选择图像,它就会通过MessageGalleryFolderSelectorActivity
传回MessagesAttachPhotoActivity
。
当我第一次运行该应用程序时,一切正常。但是,如果我之后再次尝试选择图像,MessageGalleryFolderSelectorActivity
在setResult()
之后不会关闭。
我尝试调用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 项活动的清单? 【参考方案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 尝试了这么多这个场景对我来说很好用。
【讨论】:
以上是关于在第一次运行后调用时完成()不关闭活动的主要内容,如果未能解决你的问题,请参考以下文章