【问题标题】:Track user on closing/starting application跟踪用户关闭/启动应用程序
【发布时间】:2016-03-30 19:11:21
【问题描述】:

我正在尝试实现一种方法,我的应用程序将通过更新 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);

我认为这应该可行,并根据用户在线/离线情况更新我的文档,但事实并非如此。我想知道这是否是因为 AsyncTask 在应用程序处于后台时无法正常工作,或者我做错了什么。无论如何,任何帮助都非常感谢。

编辑

AsyncTask 中的 Log.d() 点 y 而不是 x。 AsyncTask 正在执行 onCreate() 方法,但不是 onStop()

我刚刚通过更改应用中的活动进行了测试。当我更改应用程序中的活动或按下智能手机的中间按钮(将其发送到后台)时,我的数据库中的在线字段会更新。只有当我完全关闭它时,该方法才有效

【问题讨论】:

  • 没有看到BasicDBObject 是什么,这可能是个问题。但是,如果您的日志点击了“y”块而不是“x”,那么您确定要调用updateOnline() 并使用真正的登录值开始吗?您是否调试过应用程序并逐行执行代码?每个步骤的变量值是否符合您的预期?
  • 我刚刚通过更改应用程序中的活动进行了测试。当我更改应用程序中的活动或按下智能手机的中间按钮(将其发送到后台)时,我的数据库中的在线字段会更新。只有当我完全关闭它时,该方法才有效

标签: android mongodb android-asynctask android-lifecycle activity-lifecycle


【解决方案1】:

简短的版本是“you should avoid performing CPU-intensive work during onPause(), such as writing to a database”。这是来自managing the activity lifecycle(推荐阅读)。

但是,正如您和其他人所指出的,暂停和停止应用程序并不会停止后台线程。当您完全关闭应用程序时,会调用 onDestroy。这确实会杀死一切(顾名思义)。

此外,暂停活动意味着 UI 被部分隐藏。当警报窗口显示在其顶部时,可能会发生这种情况。但是,大多数 onPause 情况都发生在 onStop 之前。无论应用程序是否仍在运行,“一旦您的活动停止,系统可能会在需要恢复系统内存时销毁实例。”

请注意,在 onPause 期间避免 CPU 密集型的建议不适用于 onStop。 Google's example shows writing to storage。它没有在那里指定,但我想生成一个后台线程来执行此操作实际上是一个坏主意,因为一旦存在 onStop,系统可能会假设活动已准备好进行 onDestroy。

我最初的建议仍然有效。如果你创建一个Service,onDestroy 在一个活动上,将不适用于它。

【讨论】:

  • “运行 onPause 和 onClose 后,应用程序关闭” 这不是真的。 “包括活动的任何后台线程”这不是真的。
  • 打开服务是什么意思?比如调用一个php文件?
  • 此外,当活动进入后台时,任务工作正常,该字段在我的数据库中更新。仅当我完全关闭应用程序时,该字段才不会更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2016-02-10
相关资源
最近更新 更多