应用程序在按下后退键时强制关闭

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 评论,这和我说的一样,我认为是正确的答案。

以上是关于应用程序在按下后退键时强制关闭的主要内容,如果未能解决你的问题,请参考以下文章

颤振:如何在按下后退按钮时不退出应用程序

如何防止 onPause() 之后调用 onDestroy()?

如何在按下单个片段的手动后退按钮时返回上一个片段?

手电筒应用程序在后台关闭

如何仅在按下键时更改值?

iPhone如何在按下音量键时隐藏音量覆盖