Делать что-то, возвращаясь к действию из фона - PullRequest
1 голос
/ 17 мая 2019

Я хочу выполнять функцию только при возврате в приложение из фона.

Я включил метод в onResume, и это делает его в определенной степени. Проблема в том, что onResume запускается даже при создании Activity и при возврате к занятию из другого занятия (например, после нажатия кнопки назад), и функция также выполняется там.

Как избежать этого и выполнять функцию только при возврате из фона?

Ps: мое приложение уже имеет несколько мест, используя startActivity, поэтому переход на startActivityForResult - утомительная задача.

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

Редактировать 2: Мой BaseAppCompactActivity такой же, как и ниже, с LifecycleObserver, реализованным сейчас. Это, похоже, не работает.

public class BaseAppCompactActivity extends AppCompatActivity implements LifecycleObserver {
    private String TAG = BaseAppCompactActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

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

    @Override
    protected void onPostResume() {
        super.onPostResume();
        startService();
    }

//    @Override
//    protected void onResume() {
//        super.onResume();
////        updateLastAccessedDate();
//    }

    private void startService() {
        startService(new Intent(this, BusinessCacheService.class));
    }

    private void stopService() {
        stopService(new Intent(this, BusinessCacheService.class));
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private void updateLastAccessedDate() {
        //Do something
    }
}

Ответы [ 5 ]

1 голос
/ 17 мая 2019

Хотя это дубликат.Вот реализация Java, которой я делюсь ради помощи.

public class MyApplication extends MultiDexApplication implements LifecycleObserver {
    private boolean previouslyInBackground;
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onAppBackgrounded() {
        previouslyInBackground=true;

    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onAppForegrounded() {
        if(previouslyInBackground){
           // Do your stuff Here
        }
        previouslyInBackground=false;
    }
}

Добавление зависимости Gradle из Компоненты, поддерживающие жизненный цикл Документация

1 голос
/ 17 мая 2019

Вы можете использовать startActivityForResult вместо startActivity.Тогда вы можете поймать метод возврата внутрь onActivityResult.

0 голосов
/ 17 мая 2019

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

Boolean isForeGround = true;

@Override
public void onPause() {
   super.onPause();
   isForeGround = false;
}

@Override
public void onResume() {
    super.onPause();
    if(!isForeGround){
       isForeGround = true;
       // write your code here
    }
}

Надеюсь, это поможет.

0 голосов
/ 17 мая 2019

Сделайте вот так

добавьте эти переменные в вашу основную деятельность

public static boolean isAppWentToBg = true;
public static boolean isWindowFocused = false;
public static boolean isBackPressed = false;

, а также добавьте эти методы

private void applicationWillEnterForeground() {
        if (isAppWentToBg) {
            isAppWentToBg = false;
//            Toast.makeText(getApplicationContext(), "App is in foreground", Toast.LENGTH_SHORT).show();
        }
    }

    public void applicationdidenterbackground() {
        if (!isWindowFocused) {
            isAppWentToBg = true;
//            Toast.makeText(getApplicationContext(), "App is Going to Background", Toast.LENGTH_SHORT).show();
        }
    }



@Override
    public void onBackPressed() {

        isBackPressed = true;
        Log.d(TAG, "onBackPressed " + isBackPressed + "" + this.getLocalClassName());
        super.onBackPressed();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        isWindowFocused = hasFocus;
        if (isBackPressed && !hasFocus) {
            isBackPressed = false;
            isWindowFocused = true;
        }

        super.onWindowFocusChanged(hasFocus);
    }


@Override
    protected void onStart() {
        Log.d(TAG, "onStart isAppWentToBg " + isAppWentToBg);
        applicationWillEnterForeground();
        super.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop ");
        applicationdidenterbackground();
    }
0 голосов
/ 17 мая 2019

сначала задайте глобальную логическую переменную следующим образом: -

boolean isPaused = false; 

Теперь установите методы в вашей деятельности: -

@Override
    protected void onUserLeaveHint() {
        isPaused = true;
        super.onUserLeaveHint();
    }

или в вашем методе onResume: -

@Override
    protected void onResume() {
        if(isPaused){
         isPaused = false;

          }
super.onResume();
    }
...