【问题标题】:app close after onBackPressed - why? [duplicate]应用程序在 onBackPressed 后关闭 - 为什么? [复制]
【发布时间】:2025-12-04 16:45:02
【问题描述】:

您好,我的活动有奇怪的行为。从 MainActivity 我开始另一个活动,一切都很酷。如果我按返回键,应用程序不会返回到之前的活动,而是返回到桌面。

当我开始其他活动时,我没有在 MainActivity 中调用 destory 或完成。

在我更改应用程序中的一些服务并且一切正常之前几个小时,它突然开始以这种方式运行。我没有改变任何关于活动调用的东西。

public class EpgActivity extends Activity {


   private EpgRectangleView epgRectangleView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.onCreate(savedInstanceState);


    epgRectangleView = new EpgRectangleView(this);
    epgRectangleView.setBackgroundColor(Color.BLUE);

    View decorView = getWindow().getDecorView();
    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    decorView.setSystemUiVisibility(uiOptions);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    setContentView(epgRectangleView);

    System.out.println("BOOSTED: " + epgRectangleView.isHardwareAccelerated());

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    epgRectangleView.getEpgScreenService().onClick(keyCode);

    epgRectangleView.invalidate();

    epgRectangleView.clearAnimation();

    return super.onKeyDown(keyCode, event);
}

}

知道什么会导致这种行为吗?

public class MainActivity extends Activity {

private MainViewModel mainViewModel;
private ActivityMainBinding binding;

private DrawerLayout drawerLayout;


@Override
public void sendBroadcast(Intent intent) {
    super.sendBroadcast(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View decorView = getWindow().getDecorView();

    /*int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    */


    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    decorView.setSystemUiVisibility(uiOptions);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    setContentView(R.layout.activity_main);

    initDataBinding();

}

private void initDataBinding() {

    binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

    mainViewModel = MainViewModel.getInstance(this);

    binding.setMainViewModel(mainViewModel);

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    drawerLayout.openDrawer(GravityCompat.START);

    Handler handler = new Handler();

    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do something after 100ms
            drawerLayout.closeDrawer(Gravity.LEFT);
        }
    }, 1200);

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

//        Toast.makeText(this,event.getKeyCode() + "", 

Toast.LENGTH_SHORT).show();
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
                drawerLayout.closeDrawer(Gravity.LEFT);
            } else {
                drawerLayout.openDrawer(GravityCompat.START);
            }
        }
    if (keyCode == KeyEvent.KEYCODE_X) {

        startActivity(new Intent(this, EpgActivity.class));

    }

    return super.onKeyDown(keyCode, event);
}
}

请记住,对象 ViewModel 没有任何可能损害 Activity 生命周期的内容。

【问题讨论】:

  • 能否在您的问题中添加代码 sn-ps?
  • 分享你所做的事情
  • 具体来说,分享一下你在这两个活动中用来处理后按事件的代码。
  • 在此处分享您的代码
  • 请分享您的代码

标签: android android-activity onbackpressed


【解决方案1】:

这些是您无法进行上一个活动的方式。

  1. 如果你写了标志,它将清除堆栈

         Intent homeActivity = new Intent(context, DJ_HomeActivity.class);     
         homeActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK,Intent.FLAG_ACTIVITY_CLEAR_TOP); // it will clear the stack so remove the line if you written
         context.startActivity(homeActivity);
    
  2. 在清单文件中

         android:noHistory="true" // If you written in Manifest remove this line
    
  3. 将活动从一个班级转移到另一个班级时

      Intent homeActivity = new Intent(context, DJ_HomeActivity.class);     
      context.startActivity(homeActivity);
      finish(); // // If you written in Activity remove this line
    
  4. 移除 lauchMode 或将标准放入 Manifest 文件中

     android:launchMode="standard"
    

【讨论】:

  • 你读过这个问题吗? 如果我按下返回键,应用程序不会返回到上一个活动,但它会将我返回到桌面。所以显然他不想关闭应用程序
【解决方案2】:

我猜你已经在 Manifest.xml 的第二个活动中设置了 FLAG_ACTIVITY_CLEAR_TOP。检查它或添加Manifest.xml和你的相关代码sn-p。

【讨论】:

    【解决方案3】:

    当您按下返回按钮时,方法 onBackPressed 会执行。如果您没有覆盖它,将处理默认值。默认使堆栈中的顶部活动成为焦点。但是,如果您在堆栈中没有活动,您将退出。 通过执行finish(),你将杀死你的活动,并且它不会被保存在堆栈中。 如果您只是调用新意图,而不杀死以前的意图,onBackPressed 将完全按照您的意愿行事。

    要熟悉活动生命周期,请关注this 链接。

    【讨论】:

      最近更新 更多