等待activity销毁

Wait for activity is destroyed

我有一个关于生命周期的问题。

我有 2 个活动。 (就叫它 A 和 B)。 在 MainActivity A 中,我有一个 button 调用 Activity B。 在 activity B 处,按下后退按钮将调用 finish().

关键是当我调用finish()时没问题,稍等片刻再调用B,没问题。 但是当我调用 finish() 并立即再次调用 B 时 以前的 B 的 onDestroy() 在 之后被称为 新的 B 的 onCreate(), onResume().

这对我来说是个问题,因为我在 onResume()onPause()... 到处处理一些静态 MediaPlayer

@Override
protected void onResume(){
    super.onResume();

    if (mediaPlayer != null)
        mediaPlayer.start();
}

@Override
protected void onPause(){
    super.onPause();

    if(mediaPlayer != null)
        mediaPlayer.pause();
}

@Override
protected void onDestroy(){
    super.onDestroy();
    if(mediaPlayer != null)
        mediaPlayer.release();
        mediaPlayer = null;
}

因此,如果我按回键并再次快速呼叫 B,它会恢复之前的短促声音,然后停止。 另一个 class 控制 mediaPlayer 所以我不能删除 static 字段。

我想我可以通过等待 onDestroy() 来解决这个问题。 有没有办法让MainActivity(A)等到B完全销毁?

您无法控制 onDestroy() 何时被调用,因此等待它是行不通的。

在您的情况下,您应该在 onPause() 中调用 mediaPlayer.release() 并在 onResume() 中创建它,或者让它独立于活动的生命周期存在

可以引入计数锁,比如:

class X extends Activity {

    private static int runningTimes = 0;

    private synchronized void lockPlayer() {
        ++runningTimes;
    }

    private synchronized boolean releasePlayer() {
        return (0 == --runningTimes);
    }

    @Override
    onCreate(...) {
        super.onCreate(...);
        lockPlayer();
    }

    @Override
    protected void onDestroy(){
        if(releasePlayer() && mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        super.onDestroy();
    }

}

我认为两个活动 运行 在 onCreate/onDestroy 中的同一个 UI 线程上?因为建议的同步不够健壮,无法真正并行执行。如果它们在同一个 UI 线程上,实际上 synchronized 可以从 ++/-- 方法中删除,因为只有 onCreate/onDestroy 的顺序是问题,而不是同时 运行 其中。

我还建议调用 super.on<EndingEvent>() 以在重写处理程序的末尾调用,而不是在它的开头调用(您可能永远不会遇到真正的错误,但它只是有意义,如果你读了来源 "procedurally" 记住了)。


警告:如果您没有收到正确配对的 onCreate/onDestroy,计数器可能会进入未同步值...可能不会造成太大伤害,因为您根本不会释放播放器然后。但是我在 Android OS 可靠地调用 onCreate/onDestroy 方面有很好的经验,除非整个 OS 已经处于崩溃的边缘。

应用程序 class 有一个 ActivityLifeCycleCallBack Listner,您可以从中知道哪个 activity 是 创建的 哪个是 销毁.

这将帮助您轻松实现当前逻辑Application.ActivityLifecycleCallbacks

好吧,我认为这可行:

class B extends Activity {
     public static boolean destroyed = 1;
     .
     .
     .
     public void onCreate(Bundle args) {
          destroyed = 0;
          .
          .
          .
     }
     public void onDestroy() {
          .
          .
          .
          destroyed = 1;
     }
}
class A extends Activity {
     .
     .
     .
     buttonB.setOnItemClickListener(new OnItemClickListener() {
          public void onClick(View v) {
              while (B.destroyed == 0);
              Intent i = new Intent();
              .
              .
              .
              startActivity(i, B.class);
          }

     })
}

"B.destroyed == 0"部分会等到B被销毁,然后才会开始新的intent。

注意:从 API17 开始还有 isDestroyed() 方法,您可以在 activity B 上调用它,例如:https://developer.android.com/reference/android/app/Activity.html#isDestroyed()