Android - Activity finish()导致黑屏

4
我有一个 AlertActivity 和一个 Activity。当收到广播时,两个活动都需要结束。但是如果 AlertActivityActivity 顶部,则下面的代码会导致黑屏。
以下是在 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()方法会在AlertActivityonStop()方法之前被调用,这导致屏幕变黑,即使在AlertActivityfinish()方法被调用之前,Activityfinish()方法已经被调用。

请帮我解决这个问题。

5个回答

4

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

延迟1秒钟完成一个Activity,这真的很有效。在那个时候,AlertActivity已经完成,黑屏不会再出现。

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

你不需要添加1秒的延迟,只需将可运行对象发布到消息队列中即可解决此错误。 - wqycsu

0

我的透明Activity结束后出现黑屏,经过搜索,发现这是由于Android 4.4中的Activity切换动画引起的。但在Android 5.1以上版本中,这种现象不会出现。 因此,我添加了以下代码:

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

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


0

就像在AlertActivityActivity中,您都检查了相同的操作"BROADCAST_INTENT",我假设您在它们各自的类中注册了两个接收器。

如果是这样,那么实际上您有两个等待相同事件的广播接收器。当此事件发生时,您的两个接收器都将收到它。

因此,在您的AlertActivity中会被两次完成。


是的,两个接收器都在它们自己的类中。这就是问题所在... 第一个 Activity 接收广播,调用 AlertActivity 的 finish() -> AlertActivityonPause() 被调用 -> 然后调用了 Activityfinish() -> 同时,AlertActivity 接收到广播 -> ActivityonStop()onDestroy() 被调用 -> 然后调用了 AlertActivityonStop()onDestroy() - Avadhani Y
ActivityonStop()AlertActivityonStop()之间大约有一秒钟的延迟。 - Avadhani Y
如果(alertActivity != null),你不需要在AlertActivity内部调用finish(),而只需从Activity中dismiss它。 - Amit K. Saha
我需要在AlertActivity的广播中也调用finish(),因为如果AlertActivity仅在前台接收广播,那么我也需要finish()。你所说的AlertActivity.dismiss()是什么意思?最终它会调用finish(),不是吗? - Avadhani Y
是的,我已经从AlertActivity中删除了BroadcastReceiver。即使如此,仍然会显示空白屏幕... - Avadhani Y
显示剩余2条评论

0

我认为@Amit K. Saha是正确的,你的AlertActivity可能会被结束两次。

解决方案:

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

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

请注意,此完成不允许您向先前的活动传递结果,如果您尝试这样做,将引发异常。

你可以从AlertActivity调用finishAffinity(),因为它位于Activity的顶部。这将完成AlertActivity以及Activity


但问题是,即使在AlertActivity接收广播之前,Activity也会首先被结束。请查看我的评论以获取Amit K. Saha的答案... - Avadhani Y
尝试从Activity中删除if(alertActvity != null) alertActivity.finish();代码,并使用finishAffinity() - Kushal
我试过了,但仍然显示空白屏幕...这个也不起作用,伙计... - Avadhani Y

-1

试一下这个

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals("BROADCAST_INTENT"))
       context.finish();
    }
}

你尝试过使用 context.finish(); 吗?可以再检查一下吗? - Avadhani Y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接