应用程序在按下后退键时强制关闭
Posted
技术标签:
【中文标题】应用程序在按下后退键时强制关闭【英文标题】:App getting force closed on Back Key pressed 【发布时间】:2012-12-04 14:03:01 【问题描述】:我正在开发一个 VCard 应用程序。在这里,我已经开始了默认联系人活动(通讯录)。
现在,申请流程是这样的,
用户启动应用程序。 默认通讯录已打开。 用户从列表中选择一个联系人,然后创建所选联系人的 Vcard。现在,当用户在没有选择任何联系人的情况下按下Back Button
,应用程序将被强制关闭。
我已经覆盖了BackKeyPress()
事件,但它不起作用。该应用程序仍在强制关闭。
我发布代码供参考,
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 1);
Log.d("In Oncreate", "Activity Result");
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if (keyCode == KeyEvent.KEYCODE_BACK)
//preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
Toast.makeText(getApplicationContext(), "Back Pressed", 5000).show();
finish();
return true;
return super.onKeyDown(keyCode, event);
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data)
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode)
case (1) :
counter = "Yes";
Log.d("My Tag", data.getExtras().keySet().toString());
name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME");
Log.d("My Tag", name_selected));
Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class);
i.putExtra("name", name_selected);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(i);
Logcat 错误:-
12-17 18:41:09.399: E/AndroidRuntime(23456): FATAL EXCEPTION: main
12-17 18:41:09.399: E/AndroidRuntime(23456): java.lang.RuntimeException: Failure delivering result ResultInfowho=null, request=1, result=0, data=null to activity com.android.business/com.android.business.ReadContacts: java.lang.NullPointerException
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.access$2000(ActivityThread.java:117)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.os.Looper.loop(Looper.java:123)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.main(ActivityThread.java:3729)
12-17 18:41:09.399: E/AndroidRuntime(23456): at java.lang.reflect.Method.invokeNative(Native Method)
12-17 18:41:09.399: E/AndroidRuntime(23456): at java.lang.reflect.Method.invoke(Method.java:507)
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
12-17 18:41:09.399: E/AndroidRuntime(23456): at dalvik.system.NativeStart.main(Native Method)
12-17 18:41:09.399: E/AndroidRuntime(23456): Caused by: java.lang.NullPointerException
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.Activity.dispatchActivityResult(Activity.java:3908)
12-17 18:41:09.399: E/AndroidRuntime(23456): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
这里用户应该从列表中选择一个联系人,但如果用户在没有选择任何联系人的情况下按下返回按钮,应用程序将被强制关闭。
【问题讨论】:
嗯,让我发布 logcat 错误。 我猜问题出在您包含 对所选联系人进行一些操作 的位置。所以一定要显示代码 你没有测试 resultCode。我假设您执行了一些操作(由于某些奇怪的原因,您认为这些操作与您的问题无关(而快速查看堆栈跟踪(显然您没有采取)会告诉您否则))包括处理接收数据,接下来很可能是 NPE 或 SIOOBE 或其他东西。 com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133) 这是哪一行?onActivityResult()
这里有代码// Do some operations on the selected contact
吗?
【参考方案1】:
使用这个...
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data)
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode)
case 1:
if(data!=null&&resultCode==RESULT_OK)
counter = "Yes";
Log.d("My Tag", data.getExtras().keySet().toString());
name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME");
Log.d("My Tag", name_selected));
Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class);
i.putExtra("name", name_selected);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(i);
【讨论】:
【参考方案2】:在您的 OnActivityResult() 中执行此操作..
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data)
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode)
case (1) :
if (data != null && resultCode == RESULT_OK)
counter = "Yes";
// Do some operations on the selected contact
【讨论】:
@user370305 如果用户按下返回按钮,你会得到一个 RESULT_CANCELED,所以这个答案是正确的。 是的,这个答案已经奏效了。现在,当按下后退按钮时,前一个活动被打开(它已经通过了打开联系人活动的意图。但是,我使用了@Shyish 所说的 RESULT_CANCELED 来跟踪用户何时从应用程序中逃脱。谢谢你们俩 【参考方案3】:由于在 onActivityResult 方法的第 133 行中抛出 NullPointerException,您的应用程序被强制关闭。检查结果是否有效,并在其中放入一些 try catch。
12-17 18:41:09.399: E/AndroidRuntime(23456): Caused by: java.lang.NullPointerException
12-17 18:41:09.399: E/AndroidRuntime(23456): at com.android.business.ReadContacts.onActivityResult(ReadContacts.java:133)
【讨论】:
【参考方案4】:I have overidden BackKeyPress() event, but its not working. The app is still getting force closed.
因为backKeyPressed()
事件响应Default Contacts activity(Address Book)
。不适用于您的 Android 应用程序的 Activity。
正如我看到你的代码 onActivityResult()
和 没有任何 logcat 错误我认为这个崩溃可能发生在 Default Contacts activity(Address Book)
端而不是你的应用程序端。此外,您必须检查 Default Contacts activity(Address Book)
是否处理了 onActivityResult()
的任何 Intent
(结果意图)作为对其他应用程序的响应目的。
所以 logcat 错误在这里会更有帮助。
编辑:
是的,我有一个疑问,您的结果数据是NULL
在对Intent
进行操作之前,只需检查data
是否为null,
if(data != null)
Log.d("My Tag", data.getExtras().keySet().toString());
name_selected = data.getExtras().getString("android.intent.extra.shortcut.NAME");
Log.d("My Tag", name_selected));
Intent i = new Intent(getApplicationContext(), BusinessCardActivity.class);
i.putExtra("name", name_selected);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(i);
【讨论】:
我认为你是对的,因为应用程序只有在从联系人活动中按下时才会强制关闭。我将发布代码,我正在对选定的联系人执行操作。 this 和@Pradeep 的答案都是非常好的方法,因为您应该检查结果代码是否正确(RESULT_OK)并检查接收到的数据是否不为空(这不应该发生,但值得)。 我发现它因为 name_selected 而失败。按下后退按钮时,结果为空。 @user370305 是的,你说得对,我也必须进行 Intent null 检查。谢谢你我更新了我的答案【参考方案5】:您是否正在处理没有选定联系人的情况?如果用户按下并没有选择联系人,则在您的 onActivityResult 中您应该处理“联系人”为空。
【讨论】:
我不明白为什么我的回答是否定的。但是,检查@njzk2 评论,这和我说的一样,我认为是正确的答案。以上是关于应用程序在按下后退键时强制关闭的主要内容,如果未能解决你的问题,请参考以下文章