使用 onNewIntent 和活动生命周期来验证是否已看到消息



我有一个推送通知服务器来向我的Android应用程序发送消息,我想知道在看到消息时通知服务器的最佳方式。

目前,我正在尝试在应用程序的主要活动调用其onResume回调后立即将确认消息发送到服务器,但是由于我使用SingleTop main活动,并且我使用onNewIntent方法处理了一些意图,我无法确定onResume是由于Intent还是应用程序进入前台。我已经在我的活动收到启动它的意图时映射了三种情况中的回调流,它们是:

  • 活动在前台(堆栈顶部(上运行(1(

    运行 -> onPause(( -> onNewIntent(intent( -> onResume((

  • 活动在前台暂停(例如((2(

    暂停 -> onRestart(( -> onStart(( -> onResume(( ->

    onPause(( -> onNewIntent(intent(

  • 活动在后台暂停(例如,我在另一个活动中((3(

    暂停在后台 -> onNewIntent(intent( -> onRestart(( -> onStart(( -> onResume((

如果我在没有收到意图的情况下导航到我的活动:

  • 活动暂停,用户导航到该活动 (4(

    暂停 -> onRestart(( -> onStart(( -> onResume((

在情况 1、3 和 4 中,用户以他/她实际可以看到消息的屏幕结束,因此我想发送确认消息。

如果有一个回调只是在活动在屏幕上真正可见的情况下调用的,那就完美了,但我找不到它。

有人知道我该如何解决这个问题吗?

我得到了一个解决方案,也许它不是最好的解决方案,但现在正在工作。

我计划目标活动的每个onResume的确认消息,并在调用暂停时取消它(在大多数情况下表明这是由于外部意图,而不是活动处于唤醒状态(。

onResume((

@Override
protected void onResume() {
    Log.d("MainActivity", "onResume");
    super.onResume();
    final SharedPreferences prefs = getSharedPreferences("lastMessageId", Context.MODE_PRIVATE);
    final Long messageId = prefs.getLong("lastMessageId", -1L);
    Runnable task = new Runnable() {
        @Override
        public void run() {
            if(messageId!=-1L){
                Request req = getAgent().notifyMessageSeen(messageId, ((ApplicationILocate)getApplication()).getUser(MainActivity.this), MainActivity.this);
                ((ApplicationILocate)getApplication()).addRequestToQueue(req);
                prefs.edit().putLong("lastMessageId", -1).commit();
            }
        }
    };
    future = scheduler.schedule(task, 1, TimeUnit.SECONDS);
    resumedTime = new Time();
    resumedTime.setToNow();
}

onPause((

protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    Log.d("MainActivity", "onPause");
    pausedTime = new Time();
    pausedTime.setToNow();
    Log.d("MainActivity", "elapsed between resume and pause: "+(pausedTime.toMillis(false)-resumedTime.toMillis(false)));
    if(pausedTime.toMillis(false)-resumedTime.toMillis(false) < 100){
        future.cancel(true);
    }
}

因此,消息每次进入屏幕时都会接收确认,并且屏幕未锁定。欢迎任何更好的解决方案。

相关内容

  • 没有找到相关文章