我是否需要包含默认的Intent才能返回上一个Activity?

时间:2014-02-17 22:18:11

标签: java android

我正在开发一个待办事项列表Android应用程序(它恰好用于课堂作业,但这不是我要求的 - 我试图省尽尽可能多的代码)。主屏幕显示ToDo项目列表,底部有一个按钮,用于打开Add New ToDo Item屏幕。

Initial ToDo List view

在Add New ToDo Item屏幕上,有一个Cancel按钮。

Add New ToDo Item view

相关ToDoManagerActivity.java片段:

public void onCreate(Bundle savedInstanceState) {
        // Init and setup adapter, etc.

        footerView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(ToDoManagerActivity.this, AddToDoActivity.class);
                startActivityForResult(intent, ADD_TODO_ITEM_REQUEST);
            }
        });

        // Attach the adapter to this ListActivity's ListView
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    log("Entered onActivityResult()");

    // Check result code and request code.
    // If user submitted a new ToDoItem
    // Create a new ToDoItem from the data Intent
    // and then add it to the adapter
}

相关的AddToDoActivity.java片段:

protected void onCreate(Bundle savedInstanceState) {
    // Initialize default view, handle other events, etc.

    final Button cancelButton = (Button) findViewById(R.id.cancelButton);
    cancelButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            setResult(RESULT_CANCELED, new Intent());
            finish();
        }
    });
}

以上代码有效。以前,我在onClick的{​​{1}}处理程序中尝试此操作:

cancelButton

当我点击取消按钮时,我可以看到日志中已到达public void onClick(View v) { finishActivity(RESULT_CANCELED); } ,但屏幕未恢复到主要待办事项列表屏幕。

为什么上面的代码没有将我返回到上一个屏幕,但以下代码确实将我返回到上一个屏幕?我对任务后台/活动的误解是什么?

onActivityResult

3 个答案:

答案 0 :(得分:1)

根据documentation

  

public void finish()

     

在您的活动完成后调用此选项并应关闭。 ActivityResult会传播回通过您发送给您的任何人   onActivityResult()。

  

public void finishActivity(int requestCode)

     

强制完成之前使用startActivityForResult(Intent,int)启动的另一个活动。

您应致电finish()以关闭当前活动,并finishActivity()关闭您使用startActivityForResult(Intent intent, int requestCode)开始的其他活动。在当前活动上调用finishActivity()不会关闭它。

此外,为Intent创建新的setResult()没有意义,因为您没有传回任何数据。这样做就足够了:

setResult(RESULT_CANCELED);
finish();

答案 1 :(得分:0)

来自Android文档:

  

public void finishActivity(int requestCode)   强制完成您之前使用startActivityForResult(Intent,int)启动的另一个活动。

finishActivity不会完成当前活动,但会调用使用requestCode

调用的活动的完成

答案 2 :(得分:0)

如果您查看finishActivity()的{​​{3}},则表示会强制完成以startActivityForResult()开头的活动,但您必须传入您曾经开始使用的请求代码另一项活动。在您的情况下,它将是ADD_TODO_ITEM_REQUEST

这可能不是您要使用的API。你的第二种方法更清洁,因为你不需要强制关闭子活动,而是让它以正常方式完成。