Android – 计步传感器

前言

之前写过一篇关于计步器(–> Android – 计步器的实现 <–)的文章,里面只是简单的介绍了一下原理,其实最重要的是看了大牛的各种优化,源码地址也放进去了。不得不说,大佬就是大佬。

本文主要是记录一下传感器该怎么玩,大佬请拍砖。

首先要在要在manifest中声明需要的软硬件特性:

1
2
3
4
5
6
7
8
<!--计步传感器-->
<uses-feature
android:name="android.hardware.sensor.stepcounter"
android:required="true" />
<!--步行检测传感器-->
<uses-feature
android:name="android.hardware.sensor.stepdetector"
android:required="true" />

emmm,这里我还想在啰嗦几句。计步传感器返回的是从开机至当前的步数,当重启手机后清零,因为是硬件传感器,所以精度高且低功耗,不需要后台保活。步行检测传感器只是用来检测走步,每次返回 1 或 0 。需要长时间计步建议使用计步传感器。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class ToolsTodayStep extends Activity implements SensorEventListener {
private TextView mTextViewStepNumber;
private SensorManager mSensorManager;
private Sensor mSensorCounter;
private Sensor mSensorDetector;
private int counterStep = 0;
private int counterDetector = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tools_today_step);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
mSensorDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
initView();
}
@Override
protected void onResume() {
super.onResume();
/**
* 注册传感器的三个参数说明
* 1. 接收信号的Listener实例
* 2. 传感器类型
* 3. 接收频度
*/
mSensorManager.registerListener(this, mSensorCounter, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mSensorDetector, SensorManager.SENSOR_DELAY_UI);
}
private void initView() {
mTextViewStepNumber = findViewById(R.id.tv_stepNumber);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
//当传感器值发生变化时
if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
//启动可能需要十步
counterStep = (int) sensorEvent.values[0] + 10;
} else if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
counterDetector++;
}
mTextViewStepNumber.setText("当前走了 " + counterDetector + " 步" + " ,总共走了 " + counterStep + " 步");
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
//当传感器精度发生变化时
}
}

布局就不放了,就一个TextView。实践了一下,如果APP停留后台的话,可一直看到当前步数和总步数变化,还是很准确的。当关闭APP之后,当前步数就清零了,但总步数还在累加。

需要优化的还很多,本菜鸡还在看大佬源码。。。

参考

http://blog.csdn.net/qq_21051503/article/details/73127662

http://blog.csdn.net/fukaimei/article/details/78306097

http://www.jianshu.com/p/5d57f7fd84fa

http://blog.csdn.net/WTunique/article/details/54581476

http://blog.csdn.net/niuzhucedenglu/article/details/53378265

http://blog.csdn.net/niuzhucedenglu/article/details/53379385

http://www.jianshu.com/p/cfc2a200e46d


Kotlin – 小栗子

前言

上Github的时候,发现今天是万圣节。热力图的颜色都变成了南瓜色,看起来还不错哦。

还没忘记上次立的Flag,已经坚持了三天了。想了一下,光学不用是肯定容易忘了,所以就想边学边做一些小栗子,但是哪些例子好的?刚好,我们在学Android,老师每周也会让做一些小实验,那就用Kotlin重写这些实验就当练习了,不过讲道理,不简单!老师给的小实验都很基础,之前也都放在一个叫 Exp1 这个仓库里,用Kotlin重写就放在 MyKotlinDemo 这个仓库吧。

好想找一个小伙伴一起学习呀,QwQ . . .


Android – Intent 过滤器

前言

我们知道,Intent有两种启动方式,显式和隐式启动。显式启动去下:

1
startActivity(new Intent(MainActivity.this,SecondActivity.class));

显式启动没什么好说的,今天主要是说说隐式启动。一个简单的例子如下:

1
2
3
Uri uri = Uri.parse("http://www.omooo.top");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

以上示例并没有明确指定要启动的组件,而是由系统决定。系统需要通过某种匹配规则来寻找需要启动的目标组件,这种匹配规则就依赖于Intent的过滤器实现。Intent过滤器是根据Intent中的动作(action)、类别(category)、数据(data)内容,对目标组件进行匹配和筛选的机制。当Intent匹配到一个过滤器上,系统就会启动相应的组件并传递给相应的Intent对象;如果匹配出了多个过滤器,系统会弹出对话框,由用户进行选择。下面就开始深入了解过滤规则。

more >>


每天学点Kotlin

前言

前几天Android Studio正式发布3.0版本,这个版本增加了对Kotlin的支持,不用在向以前一样安装插件转化代码了,可以直接新建一个kotlin项目,我觉得是时候上手尝试Kotlinl,一边学Android Java一边学Kotlin,毕竟Kotlin被Google定为Android第一开发语言,那Kotlin肯定有它很多的优势,慢慢发掘吧。

第一步

1
2
3
4
5
6
7
8
9
10
11
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun testKotlin(view: View) {
Toast.makeText(this, "Hello Kotlin", Toast.LENGTH_SHORT).show()
}
}

最后

Kotlin 笔记:https://github.com/Omooo/KotlinNotepad

又要立Flag了,每天学一点,希望这次能坚持久一点。


Android – Handle消息传递机制

前言

Android为了线程安全,并不会允许我们在UI线程外操作UI,很多时候我们做界面刷新都需要通过Handle来通知UI更新。当我们的子线程想修改Activity中的UI组件,我们可以新建一个Handle对象,通过这个对象向主线程发送消息。而我们发送的消息会先到主线程的MessageQueue进行等待,由Looper按先入先出的顺序取出,再根据Message对象的what属性进行分发给对应的Handle进行处理。

Handle怎么用?

  1. post(Runnable)
1
2
3
4
5
6
mHandler.post(new Runnable() {
@Override
public void run() {
mTextViewResult.setText("执行Handle的post方法成功");
}
});
  1. postDelayed(Runnable,long)

这里我们可以写一个类继承至Runnable,重写run方法,在里面处理UI更新,然后在主线程调用。

  1. sendMessage()

子线程sendMessage()传入一个Message对象,可以是int型,也可以为一个object对象,然后在主线程handleMessage(Message msg)里取出信息更新UI。

  1. sendMessageDelayed()

和上面大同小异。

Demo:https://github.com/Omooo/HandleDemo

四个按钮点击事件对应Handle的四种方法,也很简单清晰。

参考:

Android面试常客Handler详解

Android中的Handler, Looper, MessageQueue和Thread

最后

因为是看慕课网的课程来了解的Handle,学的并不深入。关于Looper还有MessageQueue的道理都懂,但是实际上我还没用到,我太菜了,深入之后再更新,留个坑吧。

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?