getIntent().getExtra() 返回 null

Posted

技术标签:

【中文标题】getIntent().getExtra() 返回 null【英文标题】:getIntent().getExtra() returns null 【发布时间】:2017-01-20 09:55:39 【问题描述】:

我有代码可以将用户从底部栏引导到个人资料页面。

private void startNewIntent(Class className, String uid)
    Intent intent = new Intent(act, className);
    intent.putExtra("uid", uid);
    act.startActivity(intent);
    act.finish();


className = DisplayProfile.class;
if(FirebaseAuth.getInstance().getCurrentUser() != null)
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    startNewIntent(DisplayProfile.class, uid);
 else 
    startNewIntent(EmailPasswordActivity.class);

在 ProfileActivity.java 中

protected void onCreate(Bundle savedInstanceState)
    super.onCreate(savedInstanceState);
    String uid = getIntent().getStringExtra("uid");
    if(uid != null)
        ...
    

我也尝试使用Bundle = getIntent().getExtra() 获得相同的结果。我见过类似的问题。好像是这样:getIntent() Extras always NULL

我试过了

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

getIntent().getExtra != null 仍然是假的。

感谢您的帮助和建议。

编辑:为 startNewIntent() 添加上下文

【问题讨论】:

可能没关系,但act是什么? 活动行为我猜? getIntent() 是 null 还是只是 getExtra() ?? act 是将启动 ProfileActivity 的当前活动。我检查了 getIntent() 不为空,它似乎是正确的 Intent。 显示你如何调用startNewIntent方法 【参考方案1】:

而不是签入 onCreate() 签入 onNewIntent():

    @Override
    protected void onCreate(Bundle savedInstanceState)
        super.onCreate(savedInstanceState);
        String uid = getIntent().getStringExtra("uid");
        if(uid != null)
            ...
        
    
    
    @Override
    protected void onNewIntent(Intent intent)
        super.onNewIntent(intent);
        String uid = getIntent().getStringExtra("uid");
        if(uid != null)
            ...
        
    

如果它出现在 onNewIntent() 中,这意味着您正在使用 launchMode 进行活动。这就是启动模式的行为。

【讨论】:

你能给我解释一下launchMode吗?谢谢 android的activity中,activity的启动方式有四种。标准,singleTop,singleTask,singleInstance。这四个用于通过堆栈管理来管理活动流。更多详情请关注 android:launchMode:link 返回MainActivity并从onResume()调用getExtra()时出现同样的问题。这个变体解决了这个问题。 我在更新到compileSdkVersion 30后不得不这样使用。之前总是直接在onCreate工作......我不知道这里发生了什么。 @ThalisVilela 这不是由于 compileSdkVersion 30 或任何其他原因,只需检查您的 AndroidManifest.xml 是否添加到该特定活动标签的启动模式?可能是您正在使用任何导致此原因的意图标志启动活动【参考方案2】:

如果您的班级名称中已经存在".class",请避免使用。

public void startNewIntent(Class className, String uid)
Intent intent = new Intent(act.this, className+".class");
intent.putExtra("uid", uid);
startActivity(intent);

下一阶段

@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
String uid = getIntent().getExtras().getString("uid");
if(uid != null)
    ...
 

【讨论】:

我们为什么要检查 null 条件?我们在那里保留了“uid”值

以上是关于getIntent().getExtra() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Activity.getIntent() 可以返回 null 吗?

在一个活动中,如果活动被暂停,然后用一个意图调用,getIntent() 返回旧的

Android getIntent() 返回第一个意图

当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据

当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据

Android:我们什么时候使用getIntent()?