Проверка, работает ли приложение Android в фоновом режиме - PullRequest
297 голосов
/ 08 сентября 2010

Под фоном я подразумеваю, что ни одно из действий приложения в настоящее время не видимо пользователю?

Ответы [ 29 ]

0 голосов
/ 18 июня 2012

В моих действиях onResume и onPause я записываю логическое значение isVisible для SharedPrefences.

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    Editor editor = sharedPrefs.edit();
    editor.putBoolean("visible", false);
    editor.commit();

И, когда это необходимо, читайте в другом месте,

    // Show a Toast Notification if App is not visible (ie in background. Not running, etc) 
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
    if(!sharedPrefs.getBoolean("visible", true)){...}

Может быть, не элегантно, но у меня это работает ...

0 голосов
/ 26 апреля 2013

Я бы хотел порекомендовать вам другой способ сделать это.

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

Ваше приложение может непрерывно записывать текущее время в определенный файл. Когда ваше приложение запускается, проверьте последнюю временную метку, если current_time-last_time> диапазон времени, указанный вами для записи последнего времени, это означает, что ваше приложение остановлено, либо уничтожено системой, либо самим пользователем.

0 голосов
/ 03 октября 2013

Возможно, будет слишком поздно, чтобы ответить, но если кто-то приходит в гости, вот решение, которое я предлагаю, Причина (-ы) в том, что приложение хочет знать, что он находится в фоновом режиме или выходит на передний план, может быть много, некоторые из них, 1. Показывать тосты и уведомления, когда пользователь находится в BG. 2. Для выполнения некоторых задач пользователь впервые приходит из BG, например, опрос, перерисовка и т. Д.

Решение Идолона и других заботится о первой части, но не о второй. Если в вашем приложении несколько действий, и пользователь переключается между ними, то к тому времени, когда вы выполняете второе действие, видимый флаг станет ложным. Поэтому его нельзя использовать детерминистически.

Я сделал что-то, что было предложено CommonsWare: «Если Служба определит, что никаких видимых действий нет, и это останется таким в течение некоторого времени , остановите передачу данных при следующей логической остановке. точка «.

Строка, выделенная жирным шрифтом, важна, и ее можно использовать для достижения второго пункта. Так что я делаю, как только я получаю onActivityPaused (), я не изменяю видимое на false напрямую, вместо этого имею таймер в 3 секунды (это максимум, что должно быть запущено следующее действие), и если нет onActivityResumed ( ) в ближайшие 3 секунды измените видимость на ложь. Аналогично в onActivityResumed (), если есть таймер, я отменяю его. Подводя итог, видимым становится isAppInBackground.

Извините, не могу скопировать и вставить код ...

0 голосов
/ 02 марта 2014

Другое решение для этого старого поста (для тех, которые могут помочь):


<application android:name=".BaseApplication" ... >

public class BaseApplication extends Application {

    private class Status {
        public boolean isVisible = true;
        public boolean isFocused = true;
    }

    private Map<Activity, Status> activities;

    @Override
    public void onCreate() {
        activities = new HashMap<Activity, Status>();
        super.onCreate();
    }

    private boolean hasVisibleActivity() {
        for (Status status : activities.values())
            if (status.isVisible)
                return true;
        return false;
    }

    private boolean hasFocusedActivity() {
        for (Status status : activities.values())
            if (status.isFocused)
                return true;
        return false;
    }

    public void onActivityCreate(Activity activity, boolean isStarting) {
        if (isStarting && activities.isEmpty())
            onApplicationStart();
        activities.put(activity, new Status());
    }

    public void onActivityStart(Activity activity) {
        if (!hasVisibleActivity() && !hasFocusedActivity())
            onApplicationForeground();
        activities.get(activity).isVisible = true;
    }

    public void onActivityWindowFocusChanged(Activity activity, boolean hasFocus) {
        activities.get(activity).isFocused = hasFocus;
    }

    public void onActivityStop(Activity activity, boolean isFinishing) {
        activities.get(activity).isVisible = false;
        if (!isFinishing && !hasVisibleActivity() && !hasFocusedActivity())
            onApplicationBackground();
    }

    public void onActivityDestroy(Activity activity, boolean isFinishing) {
        activities.remove(activity);
        if(isFinishing && activities.isEmpty())
            onApplicationStop();
    }

    private void onApplicationStart() {Log.i(null, "Start");}
    private void onApplicationBackground() {Log.i(null, "Background");}
    private void onApplicationForeground() {Log.i(null, "Foreground");}
    private void onApplicationStop() {Log.i(null, "Stop");}

}

public class MyActivity extends BaseActivity {...}

public class BaseActivity extends Activity {

    private BaseApplication application;

    @Override
    protected void onCreate(Bundle state) {
        application = (BaseApplication) getApplication();
        application.onActivityCreate(this, state == null);
        super.onCreate(state);
    }

    @Override
    protected void onStart() {
        application.onActivityStart(this);
        super.onStart();
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        application.onActivityWindowFocusChanged(this, hasFocus);
        super.onWindowFocusChanged(hasFocus);
    }

    @Override
    protected void onStop() {
        application.onActivityStop(this, isFinishing());
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        application.onActivityDestroy(this, isFinishing());
        super.onDestroy();
    }

}
0 голосов
/ 15 февраля 2016

А как насчет использования getApplicationState (). IsInForeground ()?

0 голосов
/ 18 декабря 2014

Вы должны использовать общие предпочтения, чтобы сохранить свойство и действовать в соответствии с ним, используя привязку службы из ваших действий. Если вы используете только привязку (то есть никогда не используете startService), то ваша служба будет работать только при привязке к ней (привязка onResume и unbind onPause), что заставит ее работать только на переднем плане, и если вы захотите работать с ней. В фоновом режиме вы можете использовать обычный сервис start stop.

0 голосов
/ 20 марта 2015

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

Я просто представляю свое решение по-своему.
Я делаю это, используя поле "важность" класса RunningAppProcessInfo в методе onStop каждого вида деятельности в моем приложении, что может быть просто достигнуто.предоставляя BaseActivity для расширения других действий, которое реализует метод onStop для проверки значения "важность".Вот код:

public static boolean isAppRunning(Context context) {
    ActivityManager activityManager = (ActivityManager) context
        .getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcesses = activityManager
        .getRunningAppProcesses();
    for (RunningAppProcessInfo appProcess : appProcesses) {
        if (appProcess.processName.equals(context.getPackageName())) {
            if (appProcess.importance != RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE) {
                return true;
            } 
        }
    }
    return false;
}
0 голосов
/ 15 апреля 2019
fun isAppInForeground(): Boolean {
    val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager ?: return false

    val appProcesses = activityManager.runningAppProcesses ?: return false

    val packageName = packageName
    for (appProcess in appProcesses) {
        if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName == packageName) {
            return true
        }
    }

    return false
}
0 голосов
/ 08 сентября 2010

Я рекомендую прочитать эту страницу: http://developer.android.com/reference/android/app/Activity.html

Короче говоря, ваша активность больше не отображается после вызова onStop().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...