不必要地调用方法?

时间:2015-11-11 18:13:36

标签: java android performance inheritance methods

我有一个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称为 。我该怎么办?

感谢专家的建议,

2 个答案:

答案 0 :(得分:1)

根据我的理解,你在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()
 }
}

这将有效

<强>更新

有几种方法可以检测您的应用程序是否在后台运行,但只有一种方法是完全可靠的: 使用Activity.onPauseActivity.onResume方法自行跟踪应用程序的可见性。存储&#34;可见性&#34;在其他一些班级中的地位。

<强> 实施例  :实现自定义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中注册您的应用程序类:

<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();
}
在API级别14(Android 4.0)中添加了

ActivityLifecycleCallbacks。您可以使用它们来跟踪用户当前是否可以看到您的应用程序的活动。请查看下面的Cornstalks' answer了解详细信息。

答案 1 :(得分:0)

根据您的评论,您只想在应用程序的最后Activity退出时停止播放音乐。覆盖BaseActivity这样的finish()方法就可以实现您的目标:

@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。