iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么实现一个计步模块
  • 313
分享到

Android中怎么实现一个计步模块

android 2023-05-31 00:05:56 313人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关Android中怎么实现一个计步模块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。目前android计步有两种方式系统计步芯片在Android4.4版

本篇文章给大家分享的是有关Android中怎么实现一个计步模块,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

目前android计步有两种方式

系统计步芯片

在Android4.4版本之后,部分机型实现了Sensor.TYPE_STEP_COUNTER传感器,用于纪录用户行走的步数。从手机开机开始纪录,手机关机时重置为0。

这个记步芯片是系统级别的,相对之前老版本的传感器记步,性能有一些优化

不会因为App单独用了记步的功能而额外耗电

系统芯片记步是持续的,能够优化部分机型后台不记步的问题。

加速度传感器计算方式

加速度传感器非常耗电,导致App的耗电量很高,影响用户体验。
需要后台实时运行才能实现记步的功能,如果App进程被系统或者安全软件杀死,导致记步功能没办法使用

项目地址:https://GitHub.com/jiahongfei/TodayStepCounter

根据以上两种方式实现计步,手机提供计步传感器就使用Sensor.TYPE_STEP_COUNTER方式(app后台关闭也可以计步),如果不提供就使用SensORManager.SENSOR_DELAY_UI方式(app需要保持后台运行)。

项目结构:

计步Service使用单独进程,所以使用到进程间通信aidl,todaystepcounterlib为库文件用于在单独进程中实现计步算法,app依赖todaystepcounterlib项目获取当前步数展示。

Android中怎么实现一个计步模块

接入方式:

项目结构app中时如何使用计步模块的看如下代码

public class MainActivity extends AppCompatActivity {  private static String TAG = "MainActivity";  private static final int REFRESH_STEP_WHAT = 0;  //循环取当前时刻的步数中间的间隔时间  private long TIME_INTERVAL_REFRESH = 500;  private Handler mDelayHandler = new Handler(new TodayStepCounterCall());  private int mStepSum;  private ISportStepInterface iSportStepInterface;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Intent intent = new Intent(this, VitalityStepService.class);    startService(intent);    bindService(intent, new ServiceConnection() {      @Override      public void onServiceConnected(ComponentName name, IBinder service) {        iSportStepInterface = ISportStepInterface.Stub.asInterface(service);        try {          mStepSum = iSportStepInterface.getCurrTimeSportStep();          updateStepCount();        } catch (RemoteException e) {          e.printStackTrace();        }     mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);      }      @Override      public void onServiceDisconnected(ComponentName name) {      }    }, Context.BIND_AUTO_CREATE);  }  class TodayStepCounterCall implements Handler.Callback{    @Override    public boolean handleMessage(Message msg) {      switch (msg.what) {        case REFRESH_STEP_WHAT: {          if (null != iSportStepInterface) {            int step = 0;            try {              step = iSportStepInterface.getCurrTimeSportStep();            } catch (RemoteException e) {              e.printStackTrace();            }            if (mStepSum != step) {              mStepSum = step;              updateStepCount();            }          }     mDelayHandler.sendEmptyMessageDelayed(REFRESH_STEP_WHAT, TIME_INTERVAL_REFRESH);          break;        }      }      return false;    }  }  private void updateStepCount() {    Log.e(TAG,"updateStepCount : " + mStepSum);    TextView stepTextView = (TextView)findViewById(R.id.stepTextView);    stepTextView.setText(mStepSum + "步");  }}

计步策略:

如果使用加速度传感器计步必须要app在后台存活才可以计步。‘
2.重头戏是使用计步传感器实现计步,app在后台关闭也可以计步。

如下是采用Sensor.TYPE_STEP_COUNTER传感器实现计步策略:

用户新安装app,从用户第一次打开App开始计步,当天不跨天

Android中怎么实现一个计步模块

用户一直打开app计步,且跨越0点没有关闭App

Android中怎么实现一个计步模块

用户打开一次App后台关闭,跨越0点且0点分隔AlertManager不能自启动(目前多数手机都是不能启动的)

Android中怎么实现一个计步模块

用户打开一次app后台关闭,跨越多个0点且Alertmanager 0点分隔可以启动

Android中怎么实现一个计步模块

用户开启一次app且在同一天进行重启手机(自启动不好用,很多手机不好用)

Android中怎么实现一个计步模块

用户开启一次app,开关机跨0点(开机自启动不好用)

Android中怎么实现一个计步模块

用户开启一次app,开关机跨0点(开机自启动可以)

Android中怎么实现一个计步模块

以上就是Android中怎么实现一个计步模块,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Android中怎么实现一个计步模块

本文链接: https://www.lsjlt.com/news/222465.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c#文本框只读属性怎么设置
    c# 文本框只读属性的设置 问题:如何设置 C# 文本框的只读属性? 回答: 要设置文本框的只读属性,可以使用 ReadOnly 属性。 详细解释: ReadOnly 属性是一个布尔值属...
    99+
    2024-05-14
    c#
  • 如何使用 Golang ORM 工具与数据库交互?
    使用 gorm orm 工具与数据库交互,可通过以下步骤轻松实现:安装和初始化(1)、定义模型(2)、建立映射(3)、创建记录(4)、读取记录(5)、更新记录(6)、删除记录(7)、事务...
    99+
    2024-05-14
    golang orm mysql git iphone
  • c++中double与float的区别
    c++++ 中 double 与 float 的区别 在 C++ 中,double 和 float 都是浮点数类型,但它们在精度、范围和内存占用方面存在差异。 精度: double:双...
    99+
    2024-05-14
    c++ 内存占用
  • 如何在 Golang 中处理数据库错误?
    在 go 中处理数据库错误的步骤包括:使用专门的 go mysql 驱动程序。实现 error 接口以创建自定义错误。检测错误,记录足够的信息,并基于错误类型执行适当的恢复操作。 如何...
    99+
    2024-05-14
    golang 数据库错误 mysql git 数据丢失
  • c++中int怎么转string
    在 c++ 中将 int 转换为 string 的方法有:使用 to_string() 函数直接转换。使用 stringstream 类。使用 sprintf() 函数。 如何在 C+...
    99+
    2024-05-14
    c++
  • 优化 C++ 服务器架构以提高吞吐量
    优化 c++++ 服务器吞吐量策略:线程池:预先创建线程池,快速响应请求。非阻塞 i/o:在等待 i/o 时执行其他任务,提升吞吐量。http/2:使用二进制协议,支持多路复用和内容压缩...
    99+
    2024-05-14
    优化 服务器架构 c++
  • 使用 C++ 堆分配器管理服务器架构中的内存
    使用 c++++ 堆分配器管理服务器内存可提高性能和稳定性。堆分配器负责分配和释放动态内存,跟踪空闲/已分配内存元数据。在服务器架构中,它用于分配应用程序对象、缓冲区和数据结构。选择堆分...
    99+
    2024-05-14
    c++ 内存管理 并发访问
  • c#怎么获取字符串中的数字
    从 c# 字符串中提取数字的方法有五种:正则表达式、循环和 char.isdigit()、int.tryparse()、string.split() 和 int.parse()、linq...
    99+
    2024-05-14
    git c#
  • C++ 异常处理在服务器架构中的最佳实践
    c++++ 异常处理在服务器架构的最佳实践:定义清晰的异常层次结构,使用自定义异常类型封装相关信息。使用异常安全函数,及时在适当范围内处理异常。提供有意义的错误消息,帮助用户了解错误并采...
    99+
    2024-05-14
    c++ 异常处理
  • c#怎么拼接字符串
    在 c# 中拼接字符串有三种方法:使用加法(+)运算符、string.concat() 方法和 stringbuilder 类。最简单的方法是使用 + 运算符将字符串连接起来,...
    99+
    2024-05-14
    c#
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作