在我们的Android应用程序中,我使用* ContactsContract.Contacts.CONTENT_URI *上的Intent动作* ACTION_PICK *实现了联系人选择。这种方法很好(大多数情况下),但不幸的是我无法控制传入的事件活动。
应用程序必须注销并在后台强制执行时退出。目前,它是通过使用活动事件实现的: onStop()用于主要活动,但显然,如果系统中的联系人活动已打开,则应用程序将不会收到该事件。 / p>
我试图以某种方式对联系活动进行子类化,但我担心它无法管理。
我尝试使用不同的活动开始标志,但是找不到这种情况的任何相关标志(更不用说标志不能与 startActivityForResult()方法一起使用。)
我试图挂钩不同的广播事件,但有太多的可能性最终将应用程序推到后台。
我已经找到了一些在顶部轮询应用程序的技巧,但这需要GET_TASKS权限,而且通常它仍然是一个主要的黑客攻击。我宁愿不去那里。
所以,总结一下我的问题:
在联系活动开放时,有没有办法检测到应用程序是否在后台执行?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
最后,我的同事找到了答案:
将以下属性添加到主要活动:
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
用户在联系人选择打开后按下主页按钮并重新启动应用程序后,将在主要活动上触发新事件:
public void onNewIntent(Intent newIntent)
取消结果代码仍然类似于用户按下联系人选择活动上的后退按钮时返回,但在这种情况下,不会触发此特定事件。 通过这种方式,我可以区分用户关闭联系活动和系统关闭时的情况。