NewStepActivity.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package com.xzjmyk.pm.newpedo.view;
  2. import android.content.ComponentName;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.graphics.Paint;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.IBinder;
  10. import android.os.Message;
  11. import android.os.Messenger;
  12. import android.os.RemoteException;
  13. import android.util.Log;
  14. import android.view.Display;
  15. import android.view.Menu;
  16. import android.view.MenuItem;
  17. import android.view.View;
  18. import android.view.WindowManager;
  19. import android.widget.LinearLayout;
  20. import android.widget.TextView;
  21. import com.baidu.android.pushservice.PushManager;
  22. import com.xzjmyk.pm.activity.MyApplication;
  23. import com.xzjmyk.pm.activity.R;
  24. import com.xzjmyk.pm.activity.ui.base.BaseActivity;
  25. import com.xzjmyk.pm.activity.ui.me.SettingActivity;
  26. import com.xzjmyk.pm.activity.util.PreferenceUtils;
  27. import com.xzjmyk.pm.newpedo.bean.StepEntity;
  28. import com.xzjmyk.pm.newpedo.calendar.BeforeOrAfterCalendarView;
  29. import com.xzjmyk.pm.newpedo.constant.Constant;
  30. import com.xzjmyk.pm.newpedo.db.StepDataDao;
  31. import com.xzjmyk.pm.newpedo.service.StepService;
  32. import com.xzjmyk.pm.newpedo.utils.StepCountCheckUtil;
  33. import com.xzjmyk.pm.newpedo.utils.TimeUtil;
  34. import java.text.DecimalFormat;
  35. import java.util.ArrayList;
  36. import java.util.List;
  37. import java.util.Timer;
  38. import java.util.TimerTask;
  39. public class NewStepActivity extends BaseActivity implements Handler.Callback {
  40. private LinearLayout movementCalenderLl;
  41. private TextView kmTimeTv;
  42. private TextView totalKmTv;
  43. private TextView stepsTimeTv;
  44. private TextView totalStepsTv;
  45. private TextView supportTv;
  46. public static String UU_STEP_NOTICE = "UUSTEPNOTICE";
  47. /**
  48. * 屏幕长度和宽度
  49. */
  50. public static int screenWidth, screenHeight;
  51. private BeforeOrAfterCalendarView calenderView;
  52. private String curSelDate;
  53. private DecimalFormat df = new DecimalFormat("#.##");
  54. private List<StepEntity> stepEntityList = new ArrayList<>();
  55. private StepDataDao stepDataDao;
  56. private LinearLayout steps_history_ll;
  57. private TextView steps_history_tv;
  58. @Override
  59. protected void onCreate(Bundle savedInstanceState) {
  60. super.onCreate(savedInstanceState);
  61. setContentView(R.layout.activity_newstep);
  62. initView();
  63. initData();
  64. initListener();
  65. }
  66. private void initView() {
  67. movementCalenderLl = (LinearLayout) findViewById(R.id.movement_records_calender_ll);
  68. kmTimeTv = (TextView) findViewById(R.id.movement_total_km_time_tv);
  69. totalKmTv = (TextView) findViewById(R.id.movement_total_km_tv);
  70. stepsTimeTv = (TextView) findViewById(R.id.movement_total_steps_time_tv);
  71. totalStepsTv = (TextView) findViewById(R.id.movement_total_steps_tv);
  72. supportTv = (TextView) findViewById(R.id.is_support_tv);
  73. steps_history_ll = (LinearLayout) findViewById(R.id.steps_history_ll);
  74. steps_history_tv = (TextView) findViewById(R.id.steps_history_tv);
  75. steps_history_tv.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
  76. curSelDate = TimeUtil.getCurrentDate();
  77. }
  78. private void initData() {
  79. WindowManager windowManager = getWindowManager();
  80. Display display = windowManager.getDefaultDisplay();
  81. screenWidth = display.getWidth();
  82. screenHeight = display.getHeight();
  83. //放到获取宽度之后
  84. calenderView = new BeforeOrAfterCalendarView(this);
  85. movementCalenderLl.addView(calenderView);
  86. /**
  87. * 这里判断当前设备是否支持计步
  88. */
  89. if (StepCountCheckUtil.isSupportStepCountSensor(this)) {
  90. getRecordList();
  91. supportTv.setVisibility(View.GONE);
  92. setDatas();
  93. setupService();
  94. PreferenceUtils.putInt(NewStepActivity.UU_STEP_NOTICE, 0);
  95. PushManager.resumeWork(MyApplication.getInstance());
  96. ToastMessage("小提示:UU在关闭后无法继续统计您的步数数据");
  97. } else {
  98. totalStepsTv.setText("0");
  99. supportTv.setVisibility(View.VISIBLE);
  100. }
  101. }
  102. private void initListener() {
  103. calenderView.setOnBoaCalenderClickListener(new BeforeOrAfterCalendarView.BoaCalenderClickListener() {
  104. @Override
  105. public void onClickToRefresh(int position, String curDate) {
  106. //获取当前选中的时间
  107. curSelDate = curDate;
  108. //根据日期去取数据
  109. setDatas();
  110. }
  111. });
  112. steps_history_ll.setOnClickListener(new View.OnClickListener() {
  113. @Override
  114. public void onClick(View v) {
  115. // Log.i("stepEntity",stepEntity+"");
  116. startActivity(new Intent(getApplicationContext(),NewStepListActivity.class));
  117. }
  118. });
  119. }
  120. private boolean isBind = false;
  121. private Messenger mGetReplyMessenger = new Messenger(new Handler(this));
  122. private Messenger messenger;
  123. /**
  124. * 开启计步服务
  125. */
  126. private void setupService() {
  127. Intent intent = new Intent(this, StepService.class);
  128. isBind = bindService(intent, conn, Context.BIND_AUTO_CREATE);
  129. startService(intent);
  130. Log.i("StepService","StepService开启了");
  131. }
  132. /**
  133. * 定时任务
  134. */
  135. private TimerTask timerTask;
  136. private Timer timer;
  137. /**
  138. * 用于查询应用服务(application Service)的状态的一种interface,
  139. * 更详细的信息可以参考Service 和 context.bindService()中的描述,
  140. * 和许多来自系统的回调方式一样,ServiceConnection的方法都是进程的主线程中调用的。
  141. */
  142. private ServiceConnection conn = new ServiceConnection() {
  143. /**
  144. * 在建立起于Service的连接时会调用该方法,目前Android是通过IBind机制实现与服务的连接。
  145. * @param name 实际所连接到的Service组件名称
  146. * @param service 服务的通信信道的IBind,可以通过Service访问对应服务
  147. */
  148. @Override
  149. public void onServiceConnected(ComponentName name, final IBinder service) {
  150. /**
  151. * 设置定时器,每个三秒钟去更新一次运动步数
  152. */
  153. timerTask = new TimerTask() {
  154. @Override
  155. public void run() {
  156. try {
  157. messenger = new Messenger(service);
  158. Message msg = Message.obtain(null, Constant.MSG_FROM_CLIENT);
  159. msg.replyTo = mGetReplyMessenger;
  160. messenger.send(msg);
  161. } catch (RemoteException e) {
  162. e.printStackTrace();
  163. }
  164. }
  165. };
  166. timer = new Timer();
  167. timer.schedule(timerTask, 0, 3000);
  168. }
  169. /**
  170. * 当与Service之间的连接丢失的时候会调用该方法,
  171. * 这种情况经常发生在Service所在的进程崩溃或者被Kill的时候调用,
  172. * 此方法不会移除与Service的连接,当服务重新启动的时候仍然会调用 onServiceConnected()。
  173. * @param name 丢失连接的组件名称
  174. */
  175. @Override
  176. public void onServiceDisconnected(ComponentName name) {
  177. }
  178. };
  179. /**
  180. * 设置记录数据
  181. *
  182. */
  183. private void setDatas() {
  184. StepEntity stepEntity = stepDataDao.getCurDataByDate(curSelDate);
  185. if (stepEntity != null) {
  186. int steps = Integer.parseInt(stepEntity.getSteps());
  187. //获取全局的步数
  188. totalStepsTv.setText(String.valueOf(steps));
  189. //计算总公里数
  190. totalKmTv.setText(countTotalKM(steps));
  191. } else {
  192. //获取全局的步数
  193. totalStepsTv.setText("0");
  194. //计算总公里数
  195. totalKmTv.setText("0");
  196. }
  197. //设置时间
  198. String time = TimeUtil.getWeekStr(curSelDate);
  199. kmTimeTv.setText(time);
  200. stepsTimeTv.setText(time);
  201. }
  202. /**
  203. * 简易计算公里数,假设一步大约有0.7米
  204. *
  205. * @param steps 用户当前步数
  206. * @return
  207. */
  208. private String countTotalKM(int steps) {
  209. double totalMeters = steps * 0.7;
  210. //保留两位有效数字
  211. return df.format(totalMeters / 1000);
  212. }
  213. /**
  214. * 获取全部运动历史纪录
  215. */
  216. private void getRecordList() {
  217. //获取数据库
  218. stepDataDao = new StepDataDao(this);
  219. stepEntityList.clear();
  220. stepEntityList.addAll(stepDataDao.getAllDatas());
  221. // TODO: 在这里获取历史记录条数,当条数达到7条或以上时,显示更多历史记录
  222. // if (stepEntityList.size() >= 7) {
  223. steps_history_ll.setVisibility(View.VISIBLE);
  224. // }else {
  225. // steps_history_ll.setVisibility(View.GONE);
  226. // }
  227. Log.i("stepEntityList", stepEntityList +"");
  228. }
  229. @Override
  230. public boolean handleMessage(Message msg) {
  231. switch (msg.what) {
  232. //这里用来获取到Service发来的数据
  233. case Constant.MSG_FROM_SERVER:
  234. //如果是今天则更新数据
  235. if (curSelDate.equals(TimeUtil.getCurrentDate())) {
  236. //记录运动步数
  237. int steps = msg.getData().getInt("steps");
  238. //设置的步数
  239. totalStepsTv.setText(String.valueOf(steps));
  240. //计算总公里数
  241. totalKmTv.setText(countTotalKM(steps));
  242. }
  243. break;
  244. }
  245. return false;
  246. }
  247. @Override
  248. protected void onDestroy() {
  249. super.onDestroy();
  250. //记得解绑Service,不然多次绑定Service会异常
  251. if (isBind) this.unbindService(conn);
  252. }
  253. @Override
  254. public boolean onCreateOptionsMenu(Menu menu) {
  255. return super.onCreateOptionsMenu(menu);
  256. }
  257. @Override
  258. public boolean onOptionsItemSelected(MenuItem item) {
  259. if (item.getItemId() == android.R.id.home){
  260. startActivity(new Intent(getApplicationContext(), SettingActivity.class));
  261. }
  262. return super.onOptionsItemSelected(item);
  263. }
  264. @Override
  265. public void onBackPressed() {
  266. startActivity(new Intent(getApplicationContext(), SettingActivity.class));
  267. super.onBackPressed();
  268. }
  269. }