Android:" уровень приложения " пауза и возобновление [закрыто]

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

Я пытаюсь следовать этому сообщению: http://curioustechizen.blogspot.com/2012/12/android-application-level-pause-and.html

но до сих пор мне не везло.

кто-нибудь смог добиться этого? Какую парадигму вы использовали?

Дайте мне знать, если вам нужна мне вставить код в этот вопрос. Спасибо за помощь

3 ответов


другим решением проблемы было бы просто отслеживать количество вызовов onStart() и onStop() от каждого действия. Пример:

сначала создайте класс для хранения счетчиков:

public class ActiveActivitiesTracker {
    private static int sActiveActivities = 0;

    public static void activityStarted()
    {
        if( sActiveActivities == 0 )
        {
            // TODO: Here is presumably "application level" resume
        }
        sActiveActivities++;
    }

    public static void activityStopped()
    {
        sActiveActivities--;
        if( sActiveActivities == 0 )
        {
            // TODO: Here is presumably "application level" pause
        }
    }
}

затем в каждом действии просто вызовите методы activityStarted() и activityStopped ():

@Override
public void onStart() {
    super.onStart();
    ActiveActivitiesTracker.activityStarted();
}

@Override
public void onStop() {
    super.onStop();
    ActiveActivitiesTracker.activityStopped();
}

У меня была та же проблема. Моей целью было заблокировать приложение, если пользователь откажется от него. Простая цель, которую, как я думал, будет легко реализовать. Но все решения, которые я нашел, были сложными. Поэтому я пришел к простому решению: временной замок.

в основном это работает так:

  • начать обратный отсчет, чтобы заблокировать приложение в onPause
  • остановить обратный отсчет в onResume
  • если onResume не вызывается вовремя, измените на заперто

для этого я создал небольшой класс:

public class ApplicationLock {

private static final String TAG = ApplicationLock.class.getSimpleName();
private static final int LOCK_TIME = 1000; //lock after a second
private static boolean lock = true; //default is locked
private static Handler handler = new Handler();
private static Runnable runnable = new Runnable() {
    @Override
    public void run() {
        lock = true;
        Log.i("ActivityTracker", "App locked");
    }
};

public static boolean activityStarted()
{
    handler.removeCallbacks(runnable);
    if(lock)
    {
        Log.i(TAG, "App resumed - LOCKED");
        return true;
    }else{
        Log.i(TAG, "App resumed - NOT LOCKED");
        return false;
    }
}

public static void activityStopped()
{
    handler.postDelayed(runnable, LOCK_TIME);
    Log.i(TAG, "App paused - Starting countdown");

}

просто вызовите activityStopped () в ваших действиях onPause () и activityStarted () в onResume (). Проверьте результат activityStarted (). Если он возвращает true, заблокируйте приложение. Если ориентация приложения изменена, onResume будет вызываться очень быстро после onPause, поэтому приложение не будет заблокировано.

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


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

здесь урезанный пример:

необходимые компоненты (они, вероятно, могут быть помещены в служебный класс, если вы хотите их повторно использовать, или у меня просто были для каждого класса активности):

private boolean mAppActiveServiceBound = false;
private AppActiveService mAppActiveService = null;
private ServiceConnection mAppActiveConnection = new ServiceConnection() {
    public void onServiceConnected( ComponentName className, IBinder service ) {
        mAppActiveService = ( (AppActiveService.AppActiveBinder) service ).getService();
    }
    public void onServiceDisconnected( ComponentName className ) {
        mAppActiveService = null;
    }
};

затем в ваших методах onStart() и onStop() для каждого действия:

@Override
public void onStart() {
    super.onStart();
    mAppActiveServiceBound = bindService( new Intent( this, AppActiveService.class ), mAppActiveConnection, Context.BIND_AUTO_CREATE );
}

@Override
public void onStop() {
    super.onStop();
    if( mAppActiveServiceBound ) {
        unbindService( mAppActiveConnection );
        mAppActiveServiceBound = false;
    }
}

и, наконец, сама служба:

public class  AppActiveService extends Service {
    // Receives interactions from clients:
    private final IBinder mBinder = new AppActiveBinder();

    /**
     * Provides a handle to the bound service.
     */
    public class  AppActiveBinder extends Binder {
        AppActiveService getService() {
            return AppActiveService.this;
        }
    }

    @Override
    public void onCreate(){
        // TODO: Here is presumably "application level" resume
    }

    @Override
    public void onDestroy(){
        // TODO: Here is presumably "application level" pause
    }
}