安卓手机上的返回按钮保存联系人而非返回应用程序

4
我已经搭建了一个使用cordova创建新联系人的应用程序。我为此创建了一个自定义的Cordova插件,通过启动Intent来打开联系人创建屏幕并填充一些字段。然而,当在此屏幕上按下返回按钮时,联系人会被保存,而不是返回到应用程序。这是预期行为吗?是否有办法停止它?
启动联系人创建屏幕的代码如下:
private void createContact(String fullname, String phone, String company) {
    Context context=this.cordova.getActivity().getApplicationContext();
    Intent i = new Intent(Intent.ACTION_INSERT);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 
    i.setType(ContactsContract.Contacts.CONTENT_TYPE);
    i.putExtra(ContactsContract.Intents.Insert.NAME, fullname);
    i.putExtra(ContactsContract.Intents.Insert.PHONE, phone);
    i.putExtra(ContactsContract.Intents.Insert.COMPANY, company);
    context.startActivity(i);
}

你正在使用操作系统的创建联系人屏幕吗? - Anoop
@Anoop 是的,该意图启动本机创建联系人屏幕并填写一些字段。 - Valyrion
为什么需要使用Intent标志FLAG_ACTIVITY_MULTIPLE_TASK?您可以尝试删除该标志并观察行为。根据文档,您应该提供一种让用户返回您启动的任务的方法。 - Manish Mulimani
@ManishMulimani 我已经将其删除,但行为仍然保持不变。只有当我选择明确放弃更改时,它才能正确返回应用程序,返回按钮仍会保存联系人。 - Valyrion
这似乎是标准行为,至少对于处理“ACTION_INSERT”或“ACTION_INSERT_OR_EDIT”的Google应用程序来说是如此。例如,联系人和日历应用程序就是这样工作的。 - matiash
1个回答

1
这是预期行为。您可以在“联系人”应用程序的源代码中进行检查。
清单文件中,我们可以确定处理此意图的活动是ContactEditorActivity。内部它使用ContactEditorFragment,几乎处理了所有事情。
当您按保存按钮时,执行的代码是:
        View saveMenuItem = customActionBarView.findViewById(R.id.save_menu_item);
        saveMenuItem.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mFragment.doSaveAction();
            }
        });

Fragment类中doSaveAction()的实现如下:

public void doSaveAction() {
    save(SaveMode.CLOSE);
}

你可能感兴趣的是,Activity 的 onBackPressed() 方法也会保存。
@Override
public void onBackPressed() {
    mFragment.save(SaveMode.CLOSE);
}

所以,基本上,保存并退出执行的是完全相同的代码。

注意:我认为问题(从您的角度来看)在于联系人已保存。关于“不返回应用程序”的部分,答案要简单得多:只需删除FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_MULTIPLE_TASK标志。

FLAG_ACTIVITY_NEW_TASK指示Android在新任务中启动Activity,该任务与启动它的应用程序完全独立运行(因此,在按下返回键时不会返回到它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接