方法不必要地被调用?

我有一个BaseActivity,可以通过其他所有活动进行扩展。 问题是,每当用户离开(onPause)活动时,我都会将音乐静音。 我也不再听电话了。 问题是,只要用户在活动之间切换,就会调用onPause ,这意味着应用程序不必要地静音并停止telephonymanager ,即使它只是静音并且如果用户要离开应用程序就停止telephonymanager

 @Override protected void onPause() { Log.v(TAG, "IN onPause!"); // unregister phone listener to telephony manager tManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); mute(); super.onPause(); } 

现在说我在public class myClass extends BaseActivity之间切换public class myClass extends BaseActivity并切换到public class myOtherClass extends BaseActivity 。 这个开关不必要地执行onPause ,即使我只想在用户离开应用程序时调用onPause 。 我该怎么办?

感谢您的专家建议,

丰富

根据我的理解,你在onPause of BaseActivity中播放你的音乐,而不是把它写在你的音乐播放活动中

例如:

  public class BaseActivity extends AppCompatActivity{ @Override public void onPause(){ //do things that common for all activities } } public void MusicPlayActivity extends AppCompatActivity{ @Override public void onPause(){ music.mute() } } 

这会奏效

UPDATE

有几种方法可以检测您的应用程序是否在后台运行,但只有其中一种是完全可靠的:使用Activity.onPauseActivity.onResume方法自行跟踪应用程序的可见性。 将“可见性”状态存储在其他类中。

示例 :实现自定义Application类(请注意isActivityVisible()静态方法):

公共类MyApplication扩展Application {

  public static boolean isActivityVisible() { return activityVisible; } public static void activityResumed() { activityVisible = true; } public static void activityPaused() { activityVisible = false; } private static boolean activityVisible; } 

在AndroidManifest.xml中注册您的应用程序类:

  

onPauseonResume添加到项目中的每个Activity(如果您愿意,可以为您的Activity创建一个共同的祖先,但如果您的活动已经从MapActivity / ListActivity等扩展,您仍然需要手动编写以下内容) :

 @Override protected void onResume() { super.onResume(); MyApplication.activityResumed(); } @Override protected void onPause() { super.onPause(); MyApplication.activityPaused(); } 

ActivityLifecycleCallbacks在API级别14(Android 4.0)中添加。 您可以使用它们来跟踪用户当前是否可以看到您的应用程序的活动。 请查看Cornstalks的回答 ,了解详情。

根据您的评论,您只想在应用程序的最后一个Activity退出时停止播放音乐。 像这样覆盖BaseActivityfinish()方法应该可以实现你想要的:

 @Override public void finish() { super.finish(); if (isTaskRoot()) { // This is the last Activity in the stack so mute your music here... } } 

实际上你可能想要onDestroy()onStop()因为我不确定finish()执行,除非你调用它但想法是一样的:

 @Override protected void onDestroy() { super.onDestroy(); if (isTaskRoot()) { // This is the last Activity in the stack so mute your music here... } } 

这是关于isTaskRoot()的信息:

返回此活动是否是任务的根。 根是任务中的第一个活动。

返回

如果这是根活动,则为True,否则为false。