Android 返回菜单项上的主要活动单击

Android 返回菜单项上的主要活动单击,android,menu,android-activity,Android,Menu,Android Activity,我的主要活动是不断地从客户那里接收数据。它在右上角有三个菜单项,分别是关于、设置和主页。这三个菜单选项卡在所有三个屏幕中都可见,即主屏幕(MainActivity类)、关于页面和设置页面。 单击主菜单项,我编写了以下代码 case R.id.menu_Home: Intent intent = new Intent(this, MainActivity.class); startActivity(intent); 我的问题是,如果我从任何屏幕单击主菜单项

我的主要活动是不断地从客户那里接收数据。它在右上角有三个菜单项,分别是关于、设置和主页。这三个菜单选项卡在所有三个屏幕中都可见,即主屏幕(MainActivity类)、关于页面和设置页面。 单击主菜单项,我编写了以下代码

    case R.id.menu_Home:
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);

我的问题是,如果我从任何屏幕单击主菜单项,我是否重新启动活动?如果是,请为我提供一些指导,告诉我如何在单击主菜单项时转到主活动屏幕而不重新启动它,因为我不能通过反复重新启动活动来丢失数据。

您不应该将活动作为数据源,因为它随时都可能被操作系统杀死。您可以使用
SharedReferences
LiteSQL
或任何其他工具来保存活动状态,并在您的
onResume
方法中使用此数据重新创建活动状态。

检查当前活动是否为您的
mainActivity
,然后启动意图

case R.id.menu_Home:
if(!(this.getClass().getSimpleName()==MainActivity)){
Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
}

除了在MainActivity中所做的之外,您还可以这样做:

  • 在MainActivity中,从以下内容开始您的其他活动:

    Intent intent = new Intent(this, AboutPage.class);
    startActivityForResult(intent, 10);
    

  • 在这两个称为“活动”的活动中,请执行以下操作:

    case R.id.menu_Home:
        setResult(SOME_NUMBER_FROM_ABOUT);
        finish();
    

    这将带你回到主要活动

  • 在MainActivity中重写onActivityResult():

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        switch(requestCode) {
            case 10:
                //handle returning from About page
                //you can also check for resultCode
                //if (resultCode == SOME_NUMBER_FROM_ABOUT) {
                //    some code here
                //}
                break;
    
            case 20:
                //handle returning from Settings page
                break;    
        }
    

  • 请记住,在类名中调整此值,并且“关于”中的某个“编号”是一个整数,您可以选择它是什么。

    是的,您正在重新启动并创建主活动的新实例。 这可能会有帮助:

    在主活动中,当从菜单中选择“主页”选项时,您无需执行任何操作,因为主活动已加载并正在运行。您当前的代码将创建并启动活动的新实例

    //in MainActivity
    case R.id.menu_Home: 
        break;
    
    你也应该考虑从主活动菜单上删除“回家”选项,因为它没用。这可以通过创建不同的菜单来实现,而不使用主活动的home选项,并从主活动中进行充气

    //in MainActivity
    case R.id.menu_Home: 
        break;
    
    在所有其他活动中,您现有的代码应该可以正常工作。 但是,如果在加载任何新活动之前使用finish()完成每个活动(主活动除外),则活动堆栈将仅由主活动和当前正在运行的活动组成。在这种情况下,您可以使用以下代码从任何其他活动返回到主活动。这样,您仍然可以重新启动主活动,但可能不必重新创建它

    //In other activities    
    case R.id.menu_Home: 
        finish();
    

    试着这样做:

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_Home:
            if (!(this instanceof MainActivity)) {
                finish();
            }
    
            break;
        case R.id.settings:
            if (!(this instanceof Settings)) {
                if(!(this instanceof MainActivity))
                                finish();
                    Intent intent = new Intent(this, Settings.class);
                startActivity(intent);
            }
    
            break;
    
        default:
            break;
        }
    
    流程将是:

    If 
    
    您在MainActivity上,并且选择了MainActivity不执行任何操作

    else 
    
    完成你正在进行的任何活动

    If 
    
    您正在“设置”活动中,并且已选择“设置”“不执行任何操作”

    else if
    
    您处于“主活动”状态,只需启动“设置”活动

    else 
    
    无论你身在何处,完成并开始设置

    Do same with others
    
    此流程将确保您只在主活动上创建一个活动,而不再创建它。 您进入下一个活动,每次返回时都会完成该活动。

    是否“设置”和“关于”也是活动?
    //in MainActivity
    case R.id.menu_Home: 
        break;