使用Intent.FLAG_ACTIVITY_SINGLE_TOP与CLEAR_TOP时,Extra参数无法传递如何解决?
解决使用SINGLE_TOP和CLEAR_TOP标记时Extra参数传递为空的问题
首先咱们来拆解问题根源:当你设置FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP这两个标记时,如果第一个Activity(createAdActivity)已经存在于任务栈中,系统不会创建新实例,而是会调用它的onNewIntent()方法传递新Intent。但默认情况下,Activity保存的原有Intent不会自动替换,所以你在onResume()里调用getIntent()拿到的还是第一次启动时的旧Intent,自然获取不到新传递的Extra参数。
具体解决步骤:
更新第一个Activity的
onNewIntent()方法
你需要在这个方法里手动调用setIntent(intent),把新Intent替换掉Activity原来保存的旧Intent。修改后的代码如下:@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 关键操作:将新的Intent设置为当前Activity的Intent setIntent(intent); }确保
onResume()使用更新后的Intent
因为已经通过setIntent()更新了Intent,你原来的onResume()代码不需要大改,现在getIntent()就能拿到新传递的Extra参数了。可以稍微优化逻辑避免空指针:@Override protected void onResume() { super.onResume(); Toast.makeText(this,"IN RESUME ",Toast.LENGTH_LONG).show(); // 此时getIntent()返回的是onNewIntent中设置的新Intent imageUris = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM); if(imageUris != null && !imageUris.isEmpty()) { createAdViewPagerAdapter viewpager = new createAdViewPagerAdapter(this,imageUris); photoViewer.setAdapter(viewpager); } }
额外说明:
FLAG_ACTIVITY_CLEAR_TOP会销毁目标Activity上方的所有Activity,将目标Activity带到栈顶;搭配FLAG_ACTIVITY_SINGLE_TOP时,系统会复用已存在的栈顶实例,调用onNewIntent()而非重新创建。- 只有调用
setIntent(intent),后续的getIntent()才会返回新Intent,否则始终是第一次启动时的旧Intent。
这样修改后,你从第二个Activity返回第一个Activity时,既能正常获取到imgUriList参数,也能保留第一个Activity的原有状态啦。
内容的提问来源于stack exchange,提问作者jhashane
相关产品推荐
相关产品推荐

