等待活动被破坏

时间:2016-12-22 12:39:59

标签: android android-lifecycle

我对生命周期有疑问。

我有2项活动。 (只需称它为A和B)。 在MainActivity的A中,我有一个button来调用活动B. 在活动B,按后退按钮将调用finish()

关键是我可以拨打finish(),等待一段时间再打电话给B,没关系,没关系。 但是当我拨打finish()并立即再次呼叫B时 在新B onDestroy()onCreate()后,之前的B onResume()被称为

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

@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,则会恢复之前的声音短暂停止。 另一个类控制mediaPlayer,因此我无法删除 static 字段。

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

4 个答案:

答案 0 :(得分:3)

Application类有一个ActivityLifeCycleCallBack Listner,您可以在其中了解创建的哪个活动 Destroyed

这有助于您轻松实现当前逻辑Application.ActivityLifecycleCallbacks

答案 1 :(得分:1)

您可以引入计数锁定,例如:

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>()在被覆盖的处理程序的末尾调用,而不是在它的开头调用(你可能永远不会遇到真正的错误,但是如果你读的话,这只是有意义的来源&#34;程序上&#34;记住。)

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

答案 2 :(得分:0)

您无法控制何时调用onDestroy(),因此等待它将无效。

在您的情况下,您应该在mediaPlayer.release()中致电onPause()并在onResume()中创建,或者将其保留在活动的生命周期中

答案 3 :(得分:0)

嗯,我认为这可行:

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);
          }

     })
}

&#34; B.destroyed == 0&#34;部分将等待B被销毁,然后它将开始新的意图。

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