Метод без необходимости получать вызов?

У меня есть 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 вызывался , когда пользователь покидает приложение. Что мне делать?

Спасибо за советы экспертов,

Рич

Ответ 1

По моему мнению, вы заглушаете свою музыку, играя в onPause из 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.onPause, Activity.onResume. Сохранять статус "видимости" в каком-либо другом классе.

Пример  : Внедрить пользовательский класс приложения (обратите внимание на статический метод 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" >

Добавьте onPause и onResume к каждой Деятельности в проекте (вы можете создать общего предка для своих действий, если хотите, но если ваша активность уже расширена из MapActivity/ListActivity и т.д., вам все равно необходимо написать следующее вручную):

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

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

ActivityLifecycleCallbacks были добавлены на уровне API 14 (Android 4.0). Вы можете использовать их для отслеживания активности пользователя вашего приложения в данный момент. Отметьте ответ на вопрос кукурузы ниже.

Ответ 2

Из ваших комментариев вы хотите остановить музыку только при выходе из последнего Activity вашего приложения. Переопределение метода finish() вашего BaseActivity как это должно выполнить то, что вы хотите:

@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():

Возвращает, является ли это действие корнем задачи. Корень - это первое действие в задаче.

Возвращает

Истинно, если это корневая активность, иначе false.