Android中如何在Activity间传递Vector Drawable资源引用?
问题分析与解决方案
你的问题核心不是Vector Drawable的特殊处理——它的资源ID就是普通int类型,和PNG图标的R.drawable.xxx没有任何区别,完全可以直接传递。真正的问题出在Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标记的行为上:当MainActivity已经存在于任务栈中时,这个标记只会把它调到栈顶,但不会更新它的原始Intent,所以getIntent().getExtras()拿到的始终是MainActivity第一次启动时的Bundle,自然为空。
下面给出两种符合你需求(无需转Bitmap,保持int类型传递)的解决方案:
方案一:使用Activity间返回数据的标准方式(推荐)
用startActivityForResult(旧API)或Activity Result API(AndroidX推荐)来实现图标页面到主页面的数据回传,这是Activity间返回数据的标准流程,逻辑更清晰。
1. 主页面启动图标页面
旧API(适配Android 10及以下)
Intent intent = new Intent(MainActivity.this, IconPage.class); startActivityForResult(intent, 100); // 100为自定义请求码,只要唯一即可
同时在主页面重写onActivityResult接收数据:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK && data != null) { int iconResId = data.getIntExtra("image", 0); if (iconResId != 0) { iconButton.setImageResource(iconResId); tempTask.setIconId(iconResId); } } }
新API(AndroidX推荐)
// 在MainActivity的onCreate中注册回调 ActivityResultLauncher<Intent> iconSelectLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { int iconResId = result.getData().getIntExtra("image", 0); if (iconResId != 0) { iconButton.setImageResource(iconResId); tempTask.setIconId(iconResId); } } } ); // 启动图标页面时调用 iconSelectLauncher.launch(new Intent(MainActivity.this, IconPage.class));
2. 图标页面返回数据
public void returnToMainActivity(){ Intent intent = new Intent(); intent.putExtra("image", R.drawable.icon_trash1_24); setResult(RESULT_OK, intent); finish(); // 关闭当前页面,回到主页面 }
方案二:保留FLAG_ACTIVITY_REORDER_TO_FRONT的写法
如果你一定要用这种栈调起方式,需要在MainActivity中重写onNewIntent方法来接收新的Intent,并更新当前Activity的Intent引用:
1. 图标页面代码(保留原逻辑)
public void returnToMainActivity(){ Intent intent = new Intent(IconPage.this, MainActivity.class); intent.putExtra("image", R.drawable.icon_trash1_24); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); }
2. 主页面添加onNewIntent方法
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 将新Intent替换为当前Activity的Intent // 处理传递的资源ID int iconResId = intent.getIntExtra("image", 0); if (iconResId != 0) { iconButton.setImageResource(iconResId); tempTask.setIconId(iconResId); } }
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

