You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用同一Activity时Intent传值为空问题排查求助

问题排查与解决方案

核心原因分析

你遇到的问题大概率是Activity启动模式(launchMode)导致的Intent Extra丢失:

  • 默认情况下Activity的launchMode是standard,每次调用startActivity都会创建新实例,onCreate会被触发并读取新Intent的Extra。
  • 如果你的YoutubePlayer在Manifest中被设置了singleTop或singleTask模式,当Activity已经处于栈顶时,新的Intent会通过onNewIntent方法传递,而不会重新创建实例,此时你只在onCreate中读取Intent,自然拿到的是第一次启动时的空Extra。

另外也需要排除URL解析导致videoId为空的情况,但这不会导致videoChannel和videoTitle同时为空。


解决方案

方案1:修改Activity启动模式(推荐)

打开AndroidManifest.xml,找到YoutubePlayer对应的<activity>标签,确保其launchMode为默认的standard:

<activity
    android:name=".YoutubePlayer"
    android:launchMode="standard"> <!-- 显式设置或直接去掉该属性(默认就是standard) -->
    <!-- 其他配置 -->
</activity>

这样每次点击推荐项都会创建新的YoutubePlayer实例,onCreate会读取到新Intent中的所有Extra。

方案2:兼容singleTop/singleTask模式(如需保留该模式)

如果必须使用singleTop或singleTask,需要重写onNewIntent方法更新Intent,并统一处理数据逻辑:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_youtube_player);
    // 初始化视图
    initViews();
    // 统一从Intent读取数据
    initFromIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent); // 将当前Activity的Intent替换为新的Intent
    initFromIntent(intent); // 重新读取并处理新数据
}

private void initViews() {
    playerDescription = findViewById(R.id.playerChannel);
    playerTitle = findViewById(R.id.playerTitle);
    playerMini = findViewById(R.id.playerMini);
    playerChannel = findViewById(R.id.playerSubs);
    playerSubscriptions = findViewById(R.id.playerSubscriptions);
    recyclerView = findViewById(R.id.recommendationRecycler);
    videoLiked = findViewById(R.id.videoLiked);
    videoDisliked = findViewById(R.id.videoDisliked);
}

private void initFromIntent(Intent intent) {
    String videoURL = intent.getStringExtra("videoURL");
    String videoTitle = intent.getStringExtra("videoTitle");
    String videoChannel = intent.getStringExtra("videoChannel");
    
    Toast.makeText(this, "Video channel is : " + videoChannel + "title : " + videoTitle, Toast.LENGTH_SHORT).show();
    
    // 后续的UI设置、视频加载等逻辑都移到这里
    if(videoChannel == null) {
        videoChannel = "Jet Lag   1.2M views   5 months ago";
    }
    String[] temp = videoChannel.split("   ") ;
    String ansChannel = "" ;
    String ansViews = "" ;
    int check = 0 ;

    // ... 其他原有逻辑(推荐列表初始化、视频加载等)
}

方案3:修复URL解析逻辑(避免videoId为空)

如果你的视频链接包含youtu.be格式(如https://youtu.be/xxx),原有的getQueryParameter("v")无法解析出videoId,需要补充处理:

@Override
public void onClick(View view, int pos) {
    Intent intent = new Intent(YoutubePlayer.this , YoutubePlayer.class);
    String msg = recommendationList.get(pos).getSearchURL();
    String videoId = null;
    Uri uri = Uri.parse(msg);
    
    // 兼容youtube.com和youtu.be两种链接格式
    if (uri.getHost().contains("youtu.be")) {
        videoId = uri.getLastPathSegment();
    } else {
        videoId = uri.getQueryParameter("v");
    }
    
    String videoChannel = recommendationList.get(pos).getSearchChannel();
    String videoTitle = recommendationList.get(pos).getSearchTitle();

    intent.putExtra("videoURL" , videoId);
    intent.putExtra("videoChannel" , videoChannel);
    intent.putExtra("videoTitle" , videoTitle);
    
    // ... 原有逻辑
}

验证步骤

  1. 在发送Intent前添加日志,确认Extra已正确放入:
    Log.d("YoutubePlayer", "videoChannel: " + videoChannel);
    Log.d("YoutubePlayer", "Intent extras: " + intent.getExtras());
    
  2. 在接收Intent时添加日志,确认Extra已接收:
    Log.d("YoutubePlayer", "Received extras: " + intent.getExtras());
    

内容的提问来源于stack exchange,提问作者ReginaMark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:17:35