Android: сценарий, в котором onPause вызывается, но не onStop?

Я пытаюсь понять разницу между onPause и onStop.

Я читал все разные форумы, но я до сих пор не совсем понимаю эту разницу. Я создал простое приложение, чтобы попробовать и проверить, когда вызывается этот метод. Для этого я просто разместил регистраторы в каждом методе.

Из моих испытаний -

  • Всплывающие окна не вызывают метод
  • Переключение на другую активность вызывает оба метода.
  • Отключение панели уведомлений не вызывает ни метода

Я видел только то, что оба метода вызываются в быстрой последовательности или вообще не вызываются. Я пытаюсь найти сценарии, где onPause вызывается, но onStop этого не делает.

Цель состоит в том, чтобы понять, требуется ли определение onPause. Если сценарии, в которых вызывается только onPause, являются настолько редкими, даже нет смысла писать отдельный код для onPause. Не нужно ли писать onStop?

public class LifecycleActivity extends ActionBarActivity {

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Rachit", "In Destroy Method");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycle);
        Log.d("Rachit", "In Create Method");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Rachit", "In Start Method");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Rachit", "In Resume Method");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Rachit", "In Pause Method");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("Rachit", "In Restart Method");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Rachit", "In Stop Method");
    }
}

Ответ 1

Я понял это позже, но забыл опубликовать свой ответ здесь.

Случай, когда я заметил, что onPause() был вызван без немедленного последующего вызова onStop(), был когда я получил уведомление от другого приложения, когда на моем телефоне было открыто другое приложение.

Например, скажем, что на вашем телефоне в настоящее время работает Facebook. Если вы получите уведомление от WhatsApp (во всплывающем диалоговом окне), ваша активность в Facebook будет приостановлена. Если вы закроете всплывающее окно WhatsApp за это время, активность Facebook будет возобновлена. С другой стороны, если вы откроете WhatsApp из всплывающего сообщения, ваша активность в Facebook будет остановлена.

Ответ 2

Этот сценарий происходит, когда вы запускаете DialogActivity из текущей активности, затем вызывается onPause() текущей активности, а после перехода в текущую Activity вызывается onResume().

Для получения дополнительной информации см. Документы для разработчиков.

Ответ 3

Активность A → Активность B Если B прозрачный, будет вызываться A onPause, но не onStop.

Ответ 4

На официальной странице разработчиков Android вы можете увидеть всю информацию, относящуюся к этим двум состояниям деятельности.

onPause() (http://developer.android.com/training/basics/activity-lifecycle/pausing.html)

Когда система вызывает onPause() для вашей деятельности, она технически означает, что ваша деятельность все еще частично видима, но чаще всего это указав, что пользователь уходит из этой операции, и это скоро войдите в состояние "Остановить". Обычно вы должны использовать обратный вызов onPause() в:

Остановите анимацию или другие текущие действия, которые могут потреблять процессор. Зафиксируйте несохраненные изменения, но только если пользователи ожидают, что такие изменения будут когда они уходят (например, проект электронной почты). Выпуск системные ресурсы, такие как широковещательные приемники, ручки для датчиков (например, GPS) или любые ресурсы, которые могут повлиять на срок службы батареи, в то время как ваши активность приостановлена, и пользователь не нуждается в них.

Как правило, вы не должны использовать onPause() для хранения пользовательских изменений (например, личная информация, введенная в форму) на постоянное хранение. только время, когда вы должны сохранять изменения пользователя в постоянном хранилище в пределах onPause() - это когда вы уверены, что пользователи ожидают, что изменения будут автоматическое сохранение (например, при составлении электронной почты). Однако вам следует избегать выполняя интенсивную работу с ЦП во время onPause(), например, запись в базы данных, поскольку он может замедлить видимый переход к следующему (вы должны вместо этого выполнять операции по отключению большой нагрузки во время onStop()).

Вы должны сохранить количество операций, выполняемых методом onPause() относительно просто, чтобы обеспечить быстрый переход к пользователя, если ваша активность фактически остановлена.

Примечание. Когда ваша активность приостановлена, экземпляр Activity сохраняется резидентный в памяти и вызывается, когда активность возобновляется. Вы не нужно повторно инициализировать компоненты, которые были созданы во время любого из методы обратного вызова, ведущие к возобновленному состоянию.

onStop() (http://developer.android.com/training/basics/activity-lifecycle/stopping.html)

Когда ваша активность получает вызов метода onStop(), нет дольше видимый и должен выпускать почти все ресурсы, которые не являются необходимо, пока пользователь не использует его. Как только ваша деятельность будет остановлена, система может уничтожить экземпляр, если ему необходимо восстановить систему Память. В крайних случаях система может просто убить ваше приложение процесс, не вызывая завершение действия в onDestroy() обратном вызове, поэтому важно использовать onStop() для выпуска ресурсов, которые могут протекать память.

Хотя метод onPause() вызывается перед onStop(), вы должны используйте onStop() для выполнения более интенсивного закрытия процессора операций, таких как запись информации в базу данных.

Когда ваша активность остановлена, объект Activity сохраняется в памяти и вызывается, когда активность возобновляется. Вам не нужно повторно инициализировать компоненты, которые были созданы во время любого обратного вызова методы, ведущие к Возобновленному состоянию. Система также отслеживает текущего состояния для каждого представления в макете, поэтому, если пользователь введенный текст в виджет EditText, этот контент сохраняется, чтобы вы не нужно сохранять и восстанавливать его.

Примечание. Даже если система уничтожает вашу активность во время ее остановки, она все еще сохраняет состояние объектов View (например, текст в EditText) в Bundle (blob пар ключ-значение) и восстанавливает их, если пользователь переходит к тому же экземпляру активности (следующий В уроке больше говорится об использовании Bundle для сохранения других данных состояния в если ваша деятельность уничтожена и воссоздана).

Ответ 5

Результат моего теста:

Для двух действий ниже, при запуске C4_SecondActivity из MainActivity, для MainActivity, его onPause но не onStop.

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".C4_SecondActivity"
    android:label="@string/title_activity_c4__second"
    android:theme="@style/Theme.AppCompat.Dialog">
</activity>

Ответ 6

Когда мы запустим операцию диалога из текущей Activity, в это время будет вызываться только onPause(). Пример: предположим, что у нас есть активности A и B. В настоящее время активность B - активность и активность A - нормальная активность. когда мы запустим активность B из активности A, тогда будет вызываться активность A onPause(), и будут показаны действия B onCreate(), onStart() и onResume(). Пожалуйста, проверьте ниже url для примера кода пример кода

Ответ 7

Есть и другой способ сделать это. давайте возьмем сценарий, в котором вы запускаете режим активности, и создавайте уведомление от него и запускаете его и вызываете одно и то же ожидающее намерения снова, после чего onresume будет называться post to on pause.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendNotification();
    }

    private final static String TAG = "TestOne";

    public  void sendNotification(){
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this);

    //Create the intent that’ll fire when the user taps the notification//

    Intent i = new Intent(MainActivity.this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);


    mBuilder.setContentIntent(pendingIntent);

    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle("My notification");
    mBuilder.setContentText("Hello World!");

    NotificationManager mNotificationManager =

            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    mNotificationManager.notify(001, mBuilder.build());

} 

Манифест:

    <activity android:name=".MainActivity"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Main2Activity"></activity>

Ответ 8

onPause() метод активности - это вызов, когда вы получаете телефонный звонок. В противном случае во многих случаях onPause() всегда вызывается с onStop(). Например, когда вы нажимаете кнопку "домой", вызывайте другое намерение и больше, например, когда ваша деятельность находится в фоновом режиме.