Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-Activity finish()结果黑屏_Java_Android_Performance - Fatal编程技术网

Java Android-Activity finish()结果黑屏

Java Android-Activity finish()结果黑屏,java,android,performance,Java,Android,Performance,我有一个警报活动和一个活动。当接收到广播时,两个活动都需要完成。但是,如果警报活动位于活动的顶部,则下面的代码会导致黑屏 以下是活动中的代码: private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equa

我有一个
警报活动
和一个
活动
。当接收到广播时,两个活动都需要完成。但是,如果
警报活动
位于
活动
的顶部,则下面的代码会导致黑屏

以下是
活动
中的代码:

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();
    }
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("BROADCAST_INTENT"))
           finish();
    }
}
警报活动中的代码

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();
    }
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("BROADCAST_INTENT"))
           finish();
    }
}
首先,在调用
AlertActivity
onStop()
之前调用活动的
onStop()
,这会导致黑屏,甚至在
活动
finish()之前调用
AlertActivity


请在这方面帮助我。

正如在
警报活动
活动
中一样,您正在检查相同的操作“广播意图”,我假设您在各自的类中注册了这两个接收器

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


所以在你的
警报活动中
完成了两次。

我认为@Amit K.Saha是对的,你的
警报活动
可能完成了两次

解决方案:

如果应用程序正在运行>=API 16,则可以使用
finishafinity()
方法:

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

请注意,此完成不允许您将结果交付给 上一个活动,如果您正在尝试,将引发异常 这样做

您可以从
AlertActivity
调用
finishafinity()
,因为它位于
活动的顶部。这将完成
警报活动
以及
活动

尝试此操作

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

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

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

以1秒的延迟完成一个
活动
,这确实有效。此时,
AlertActivity
完成,无法显示黑屏

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

我的透明活动完成结果黑屏,经过搜索,我发现这是由Android 4.4中的活动切换动画引起的。但在安卓5.1之上,这种现象并未出现。 因此,我添加了以下代码:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(0, 0);
}
完成后的黑屏消失了。
我认为这可能会有帮助。

是的,两位接受者都在各自的班级。这就是问题所在。。首先,
Activity
正在接收广播,调用
AlertActivity
finish()->
AlertActivity
onPause()
被调用->然后调用
Activity
finish()
被调用->同时,
AlertActivity
接收广播->
Activity
onStop()
,调用Destroy()
上的
on Destroy()
然后调用
AlertActivity
上的
onStop()
,调用
onDestroy()
。在
活动
onStop()
AlertActivity
上的
onStop()
之间大约有一秒的延迟,如果(alertActivity!=null)alertActivity.disease(),只需将其从活动中删除即可;我需要
finish()
AlertActivity
的广播中,因为如果
AlertActivity
仅在前台接收广播,那么我还需要
finish()
。您所说的
AlertActivity.Dislose()
是什么意思?最后,它将调用
finish()
。。。是吗?是的,dismise()最终将导致finish()。您还需要将广播接收器从AlertActivity中移除。你关于AlertActivity前台的观点不适用,因为你可以看到,即使我们的活动在后台,它的接收者也会被呼叫。所以实际上这并不重要。是吗?但问题是,
Activity
甚至在
AlertActivity
接收广播之前就已经完成了。请检查我的评论以获得Amit K.Saha答案…尝试删除'if(alertActivity!=null)alertActivity.finish();`从活动中编码,并使用
finishafinity()
我尝试了它,但仍然显示空白屏幕…这也不起作用,伙计…您是否尝试使用
context.finish()?你可以检查一下吗?你不需要增加1秒的延迟,只需在消息队列中发布一个runnable,也可以修复这个错误。