Android:发送状态的最佳方式是什么?

时间:2016-08-26 12:33:04

标签: android design-patterns scheduled-tasks android-handler

我想定期发送用户当前正在使用该应用程序到我的服务器。

用户有效,

  • 当他在我的应用程序的任何活动上时,用户应该在屏幕上看到它。

用户无效,

  • 如果用户未参与我的任何应用活动
  • 如果用户已将应用最小化
  • 如果用户仅在我的应用活动中,但屏幕已锁定

为此,我已经实施了Android ActivityLifecycleCallbacks并尝试在onActivityResumed()中发送用户有效,在onActivityPaused()无效 {1}}

它按预期工作,但我的应用程序中有很多活动,因此活动之间的转换也会发送此状态,这对最终用户来说非常糟糕。

我该如何控制?我怎样才能定期发送而不是充斥在场?

一般来说,在Android中定期执行某些操作的最佳方法是什么?这意味着,即使 已经多次调用 ,任务也应该仅在特定的时间间隔完成。

更新

现在如何运作以及我如何需要:

从启动器快速转换 - > ActivityA - > ActivityB - > ActivityC

当前行为:

   A's onResume() triggers userActive()
   A's onPause() triggers userInactive()
   B's onResume() triggers userActive()
   B's onPause() triggers userInactive()
   C's onResume() triggers userActive()

必需的行为:

由于用户在所有这些转换发生后都在应用程序中,因此它应该只发送一次userActive()。它可以在第一次转换(发射器到ActivityA)或最后一次转换(ActivityB => ActivityC)时发送。

简单来说,如果在最后X秒内调用userActive(),则不应该调用它。

2 个答案:

答案 0 :(得分:1)

将LifecycleCallback实现为单例或让Application类实现它。让它有一个计数变量。

public void onActivityResumed(){
  if(activeCount == 0){
    // an Activity is active ... do something

  }
  ++activeCount;
}

public void onActivityPaused(){
  --activeCount;
  if(activeCount == 0){
    // all Activities paused
  }
}

您可能想要同步计数变量或使用原子整数。

要定期发送信息,只需让后台服务定期检查activeCount的值。

答案 1 :(得分:0)

根据Android的文档,最好的方法是实现专用的后台服务,即定期建立连接并在一个包中发送所有新事件。

大多数类似服务的设计方式相同。 Backgound Service具有这个很好的功能,它是系统内存不足时首先被杀死的功能之一,因此您的其他活动将保持不变并且运行顺畅。资源再次可用后,您可以将其配置为从其离开的位置进行选择并将报告发送到您的服务器。

我的个人经验法则:如果某些内容与处理用户控件没有直接关系,请将其作为服务

---编辑1: Android Documentation