2015-10-06 3 views
1

Возможно ли обнаружение Android-приложения, убитого или выведенного пользователем?

Я пытаюсь использовать ActivityLifecycleCallbacks зарегистрировавшихся в классе Application, чтобы обнаружить его Ассинг параметр Int и увеличить его в onActivityCreated, как показано ниже; Но это не работает.
Я думаю, что Служба Android в моем приложении делает эту глобальную переменную счетчика (определен в одноэлементном классе) не убит, хотя приложение было убито.
Он начинается с нуля только в первый раз, когда приложение запускается первым, а затем каждое приложение перезапускает его последнее значение, как последний раз, когда приложение было убито и больше не имеет значения нуля.

Другой вопрос в том, что как мы можем выпустить глобальные значения до их начальных значений, когда приложение было убито с использованием службы Android?

Как мы можем обнаружить приложение Android, убитое пользователем или Системой?

Singleton класс, который имеет глобальный счетчик активности

public class SingletonClass { 

    public int created_activity_number; 

    private static volatile SingletonClass instance = null; 

    private SingletonClass() { 

    } 

    public static SingletonClass getInstance() { 
     if (instance == null) { 
      synchronized (SingletonClass.class) { 
       // Double check 
       if (instance == null) { 
        instance = new SingletonClass(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

ActivityLifecycleCallbacks класс

public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks { 

      private static int created; 

      @Override 
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) { 
       SingletonClass.getInstance().created_activity_number++; 
      } 

      @Override 
      public void onActivityStarted(Activity activity) { 

      } 

      @Override 
      public void onActivityResumed(Activity activity) { 

      } 

      @Override 
      public void onActivityPaused(Activity activity) { 

      } 

      @Override 
      public void onActivityStopped(Activity activity) { 

      } 

      @Override 
      public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

      } 

      @Override 
      public void onActivityDestroyed(Activity activity) { 

      } 
     } 

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

// Enter this condition only one time no mattter how many times the application killed by the user end starts again. 
if (SingletonClass.getInstance().created_activity_number == 1) { 
      // Yes, it is the first created activiy 
} 
+0

Не возможно !!! –

+0

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

+0

Прошу быть конструктивным, я не могу понять, чего вы пытаетесь достичь! –

ответ

0

У меня была такая же проблема, использовать этот класс

public class Foreground implements Application.ActivityLifecycleCallbacks { 

public static final long CHECK_DELAY = 500; 
public static final String TAG = Foreground.class.getName(); 

public interface Listener { 

    public void onBecameForeground(); 

    public void onBecameBackground(); 

} 

private static Foreground instance; 

private boolean foreground = false, paused = true; 
private Handler handler = new Handler(); 
private List<Listener> listeners = new CopyOnWriteArrayList<Listener>(); 
private Runnable check; 

/** 
* Its not strictly necessary to use this method - _usually_ invoking 
* get with a Context gives us a path to retrieve the Application and 
* initialise, but sometimes (e.g. in test harness) the ApplicationContext 
* is != the Application, and the docs make no guarantees. 
* 
* @param application 
* @return an initialised Foreground instance 
*/ 
public static Foreground init(Application application){ 
    if (instance == null) { 
     instance = new Foreground(); 
     application.registerActivityLifecycleCallbacks(instance); 
    } 
    return instance; 
} 

public static Foreground get(Application application){ 
    if (instance == null) { 
     init(application); 
    } 
    return instance; 
} 

public static Foreground get(Context ctx){ 
    if (instance == null) { 
     Context appCtx = ctx.getApplicationContext(); 
     if (appCtx instanceof Application) { 
      init((Application)appCtx); 
     } 
     throw new IllegalStateException("Foreground is not initialised and cannot obtain the Application object"); 
    } 
    return instance; 
} 

public static Foreground get(){ 
    if (instance == null) { 
     throw new IllegalStateException("Foreground is not initialised - invoke at least once with parameterised init/get"); 
    } 
    return instance; 
} 

public boolean isForeground(){ 
    return foreground; 
} 

public boolean isBackground(){ 
    return !foreground; 
} 

public void addListener(Listener listener){ 
    listeners.add(listener); 
} 

public void addListenerUnique(Listener listener){ 
    if(!listeners.contains(listener)){ 
     listeners.add(listener); 
    } 
} 

public void removeListener(Listener listener){ 
    listeners.remove(listener); 
} 

@Override 
public void onActivityResumed(Activity activity) { 
    paused = false; 
    boolean wasBackground = !foreground; 
    foreground = true; 

    if (check != null) 
     handler.removeCallbacks(check); 

    if (wasBackground){ 
     Log.i(TAG, "went foreground"); 
     for (Listener l : listeners) { 
      try { 
       l.onBecameForeground(); 
      } catch (Exception exc) { 
       Log.e(TAG, "Listener threw exception!", exc); 
      } 
     } 
    } else { 
     Log.i(TAG, "still foreground"); 
    } 
} 

@Override 
public void onActivityPaused(Activity activity) { 
    paused = true; 

    if (check != null) 
     handler.removeCallbacks(check); 

    handler.postDelayed(check = new Runnable(){ 
     @Override 
     public void run() { 
      if (foreground && paused) { 
       foreground = false; 
       Log.i(TAG, "went background"); 
       for (Listener l : listeners) { 
        try { 
         l.onBecameBackground(); 
        } catch (Exception exc) { 
         Log.e(TAG, "Listener threw exception!", exc); 
        } 
       } 
      } else { 
       Log.i(TAG, "still foreground"); 
      } 
     } 
    }, CHECK_DELAY); 
} 

@Override 
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} 

@Override 
public void onActivityStarted(Activity activity) {} 

@Override 
public void onActivityStopped(Activity activity) {} 

@Override 
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} 

@Override 
public void onActivityDestroyed(Activity activity) {} 
} 

Init это в youur классе приложения

Foreground.init(this); 

И затем использовать слушателю знать приложение государству

+0

Я нашел два разных решения с использованием Service и ActivityLifecycleCallbacks (разные и простые, чем ваши). Спасибо, я отредактирую свой вопрос. – ondermerol

+0

Обратите внимание: это не даст вам правильно установленное время, если у вас есть служба, работающая в фоновом режиме, или когда вы переходите в разделенный экран или когда вы переходите в режим «картинка в картинке». Тем не менее, для телевизоров это может не срабатывать, но я не уверен на 100%. – milosmns

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