2014-01-03 5 views
12

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

Я стараюсь следовать этот пост: http://curioustechizen.blogspot.com/2012/12/android-application-level-pause-and.html

Но у меня не было никакой удачи до сих пор.

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

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

+0

Что не так с 'onPause' и таким? – hichris123

+0

он не существует на уровне приложения, но только для действий – TMacGyver

+0

Но разве вы не могли просто использовать 'onPause' во всех своих действиях и иметь один и тот же код? – hichris123

ответ

6

Другим решением проблемы было бы просто отслеживать количество вызовов 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(); 
} 
+2

Также рассмотрите использование registerActivityLifecycleCallbacks (this); –

1

Я сделал что-то очень похожее на это в приложении, которое использовало сервис, который предоставлял функции 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 
    } 
} 
4

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

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

  • Начать отсчет времени до блокировки приложения в 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, поэтому приложение не будет блокироваться.

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

Смежные вопросы