我对生命周期有疑问。
我有2项活动。 (只需称它为A和B)。
在MainActivity
的A中,我有一个button
来调用活动B.
在活动B,按后退按钮将调用finish()
。
关键是我可以拨打finish()
,等待一段时间再打电话给B,没关系,没关系。
但是当我拨打finish()
并立即再次呼叫B时
在新B onDestroy()
,onCreate()
后,之前的B onResume()
被称为。
这对我来说是个问题,因为我在MediaPlayer
,onResume()
...到处都处理了一些静态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完全被破坏?
答案 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()