在看完之前一篇文章后,我又找到以下这篇文章,这篇里包含了一个计步器的源代码,我觉得自己来研究一下。
作为一个新手,看别人代码只能一步步慢慢研究摸索,先看了工程的AndroidManifest.xml,具体代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.base.basepedo">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-feature android:name="android.hardware.sensor.accelerometer" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.base.basepedo.service.StepService"
android:process="com.base.basepedo.step"
android:priority="1000">
<intent-filter >
<!-- 系统启动完成后会调用-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.DATE_CHANGED"/>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.ACTION_TIME_TICK" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</service>
</application>
</manifest>
这里面除了需要用到的权限之外,只有一个MainActivity和一个StepService的注册。既然是从MainActivity进入,那么就先看MainActivity的内容。在MainActivity里先看onCreate方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setupService();
}
private void init() {
text_step = (TextView) findViewById(R.id.text_step);
delayHandler = new Handler(this);
}
private void setupService() {
Intent intent = new Intent(this, StepService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
startService(intent);
}
在MainActivity里除了设置布局调用了init()和 setupService()两个方法。init方法中实例化了一个handler,然后在setupService方法里绑定一个服务StepService,就是之前AndroidManifest.xml里看到的那个服务。然后在ServiceConnection的onServiceConnected方法里发送一个消息。消息中msg.replyTo是干什么以前没用过,查阅资料后暂时理解为一个消息管理器,会关联到一个handler,handler就是处理其中的消息。
private Messenger mGetReplyMessenger = new Messenger(new Handler(this));
private Handler delayHandler;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
messenger = new Messenger(service);
Message msg = Message.obtain(null, Constant.MSG_FROM_CLIENT);
msg.replyTo = mGetReplyMessenger;
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
MainActivity里基本就没有什么其他的内容了,在onBackPressed设置了后退键将Activity置为后台,在onDestory方法里解除服务的绑定。
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onBackPressed() {
moveTaskToBack(true);
super.onBackPressed();
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}
接下来去看StepService这个服务里到底做了什么。
<span style="font-size:14px;">package com.base.basepedo.service;
import android.app.Notification;
import ......
public class StepService extends Service implements SensorEventListener {
//默认为30秒进行一次存储
private static int duration = 30000;
private static String CURRENTDATE = "";
private SensorManager sensorManager;
private StepDcretor stepDetector;
private NotificationManager nm;
private NotificationCompat.Builder builder;
private Messenger messenger = new Messenger(new MessenerHandler());
private BroadcastReceiver mBatInfoReceiver;
private WakeLock mWakeLock;
private TimeCount time;
//测试
private static int i = 0;
//计步传感器类型 0-counter 1-detector
private static int stepSensor = -1;
private static class MessenerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Constant.MSG_FROM_CLIENT:
try {
Messenger messenger = msg.replyTo;
Message replyMsg = Message.obtain(null, Constant.MSG_FROM_SERVER);
Bundle bundle = new Bundle();
bundle.putInt("step", StepDcretor.CURRENT_SETP);
replyMsg.setData(bundle);
messenger.send(replyMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
@Override
public void onCreate() {
super.onCreate();
CURRENTDATE = getTodayDate();
initBroadcastReceiver();
new Thread(new Runnable() {
public void run() {
startStepDetector();
}
}).start();
startTimeCount();
initTodayData();
updateNotification("今日步数:" + StepDcretor.CURRENT_SETP + " 步");
}
private String getTodayDate() {
Date date = new Date(System.currentTimeMil