0

在我们的 Android 应用程序中,我通过在 *ContactsContract.Contacts.CONTENT_URI* 上使用 Intent 操作 *ACTION_PICK* 来实现联系人选择。这种方法工作正常(大部分),但不幸的是我无法控制传入的事件活动。

当应用程序强制进入后台时,它必须注销并退出。目前它是通过使用活动事件实现的:主要活动的onStop(),但显然如果系统中的联系人活动打开,应用程序将不会收到该事件。

我试图以某种方式对联系人活动进行子类化,但恐怕无法对其进行管理。

我尝试使用不同的活动开始标志,但在这种情况下找不到任何相关标志(更不用说标志不适用于startActivityForResult()方法)。

我试图挂钩不同的广播事件,但有太多的可能性最终将应用程序推到后台。

我发现了一些在顶部轮询应用程序的技巧,但这需要 GET_TASKS 许可,而且通常无论如何这将是一个重大黑客攻击。我宁愿不去那里。

所以,总结一下我的问题:

有没有办法在联系活动打开时检测到应用程序被强制执行到后台?

4

2 回答 2

0

最后,我的同事找到了答案:

将以下属性添加到主要活动:

android:launchMode="singleTask"
android:clearTaskOnLaunch="true"

在联系人选择打开时用户按下主页按钮并重新启动应用程序后,将在主活动上触发一个新事件:

public void onNewIntent(Intent newIntent)

取消结果代码仍然像用户在联系人选择活动上按下后退按钮时一样返回,但在这种情况下,不会触发此特定事件。通过这种方式,我可以区分用户关闭联系活动和系统关闭联系活动的情况。

于 2012-06-27T01:05:04.617 回答
0

您所做的是等待结果,当返回联系人时,联系人应用程序将使用数据创建一个新意图,然后在您的应用程序中您应该使用类似 onActivityResult 的东西(对不起,我不记得实际的方法)

在资源下查看 Android 开发者网站,在基本或高级培训中,有一些关于与其他应用程序通信的信息


编辑

import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Email;

private static final int CONTACT_PICKER_RESULT = 1001;
private boolean chooseContact = false;
private boolean returned = false;

public void doLaunchContactPicker(View view) {
    Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
            Contacts.CONTENT_URI);
    startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
    chooseContact = true;
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
        case CONTACT_PICKER_RESULT:
            // handle contact results
            break;
        }

    } else {
        // gracefully handle failure
        Log.w(DEBUG_TAG, "Warning: activity result not ok");
    }
}

@Override
public void onResume(){
    super.onResume();
    if(contactChoose && !returned){
            finish();
    }
}
于 2012-06-13T01:07:14.583 回答