无法获取意图的额外信息。

5

我有一个活动,可以在多种模式下使用,因此我必须像这样做:

    Intent i = new Intent(MainListActivity.this,MainActivity.class);
    extras.putInt("id", c.getId());
    extras.putInt("mode", AREA_MODE);
    i.putExtra("extras", extras);
    startActivity(i);

并且在 onCreate 中:

    Intent i = this.getIntent();
    extras = i.getBundleExtra("extras");
    if(extras!=null){
        id = extras.getInt("id", -1);
        mode = extras.getInt("mode", COUNTRY_MODE);
    }

但是意图附加项始终为空。我有什么遗漏吗?有没有办法解决这个问题?

编辑:由于某种原因,getIntent()方法返回先前的Intent,在我的情况下没有额外的(主要的意图)。我正在努力弄清楚为什么。


让我们仔细检查一些事情。您能发布MainActivity的完整onCreate方法以及创建此意图的MainListActivity中的完整方法吗?另外,既然您正在获取先前的意图,为什么不显示MainListActivityonCreate呢? - Bert F
你的 c.getId() 可能不是 int 类型。我曾经遇到过 getId() 返回带有字母字符的字符串,但偶尔也会返回只包含数字的字符串的类似问题。在这种情况下,Android 的 putExtra (String, String) 进行了有趣的转换,因此当我尝试使用 getString 检索它时,得到了 null,但是我可以使用 getInt 检索它们。 - midnight
6个回答

4
啊哈!我刚刚调试了这个问题。结果是由于PendingIntent文档中细节的微妙之处

  • PendingIntent是系统维护的令牌的引用。因此,即使发送进程重新启动,重建相似的意图将检索到原始PendingIntent。然后发送者可以取消或更改它。
  • 相似的意图 == 相同的操作、动作、数据、类别、组件和标志。附加项不计入其中!
  • 只在其额外内容上有所不同的意图都会检索到相同的令牌。

人们经常犯的一个错误是使用Intents创建多个PendingIntent对象,这些对象只在它们的“额外”内容上有所不同,期望每次都获得不同的PendingIntent。这是不可能发生的

修复1:创建一个独特的 PendingIntent。它必须具有不同的操作、动作、数据、类别、组件或标志--或请求代码整数。

修复2:使用FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT取消或修改任何现有的PendingIntent。

这两种修复方法产生稍微不同的结果。无论哪种方式,你的新Extra都应该能够被正确传递。


3
请尝试以下方法:
在一个Activity中:
Intent i = new Intent();
Bundle bundle = new Bundle();
bundle.putInt("id", c.getId());
bundle.putInt("mode", AREA_MODE);    
i.putExtras(bundle);

在另一个活动中:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    id = extras.getInt("id", -1);
    mode = extras.getInt("mode", COUNTRY_MODE);    
}

2

应该是这样的。

Intent i = new Intent(MainListActivity.this ,MainActivity.class);
i.putExtra("id", c.getId());
i.putExtra("mode", AREA_MODE);
startActivity(i);

并且

Intent i = this.getIntent();
id = i.getIntExtra("id", -1);
mode = i.getIntExtra("mode", COUNTRY_MODE);

他正在从“MainListActivity”启动“MainActivity”。他可能需要使用MainListActivity.this而不是this(你的代码做了更改),因为他在一个内部类中。 - Bert F

0

您不应该这样向意图添加额外信息:

 i.putExtra("extras", extras);

这将在意图中添加一个名为“extras”的额外内容。您的“extras”位于意图中的非标准位置。如果您的onCreate()代码检索到映射到“extras”的对象并查看其中的内容,则会发现您的“extras”。

标准方法是通过putExtras填充bundle并将其添加到意图中:

i.putExtras(bundle);

或者使用方便的方法,例如putExtra

i.putExtra("mode", AREA_MODE);

好的,无论如何,“extras”都不是推荐的方法。如果使用标准方法会发生什么? - Bert F
仍然是相同的。先前的意图被返回。 - parser_failed

0

仍然无法工作。getIntent() 似乎返回先前的意图,而在我的情况下没有任何额外信息。 - parser_failed

0

我没有找到这个问题的原因,所以我放弃了使用一个活动。我创建了其他扩展有问题的活动,并且它开始工作了(两种方法都可以)。感谢大家的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接