2012-01-13 2 views
5

Надеюсь, он существует.Android-эквивалент приложенияDidBecomeActive и applicationWillResignActive (от iOS)

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

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

EDIT
Я пытался расширить класс приложений для registerActivityLifecycleCallbacks() и понял, что не смогут использовать этот подход, потому что он доступен только в уровне API 14+

ответ

4

Позвольте мне рассказать, как я сделал обратно совместимое решение.

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

Я закончил создание BaseActivity, чтобы все мои действия расширялись.

// DataOperations is a singleton class I have been using for other purposes. 
/* It is exists the entire run time of the app 
    and knows which activity was last displayed on screen. 
    This base class will set triggeredOnPause to true if the activity before 
    "pausing" because of actions triggered within my activity. Then when the 
    activity is paused and triggeredOnPause is false, I know the application 
    is losing focus. 

    There are situations where an activity will start a different application 
    with an intent. In these situations (very few of them) I went into those 
    activities and hard-coded these lines right before leaving my application 

    DataOperations datao = DataOperations.sharedDataOperations(); 
    datao.lostFocusDate = new Date(); 
*/ 

import java.util.Date; 

import android.app.Activity; 
import android.content.Intent; 
import android.util.Log; 

public class BaseActivity extends Activity { 
    public boolean triggeredOnPause; 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     DataOperations datao = DataOperations.sharedDataOperations(); 
     if (datao.lostFocusDate != null) { 
      Date now = new Date(); 
      long now_ms = now.getTime(); 
      long lost_focus_ms = datao.lostFocusDate.getTime(); 
      int minutesPassed = (int) (now_ms-lost_focus_ms)/(60000); 
      if (minutesPassed >= 1) { 
       datao.displayLock(); 
      } 
        datao.lostFocusDate = null; 
     } 
     triggeredOnPause = false; 
    } 

    @Override 
    public void onPause(){ 
     if (triggeredOnPause == false){ 
      DataOperations datao = DataOperations.sharedDataOperations(); 
      datao.lostFocusDate = new Date(); 
     } 
     super.onPause(); 
    } 
    @Override 
    public void startActivity(Intent intent) 
    { 
     triggeredOnPause = true; 
     super.startActivity(intent); 
    } 
    @Override 
    public void startActivityForResult(Intent intent, int requestCode) { 
     triggeredOnPause = true; 
     super.startActivityForResult(intent, requestCode); 
    } 

} 

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

2

Обратитесь к Application class в андроиде. Расширьте этот класс.

Надеется, что это может помочь вам

+0

Спасибо, теперь мне нужно с чего начать. –

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