在联系人活动打开时进入后台时退出应用程序
Posted
技术标签:
【中文标题】在联系人活动打开时进入后台时退出应用程序【英文标题】:Quitting the app when goes to the background while the contact activity is open 【发布时间】:2012-06-15 22:33:13 【问题描述】:在我们的 android 应用程序中,我通过在 *ContactsContract.Contacts.CONTENT_URI* 上使用 Intent 操作 *ACTION_PICK* 来实现联系人选择。这种方法工作正常(大部分情况下),但不幸的是我无法控制传入的事件活动。
应用在后台强制执行时必须注销并退出。目前它是通过使用活动事件实现的:onStop() 用于主要活动,但如果系统中的联系人活动打开,应用程序显然不会收到该事件。
我试图以某种方式对联系人活动进行子类化,但恐怕无法对其进行管理。
我尝试使用不同的活动开始标志,但找不到与这种情况相关的任何标志(更不用说标志不适用于 startActivityForResult() 方法)。
我试图挂钩不同的广播事件,但有太多的可能性最终会将应用程序推到后台。
我发现了一些在顶部轮询应用程序的技巧,但这需要 GET_TASKS 权限,而且通常无论如何这将是一个重大黑客攻击。我宁愿不去那里。
所以,总结一下我的问题:
有什么方法可以检测到应用程序在联系人活动打开时被强制执行到后台?
【问题讨论】:
【参考方案1】:您所做的是等待结果,当返回联系人时,联系人应用程序将使用数据创建一个新的意图,然后在您的应用程序中您应该使用类似 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();
【讨论】:
恐怕你误解了我的问题。我知道如何恢复联系,那很好。我在寻找什么:当它进入后台时,我必须完全退出应用程序。如果联系人活动已打开并且我按下主页按钮(例如),那么当我再次启动应用程序时,它仍会返回到联系人活动。我必须防止这种情况发生。 也许你可以在尝试获取联系人时设置一些布尔值,如果它没有收到结果,那么在 onStart 中你可以检查它是否有它以及是否布尔值为真,如果结果不存在但布尔值存在,则您可以完成应用程序。你知道我在哪里吗? 也可能有一种方法可以获取用于打开应用程序的意图,无论是启动应用程序的意图还是结果。 感谢您的提示。在联系人选择活动打开的同时,我无法查明是否发生了任何事情。当我按下主页按钮时,启动一些应用程序,然后再次启动我们的应用程序,它会从它离开的地方继续:我可以取消活动或选择一个联系人。此外,我无法找到可用于启动应用程序的意图。理论上它应该是“android.intent.category.LAUNCHER”类别中的“android.intent.action.MAIN”,但我无法使用 Intent 过滤器接收这些操作。 我可以给你一个赞成票,但你的建议不起作用。所以我还在寻找这个问题的解决方案……【参考方案2】:我的同事终于找到了答案:
将以下属性添加到主活动:
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
在联系人选择打开时用户按下主页按钮并重新启动应用程序后,将在主活动上触发一个新事件:
public void onNewIntent(Intent newIntent)
取消结果代码仍然返回,就像用户在联系人选择活动上按下后退按钮时一样,但在这种情况下,不会触发此特定事件。 这样我就可以区分用户关闭联系活动和系统关闭活动的情况。
【讨论】:
以上是关于在联系人活动打开时进入后台时退出应用程序的主要内容,如果未能解决你的问题,请参考以下文章