【问题标题】:Method unnecessarily getting called?方法不必要地被调用?
【发布时间】:2015-11-11 18:13:35
【问题描述】:

我有一个 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 myOtherClass extends BaseActivity 之间切换。这个开关不必要地执行onPause,尽管我只希望在用户离开应用程序时调用onPause。我该怎么办?

感谢专家的建议,

丰富

【问题讨论】:

  • 在 MusicplayActiviti 中编写音乐播放器静音的代码,而不是在 BaseActivity 中编写
  • 听起来它正在按预期工作。当另一个 Activity 进入前台时,将调用 ActivityonPause 方法:developer.android.com/reference/android/app/…
  • @CoryCharlton 那么你建议我用什么。我的意图是在用户退出应用程序时静音并停止telephoney manager。既然不能用onPause,那我应该用什么?
  • @Rich 在下面看到我的答案

标签: java android performance inheritance methods


【解决方案1】:

据我了解,您是在 BaseActivity 的 onPause 中静音播放音乐,而不是将其写入您的音乐播放活动中

例如:

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

这会起作用

更新

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

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

公共类 MyApplication 扩展应用程序 {

  public static boolean isActivityVisible() {
    return activityVisible;
  }  

  public static void activityResumed() {
    activityVisible = true;
  }

  public static void activityPaused() {
    activityVisible = false;
  }

  private static boolean activityVisible;
}

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

<application
    android:name="your.app.package.MyApplication"
    android:icon="@drawable/icon"
    android:label="@string/app_name" >

onPauseonResume 添加到项目中的每个活动(如果您愿意,您可以为您的活动创建一个共同的祖先,但如果您的活动已经从 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' answer

【讨论】:

  • OnPause 仅在活动完成时调用,而不是应用程序。如何检测应用是否完成?
  • 表示您想在应用程序进入后台时静音,不是吗?
【解决方案2】:

在您的 cmets 中,您只想在应用程序的最后一个 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()的信息:

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

退货

如果这是根活动,则为真,否则为假。

【讨论】:

  • 好的,如果我在 Activity A 中退出,finish() 会被调用吗?如果我只是从活动 A 切换到活动 B,则不应调用 finish()。谢谢
  • isTaskRoot 只会查看它是否是 activityStack 中的最后一个活动。但这不是我想要的,而是我希望应用程序在用户退出时执行静音代码。用户退出的时间和地点无关紧要,但当他/她退出时,我想将其静音
  • @Rich finish() 将在用户按下后退按钮时被调用。有关主页按钮,请参阅此帖子:stackoverflow.com/questions/4783960/… 来自您的最后一条评论,尽管您现在需要处理用户从通知中启动新应用等情况。
  • 好的,所以我尝试了finish(),但同样的问题存在。它也被称为每项活动......接下来我应该尝试什么?一旦我得到这个,我会标记你的最佳答案并喜欢你的帖子。谢谢!
  • 所以我认为这些只有在 activity 完成时才会被调用,而不是应用程序。如何检测 app 是否完成?
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多