2016-12-22 39 views
0

我有一个关于生命周期的问题。等待活动被破坏

我有2项活动。 (只要称它为A和B)。 在A这是MainActivity我有一个button称为活动B. 在活动B,按下后退按钮将调用finish()

当我打电话给finish()时,可以等一会儿再打电话给B,没关系。 但是,当我打电话finish()并立即不是再次B键 以前B的onDestroy()被称为新B的onCreate()onResume()

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

​​

所以,如果我按回来并再次呼叫B快速,它恢复以前的声音短而不是停止。 另一个类控制着mediaPlayer,所以我无法删除静态字段。

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

+1

你就不能完成之前(手动)发布媒体播放器?正如你已经检查为空这应该不是一个问题 – Leandro

回答

3

没有为应用类,在这里你可以知道哪些活动创建和被毁坏的一个ActivityLifeCycleCallBack Listner

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

0

onDestroy()被调用时,您无法控制,因此等待它不起作用。

在你的情况,你要么在onPause()调用mediaPlayer.release()onResume()创建它,或让它独立存在活动的整个生命周期的

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线程上,实际上​​可以从++/- 方法中删除,因为只有onCreate/onDestroy的顺序是问题,而不是同时运行它们。

我也建议拨打super.on<EndingEvent>()在重写处理程序结束时调用,而不是在开始时调用(您可能永远不会遇到真正的错误,但它有意义,如果您阅读源代码“程序上“记住)。


警告:如果您没有收到正确配对的onCreate /的onDestroy,计数器可能陷入不同步的价值......也许它不会做太多的伤害,因为你根本就没有发布过玩家然后。但是我一般都很熟练地用Android OS调用onCreate/onDestroy,除非整个OS已经处于崩溃的边缘。

+0

感谢您的答案。也很有帮助。 –

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

    }) 
} 

的“B.destroyed == 0”部分将等到B被销毁,然后它会开始新的意图。

注:还有isDestroyed()方法API17,您可以在活动B呼叫开始,水木清华这样的:https://developer.android.com/reference/android/app/Activity.html#isDestroyed()

+0

好..是不是含有潜在的ANR? –

+0

该按钮放置在活动A中,B在不到1秒的时间内被销毁。我不明白这是如何抛出ANR的? –

+0

我明白了。感谢您的回答。 –