等待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()
我有一个关于生命周期的问题。
我有 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()