问鼎app官网下载安装 Android计步模块优化(今日步数)

最近,我研究了项目中的步骤计数模块。主要功能是记录当天的步骤数,类似于微信体育,支撑台步骤计数和Gudong今天的步骤数。

在开发之前问鼎app官方下载,我在Baidu,Google和Github上进行了搜索,并找到了我想要的演示和文章。他们中的大多数需要维护它。

为了改善主要手机制造商的电池范围,AlertManager,boot_completed和Service的START_STICKY基本上是无效的,而使服务后端保持活力是不可能的。

以下是我实施并与您一起学习的垫脚模块

GitHub地址

还有一篇文章以前撰写了垫脚模块。本文是上述文章的优化,并且GitHub代码已更新为最新信息。

Android步骤计数模块(类似于微信运动)

当前,现有库已针对v2.0.0进行了优化。以下文章

Android步骤计数模块优化(今天的步骤)v2.0.0

优化应用程序步骤计数模块的三个过程

第一个过程将在线:

由于该功能紧急启动,因此项目开头的步骤计数模块使用加速传感器传感器.type_accelerometer计算步骤数。同时,服务需要在后台生存以计算步骤,否则无法计算步骤。

第二个过程计量计:

该项目运行一段时间后问鼎娱乐,该公司开始促进步行步行模块,因此它开始重新开发垫脚模块。这次,它使用了由Android 4.4提供的踩踏传感器.Type_step_counter来完成它。这次,整个步进模块已经重新开发。一个定性的飞跃,因为不需要阶梯传感器才能将服务保持在后台,并且垫脚传感器的功耗特别低,因此整个模块更加节省。

第三个过程优化步骤:

随着用户数量的增加,投诉也会增加。 Android的各种模型确实很痛苦,最终达到了优化的第三阶段。

目前最常见的问题:

1。Android4.4或以上系统,但手机没有步骤计数协处理器

2。某些手机中的步骤数量急剧增加,每天可能是数十万个步骤。

3。一些手机似乎每天要清理多次。

4。启动步骤无法单独启动,您需要打开应用程序(我已经收听了boot_completed broadcast)

5。第二天的分离(0钟的分离)不容易使用。您需要每天早上打开该应用程序(我已经设置了AlertManager)

本文将介绍该应用程序的踏脚模块。它解决了上述问题1、2和3。对于4和5问题,正在发现系统问题,您也可以帮助我在评论中提示我。

步进模块已分别包装到libmodule中,并上传到github。如果有开发人员需要它或想通信,则可以轻松下载。单击此处下载它。

步骤计数方法的背景知识

1。加速传感器传感器.Type_accelerometer台阶计数方法:

该方法具有开源算法,可以根据加速度传感器计算步骤。单击此处查看原始作者的源代码;

优点:只要可以使用带有加速传感器的设备,就可以使用更多的设备。

缺点:步骤数的准确性取决于算法和算法很难优化;背景服务需要保持活力,否则无法计算步骤;步骤计算算法更耗费功率。某些手机​​锁定屏幕无法计算步骤;

2。步骤计数传感器传感器.type_step_counter步骤计数方法:

翻译的官方解释(我不太擅长基于理解的英语翻译,请指出是否有任何错误):

该传感器将所有步骤从移动电话系统返回到当前时间。手机系统返回的步骤重新启动传感器为0。还返回一个时间戳,指示最后一步的时间。该执行器传感器是硬件,并且消耗了非常低的功率。如果要记录步骤数,请注册传感器并不要注销。它可以自动计算背景中的步骤,并且当应用程序醒来时,将计算总数的总数。该应用程序需要注册传感器,否则无法返回步骤数。

优点:硬件步骤计数的高精度;低功耗;只要您没有背景服务注册,就​​可以自动计算;

缺点:Android 4.4系统上方的一些手机;当手机系统重新启动时,计步器将重置;步骤详细信息无法返回(与步骤相对应的时间),但仅返回当前时间的总数。

步骤计数模块使用两个步骤计数方法:

确定是否支持Sensor.type_step_counter。如果支持阶梯传感器,如果不支持阶梯,则测量步进传感器。

使用加速度计的执行仪要求用户手动设置背景自启动,否则无法计数执行计。

使用步骤计数传感器需要克服程序中的缺点:手机系统重新启动计步器并清除;它无法返回步骤计数(步骤计数对应于时间),但仅返回当前时间的总数。

首先,介绍访问方法,并介绍步进模块的原理

访问方法

1。今天下载步骤计数演示

2。演示项目的结构如下:

今日访问项目结构图.png

从图可以看出,今天的stepcounterlib是由步骤计数模块封装的模块。它提供给外部的接口是IsportStepinterface.aidl

3。如何访问:

检查外部接口IsportStepinterface.AIDL代码如下:

// ISportStepInterface.aidl
package com.today.step.lib;
interface ISportStepInterface {
    /**
     * 获取当前时间运动步数
     */
     int getCurrentTimeSportStep();
     /**
      * 获取当天步数列表,json格式
      */
     String getTodaySportStepArray();
}

检查代码mainActivity.java,其中对其中的密钥代码有评论。

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;
    private TextView mStepArrayTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化计步模块
        TodayStepManager.init(getApplication());
        mStepArrayTextView = (TextView)findViewById(R.id.stepArrayTextView);
        //开启计步Service,同时绑定Activity进行aidl通信
        Intent intent = new Intent(this, TodayStepService.class);
        startService(intent);
        bindService(intent, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //Activity和Service通过aidl进行通信
                iSportStepInterface = ISportStepInterface.Stub.asInterface(service);
                try {
                    mStepSum = iSportStepInterface.getCurrentTimeSportStep();
                    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: {
                    //每隔500毫秒获取一次计步数据刷新UI
                    if (null != iSportStepInterface) {
                        int step = 0;
                        try {
                            step = iSportStepInterface.getCurrentTimeSportStep();
                        } 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 + "步");
    }
    public void onClick(View view){
        switch (view.getId()){
            case R.id.stepArrayButton:{
                //显示当天计步数据详细,步数对应当前时间
                if(null != iSportStepInterface){
                    try {
                        String stepArray = iSportStepInterface.getTodaySportStepArray();
                        mStepArrayTextView.setText(stepArray);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
                break;
            }
            default:break;
        }
    }
}

步骤计数模块原理步骤计数模块流程图

步骤计数模块流程图.png

说明流程图:

1。整个踏脚模块由在单独的过程中运行的服务(今天的步骤)提供。由于它在单独的过程中运行,因此提供的接口在外部采用AIDL表单(IsportStepinterface)。

2。零分离的广播(今天的stepalertreceive):用于解决整日步骤计数模块的零问题。由于步骤计数传感器不会根据当天的划分,因此仅返回当前步骤的总和,因此需要此广播来拆分步骤计数模块。 ,只要步骤计数模块越过天空问鼎娱乐下载链接入口,它将返回到零,从0开始。

3. Power-On Broadcast(TodayStepbootCompletereceiver):使用电源广播来解决重新启动移动电话时的步骤计数传感器的零问题。由于在重新启动手机时,步骤计数传感器将重置为零,因此在收到启动广播时将合并步骤计数,并且该服务将从上次关闭开始。步骤数开始积累。

4。数据库(今天的stepdbhelper):用于记录一天的步骤的详细信息,一次对应于一个步骤

5。加速传感器执行仪(今天的stepdcretor):由于Android 4.4或某些特殊手机不提供继母传感器,因此这些型号使用加速传感器进行执行,并收听OnStepcounterListener并返回到今天的StepService。

6。步骤计数传感器(今天的访问):Android 4.4或更高版本提供了一个步骤计数协处理器。通过低功耗和准确的步骤计数,可以通过步骤计数传感器将步骤计数返回到今天的步骤服务。

7。关闭监视(今天的stepshutdownreceiver):用于确定手机是否已关闭。重新启动手机时,打开步骤计数服务。根据此标志,确定是否重新启动并合并步骤。它主要提高准确性。有时无法收到启动广播。加速传感器阶梯表流图

加速传感器台阶流程图.png

说明流程图:

Android 4.4或某些特殊的手机不提供步骤计数传感器,因此我只能使用加速度计传感器来测量步骤计数。加速传感器的原理是使用某个算法来模拟步骤数(加速度传感器步骤计数算法不在本文讨论的本文范围内。在内部,使用此方法来计算步骤计数服务必须在背景,否则无法计算步骤计数。此方法使用intent.action_time_tick广播回调来确定当前时间和pefinenceShelper记录的最后时间是否相同。如果不是同步编号,则将步骤从0重置为零。使用PeastencEshelper保存步骤的记录,以防止手机系统的步骤编号在同一天重置为零。步骤计数传感器步骤计数流程图

步骤计数传感器步骤计数流程图。

说明流程图:

对于Android 4.4或更高版本,您可以使用步骤计数传感器进行步数。至于步骤计数传感器,已引入上述。这样,某些手机不需要程序自动许可。

有两种方法可以将整个天空的步骤分开:

1。第一个方法使用Intent.Action_Time_tick广播如上所述,我在这里不会说太多。

2。第二种方法使用AlertManager方法,该方法是设置0点钟的闹钟时钟,并将此0点广播中的步骤分开。并非每个手机都可以启动此AlertManager。

有四种方法可以确定手机系统的重新启动:

1。打开广播监视boot_completed。并非每个手机都可以收到此监视。如果接收到它,则可以启动服务,然后执行步骤计数模块,从上一次关闭步骤计数模块时积累。如果未收到,则只能使用以下方法来增加重新启动的判断。

2。关闭广播监视action_shutdown。并非每个手机都可以收到此监视。如果收到它,可以确定该系统已由用户手动启动服务重新启动。

3。记录运行时间并判断手机是否重新启动。最后一次运行大于确定重新启动的当前运行时间。它只会提高准确性。在极端情况下,将不会判断连续重新启动。

4。最后一个传感器步骤的总和,当前的传感器步骤小于最后一个传感器步骤,必须重新启动。它只是用于提高准确性,这不是绝对的。

步骤计数核心过程.png

该流程图的解释在图片上。

提高步骤计数准确性:

1。设置应用程序背景以自动启动

2。各种安全软件将应用程序设置为白名单,以确保该应用不会在后台被任何安全软件杀死。

以上两种方法可确保该应用程序始终显示在Notification Bar中的步骤数。

3。重新启动手机系统。如果未在通知栏中显示步骤数,则意味着该应用程序尚未收到启动监视,需要手动启动应用程序,否则将丢失步骤数。

如果该应用程序始终在后台还活着,它肯定会消耗功率。有些手机可以计算后台计数时计数后台计数,但是此方法需要每天在早上打开一次应用程序,以使步骤计数模块将步骤数量归零,否则将丢失步骤的数量。

需要优化:

1。共享流程每次传感器回调时都会写三下。

2。步骤计数模块在后台幸存。当步骤计数每天超过0钟,就会丢失一些步骤。缺少步骤的数量与启动步骤计数传感器所需的步骤数有关。例如:我的测试机只能连续行走10个步骤。步骤计数传感器回电,因此缺少10个步骤。

总结:

Android步骤数量正在与Android系统作斗争。各种系统监视回调不容易使用(AlertManager,Boot_completed,JobsCheduler)。对步骤计数传感器的某些限制(系统重新启动和零不能自动划分,某些手机杀死了步骤计数,而无法计数),我们必须避免使用不同手机的问题。我们只能尽量不要丢失步骤数并提高步骤计数的准确性。目前,我发现在测试步骤计数中计数非常准确。我猜该系统是Apleay系统过程。

只有不断地挖掘,优化,提高阶级计算准确性,并要求主下载代码以共同通信。

非常感谢您的作者

关键词:

客户评论

我要评论