0

Я пытаюсь реализовать метод, в котором мое приложение будет отслеживать, когда пользователь открыл или закрыл мое приложение, обновив базу данных mongodb. Я понимаю, что когда начинается действие, методы onCreate() или onResume() всегда запускаются, и когда действие закрывается, вызовы onPause() или onStop() вызывают.Отслеживать пользователя при закрытии/запуске приложения

То, что я пробовал до сих пор это: В любой деятельности моего заявления я звоню этот AsyncTask:

public void updateOnline(String fbid, boolean login){ 
    new updateOnlineAsync(fbid, login).execute(); 
} 

public class updateOnlineAsync extends AsyncTask<Void, Void, Void>{ 
    String fbid; 
    boolean login; 

    public updateOnlineAsync(String fbid, boolean login){ 
     this.fbid=fbid; 
     this.login=login; 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     BasicDBObject query = new BasicDBObject(); 
     query.put("fbid", this.fbid); 
     Document myDoc = fb_users.find(query).first(); 

     if(login){ 
      Log.d("...", "x"); 
      Document listItem = new Document("online", "0"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     }else{ 
      Log.d("...", "y"); 
      Document listItem = new Document("online", "1"); 
      Document updateQuery = new Document("$set", listItem); 
      fb_users.updateOne(myDoc, updateQuery); 
     } 
     return null; 
    } 
} 

В OnCreate(), onResume() методы я использую:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), false); 

и OnPause(), OnStop() методы я использую:

ServerRequest serverRequest = new ServerRequest(this); 
Profile profile = Profile.getCurrentProfile(); 
serverRequest.updateOnline(profile.getId(), true); 

Я думаю, что это должно работать и обновлять свой документ остроумие h пользователь онлайн/оффлайн ситуации, но это не так. Интересно, это из-за того, что AsyncTask не работает, когда приложение находится в фоновом режиме или, может быть, я делаю что-то неправильно. В любом случае, любая помощь очень ценится.

РЕДАКТИРОВАТЬ

Log.d() в AsyncTask ptints, но не у х. Там для AsyncTask выполняется для метода onCreate(), но не для onStop()

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

+0

Не видя, что такое «BasicDBObject», это может быть проблемой. Но если ваш журнал попадает в блок «y», но не «x», вы уверены, что вы вызываете 'updateOnline()' с истинным значением для входа для начала? Вы отлаживали приложение и выполняли код за строкой? Было ли значение переменных, как вы ожидали на каждом шаге? –

+0

Я просто протестировал, изменив активность в своем приложении.Онлайн-поле обновляется в моей базе данных, когда я изменяю активность в своем приложении или когда я нажимаю среднюю кнопку на своем смартфоне (отправляя ее на задний план). Метод не работает только тогда, когда я полностью закрываю его –

ответ

2

Короткий вариант - «you should avoid performing CPU-intensive work during onPause(), such as writing to a database». Это от managing the activity lifecycle (это рекомендуется прочитать).

Однако, как вы и другие отметили, приостановка и остановка приложения не останавливает потоки фона. Когда вы полностью закрываете приложение, вызывается onDestroy. Это убивает все (как следует из названия).

Кроме того, приостановка деятельности подразумевает, что пользовательский интерфейс частично скрыт. Это может произойти, когда окно предупреждения отображается поверх него. Однако большинство случаев onPause происходят прямо перед onStop. Будет ли приложение все еще работать или нет: «Как только ваша деятельность будет остановлена, система может уничтожить экземпляр, если ему необходимо восстановить системную память».

Обратите внимание, что рекомендация избегать интенсивного процессора во время onPause не применяется к onStop. Google's example shows writing to storage. Это не указано там, но я бы предположил, что на самом деле это плохая идея, чтобы создать фоновый поток, чтобы сделать это, так как система может предположить, что активность готова к onDestroy, когда существует onStop.

Моя первоначальная рекомендация все еще сохраняется. Если вы создадите Service, onDestroy на мероприятии, к нему не относится.

+0

_ «после запуска onPause и onClose приложение отключается» _ Это НЕ верно. _ "включая любой фоновый поток активности" _ Это НЕ ИСТИННО. – Onik

+0

Что значит открыть Сервис? например, вызов php-файла? –

+0

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

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