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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:48:04