【问题标题】:Android - Activity finish() results black screenAndroid - Activity finish() 结果黑屏
【发布时间】:2019-06-20 11:49:25
【问题描述】:

我有一个AlertActivity 和一个Activity。收到广播后,两个活动都需要完成。但是如果AlertActivity 在Activity 之上,则下面的代码会导致黑屏。

下面是Activity中的代码:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("BROADCAST_INTENT")){
           if(alertActvity != null)
               alertActivity.finish();
           finish();
    }
}

和AlertActivity中的代码:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("BROADCAST_INTENT"))
           finish();
    }
}

首先,Activity的onStop()在AlertActivity的onStop()被调用之前被调用,这导致黑屏,甚至AlertActivity的finish()在Activity的finish()之前被调用。

请在这方面帮助我。

【问题讨论】:

    标签: java android performance


    【解决方案1】:

    最后,我找到了解决方案:

    以 1 秒的延迟完成 Activity,这确实有效。到时候AlertActivity完成,黑屏就不能显示了。

    new Handler().postDelayed(new Runnable() {
          @Override
              public void run() {
                  finish();
              }
    }, 1000);
    

    【讨论】:

    • 你不需要添加 1 秒的延迟,只需向消息队列发布一个 runnable 也可以修复此错误。
    【解决方案2】:

    在AlertActivity 和Activity 中,您正在检查相同的操作“BROADCAST_INTENT”,我假设您在各自的类中注册了两个接收器。

    如果你这样做了,那么实际上你有两个广播接收器在等待同一个事件。当这个事件发生时,你的两个接收者都会得到它。

    所以在你的AlertActivity 中完成了两次。

    【讨论】:

    • 是的,两个接收器都在自己的类中。这就是问题所在.. 首先Activity 正在接收广播,调用AlertActivityfinish() -> 调用AlertActivity 的onPause() -> 然后调用Activity 的finish() ->同时,AlertActivity收到广播->ActivityonStop(),on Destroy()被调用->然后AlertActivity的onStop(),onDestroy()被调用。
    • 在Activity 的onStop() 和AlertActivity 的onStop() 之间有大约一秒的延迟
    • 您不需要在 AlertActivty 中完成(),而只需从 Activity 中将其关闭 if(alertActvity != null) alertActivity.dismiss();
    • 我需要在AlertActivity 的广播中使用finish(),因为如果AlertActivity 仅在前台并接收广播,那么我还需要finish()。 AlertActivity.dismiss() 是什么意思?最后它会调用finish()...不是吗?
    • 是的,dismiss() 最终会导致finish()。并且您还需要从 AlertActivity 中删除广播接收器。您对 AlertActivity 前台的看法,它不适用,因为您可以看到,即使您的 Activity 在后台,它的接收器也会被调用。所以其实没关系。是吗?
    【解决方案3】:

    我认为@Amit K. Saha 是对的,你的AlertActivity 可能会完成两次

    解决方案:

    如果您的应用程序正在运行 >= API 16,那么您可以使用 finishAffinity() 方法:

    在当前任务中完成此活动以及紧接其下的所有活动,这些活动具有相同的亲和力。这通常在应用程序可以启动到另一个任务时使用(例如从它理解的内容类型的 ACTION_VIEW)并且用户已经使用向上导航切换出当前任务并进入它自己的任务。在这种情况下,如果用户向下导航到第二个应用程序的任何其他活动,则所有这些活动都应作为任务切换的一部分从原始任务中删除。

    请注意,此完成不允许您将结果交付给 以前的活动,如果您尝试,将引发异常 这样做。

    您可以从AlertActivity 调用finishAffinity(),因为它位于Activity 之上。这将完成AlertActivity 以及Activity

    【讨论】:

    • 但问题是Activity 甚至在AlertActivity 接收广播之前就先完成了。请检查我的 cmets 以获得 Amit K. Saha 的答案....
    • 尝试从 Activity 中删除 ` if(alertActvity != null) alertActivity.finish();` 代码,并使用 finishAffinity()
    • 我试过了,但仍然显示空白屏幕...这也不起作用哥们...
    【解决方案4】:

    我的透明Activity完成结果黑屏,搜索后发现是Android 4.4的Activity切换动画造成的。但是android 5.1以上的现象并没有出现。 所以我添加了以下代码:

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(0, 0);
    }
    

    完成后黑屏消失了。 我认为这可能会有所帮助。

    【讨论】:

      【解决方案5】:

      试试这个

      private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
      
      @Override
      public void onReceive(Context context, Intent intent) {
          if(intent.getAction().equals("BROADCAST_INTENT"))
             context.finish();
          }
      }
      

      【讨论】:

      • 你试过context.finish();吗?你可以检查一次吗?
      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多