应用程序关闭onBackPressed后 - 为什么?

时间:2017-03-22 09:57:48

标签: android android-activity onbackpressed

嗨,我的活动很奇怪。从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没有任何可能损害活动生命周期的内容。

3 个答案:

答案 0 :(得分:2)

这些是您无法前往活动的方式。

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

         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或将标准放入清单文件

     android:launchMode="standard"
    

答案 1 :(得分:0)

我猜你在Manifest.xml中的第二个Activity中设置了FLAG_ACTIVITY_CLEAR_TOP。检查它或添加Manifest.xml和相关的代码段。

答案 2 :(得分:0)

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

要熟悉活动生命周期,请按照this链接。