在Activity的onCreate中调用super.onCreate前能否调用getIntent?
问题解答
核心结论
不建议在调用super.onCreate(savedInstanceState)之前调用getIntent(),虽然多数设备能正常运行,但部分系统版本(比如你遇到的Android 8.1)会因Intent初始化时机问题,导致Extra值为空。
原因分析
Android系统中,Activity的Intent对象是在super.onCreate()内部完成完整初始化的。部分系统版本里,getIntent()在super调用前能返回非空对象,但此时Intent的Extra数据还未被系统完全注入,这就造成了特定版本下的Extra为空异常。
正确实现方式
要根据Intent参数修改Activity主题,正确流程是:
- 先调用
super.onCreate(savedInstanceState)完成Activity基础初始化 - 读取Intent中的Extra参数
- 根据参数设置主题(必须在
setContentView()之前完成)
示例代码:
@Override protected void onCreate(Bundle savedInstanceState) { // 优先调用super完成初始化 super.onCreate(savedInstanceState); // 此时Intent已完全初始化,可安全读取Extra Intent intent = getIntent(); if (intent != null) { boolean useDarkTheme = intent.getBooleanExtra("use_dark_theme", false); setTheme(useDarkTheme ? R.style.AppTheme_Dark : R.style.AppTheme_Light); } // 最后设置布局 setContentView(R.layout.activity_main); }
补充说明
如果你的场景要求必须在setContentView前设置主题(这是必要的,主题会影响布局渲染),上述流程完全满足需求——super.onCreate之后读取Intent既安全,也不会耽误主题设置的时机。
内容的提问来源于stack exchange,提问作者Ankit Wala
相关产品推荐
相关产品推荐

