【问题标题】:Android: Terminate current activity and go back to MainActivityAndroid:终止当前活动并返回 MainActivity
【发布时间】:2018-11-18 15:10:21
【问题描述】:

我有两个活动。第一个 (MainActivity) 有一个 FloatingActionButton,它通过 Intent 启动第二个 (AddEntryActivity)。填写表格后,数据应通过 JSON(嵌套 asyncTask 类)发送。通过AddEntryActivity 的方法评估此asyncTask 的成功与否。
如果失败,它会发送一条消息。如果成功,它会发送一条消息(到目前为止一切正常)并应关闭此活动并返回到MainActivity

我读过很多类似的问题,例如:

并尝试过:

finish();
//super.finish();
//self.finish();
//AddEntryActivity.finish();

startActivity(new Intent(getApplicationContext(), MainActivity.class));

以及它们的组合或这个:

onBackPressed();

但没有一种方法适合我。这是MainActivity中第二个活动的调用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openAddRecordActivity();
        }
    });
}

public void openAddRecordActivity() {
    Intent intent = new Intent(this, AddEntryActivity.class);
    startActivity(intent);
}

成功祝酒出现(见下文),但从未返回到第一个活动。这是AddEntryActivity的调用方法(由AsyncTask的onPostExecute()):

    void processResult(String result) {
        if (result!=null) {

            String state = result.split("\\|")[0];
            String msg = result.split("\\|")[1];

            if (state == "200") {
                Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();


                finish();
                startActivity(new Intent(getApplicationContext(), MainActivity.class));
            } else {
                Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getBaseContext(), "No Result!", Toast.LENGTH_SHORT).show();
        }
  }

我没有做任何花哨的事情,但看不到我的错误。 如果您需要更多信息(例如 Manifest),请告诉我。

【问题讨论】:

  • 您能否在启动AddEntryActivity 时尝试传递Intent.FLAG_ACTIVITY_NEW_TASK,并在收到成功响应消息后使用onBackPressed() 方法?
  • 如果你从 main 开始你的第二个活动,并且你想传回一个结果,你应该首先使用startActivityForResult,然后在下一个使用setResultfinish
  • 我认为您的finish() 代码永远不会被调用。当涉及到字符串时,您应该使用 if ("200".equals(state)) 而不是 == 运算符。
  • 一个简单的finish() 应该会让你回到上一个活动。您不应该再次启动主要活动,因为这会将 2 个主要活动放在您的后台堆栈中。祝酒成功后会发生什么? AddEntryActivity 是否只停留在屏幕上?
  • 你能完整显示 AddEntryActivity 吗?

标签: android


【解决方案1】:

您可以使用startActivityForResult(new Intent(this, SecondActivity.class), 1010) 转到 SecondActivity,然后只要 AsyncTask 成功,只需将结果连同数据一起发送到 MainActivity,

Intent data = new Intent();
data.putExtra("mydata", "myData");
setResult(Activity.RESULT_OK, data);
finish();

然后在您的 MainActivity 中,

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 1010 && resultCode == Activity.RESULT_OK) {
                //get your data from Intent
            }
    }

【讨论】:

  • 哦,哇。这是工作。只是出于好奇:为什么需要传递结果?通常,第一个活动不需要任何反馈。给用户的 toast 消息就足够了。
  • @xentity 这完全是可选的,它只是告诉前一个活动结果是否正常的一种方式&据此,您可以交叉检查第一个活动的 onActivityResult();方法。另外如果回答对你有帮助,请采纳! :)
  • 当然,我应该接受这个作为解决方案,但我想知道,为什么我的简单尝试没有奏效?在许多其他问题中,解决方案是一个简单的finish(),我想还有一个更简单的方法。
  • @xentity 那是因为你在调用 finish();在调用 startActivity(); 之前,由于这个 Activity 被杀死 & startActivity();从未被调用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多