Android Studio跳转Activity时黑屏且Activity被多次创建问题求助
问题解决方案
导致Activity重复创建的核心原因及修复
1. 初始化逻辑位置错误
你当前把Toolbar、抽屉导航、Fragment初始化等所有逻辑都放在了onPostResume生命周期方法中,该方法会在Activity每次回到前台时(包括首次创建、配置变更、从后台切回)都重复执行,结合你当前的代码逻辑会触发界面重绘甚至重复的启动逻辑,首先把所有非必须每次回到前台执行的初始化逻辑迁移到onCreate方法中:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_navigation); // 原来写在onPostResume里的初始化逻辑全部移到这里 Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle(""); setSupportActionBar(toolbar); shpall=getSharedPreferences("saveUsersforall",MODE_PRIVATE); shediteallr=shpall.edit(); drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); logoutView=findViewById(R.id.logout); // 优化touch事件逻辑,避免多次触发 logoutView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 仅在手指抬起时执行逻辑,避免按下、移动、抬起阶段多次触发 if(event.getAction() == MotionEvent.ACTION_UP){ shediteallr.clear(); shediteallr.apply(); Intent intent=new Intent(MainNavigation.this,Login.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); } return true; } }); ActionBarDrawerToggle toggle= new ActionBarDrawerToggle( this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toolbar.getOverflowIcon().setColorFilter(Color.BLACK , PorterDuff.Mode.SRC_ATOP); toggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.black)); toggle.syncState(); // 只在首次创建时加载首页Fragment,避免配置变更时重复加载 if(savedInstanceState == null){ getSupportFragmentManager().beginTransaction().replace(R.id.navigations_fragment_container,new HomeFragment()).commit(); } BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.bottom_navigation_view); navigation.setOnNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch (menuItem.getItemId()){ case R.id.nav_add_property: drawer.closeDrawer(GravityCompat.START); break; case R.id.nav_list: drawer.closeDrawer(GravityCompat.START); break; case R.id.nav_about_us: drawer.closeDrawer(GravityCompat.START); break; case R.id.nav_contact_us: drawer.closeDrawer(GravityCompat.START); break; } return true; } }); } // 清空onPostResume里的冗余逻辑,仅保留必须每次回到前台执行的操作 @Override protected void onPostResume() { super.onPostResume(); // 如需每次刷新的逻辑(如用户状态校验等)可放在此处 }
2. 登录页跳转触发逻辑优化
检查登录页的跳转触发逻辑,如果你给登录按钮设置了OnTouchListener但没有判断事件类型,或者重复给按钮绑定了多次点击事件,会导致startActivity被调用多次,从而创建多个MainNavigation实例。如果是普通点击场景推荐直接使用OnClickListener,不要用OnTouchListener避免多次触发。
3. Intent Flag补充优化
你当前的跳转逻辑已经添加了FLAG_ACTIVITY_CLEAR_TOP,可以补充FLAG_ACTIVITY_SINGLE_TOP避免栈顶已有实例时重复创建:
Intent intent=new Intent(Login.this,MainNavigation.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish();
黑屏问题修复
黑屏是因为Activity启动时主线程执行了太多初始化操作,导致界面绘制延迟,可通过以下方案优化:
- 把不必要的同步初始化(比如本地存储读取、非紧急网络请求等)放到子线程执行,或者延迟到首屏绘制完成后再初始化
- 给MainNavigation设置启动预览主题,在
styles.xml中新增如下主题:
<style name="AppTheme.Launcher" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="android:windowBackground">@drawable/launch_screen</item> <item name="android:statusBarColor">@color/white</item> </style>
然后在AndroidManifest.xml中给MainNavigation的android:theme属性设置为该主题,启动时就会显示预览页代替黑屏。
其他代码优化点
- 你当前BottomNavigation的选中回调
onNavigationItemSelected返回值是false,会导致选中状态无法正确更新,修改为返回true - 代码中残留的
enter code here冗余字符要删除,避免编译错误 - 抽屉导航的选中逻辑如果要跳转Fragment,推荐使用
commitAllowingStateLoss避免状态保存后提交崩溃
内容的提问来源于stack exchange,提问作者sammy
相关产品推荐
相关产品推荐

