日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BMI指数计算器V4.0】项目实战

發布時間:2023/12/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BMI指数计算器V4.0】项目实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言? ? ?

? ? ? 【BMI指數計算器V4.0】與【BMI指數計算器V3.0】實現的效果是一樣的,不同的是在【BMI指數計算器V3.0】的基礎上加入了Service層(服務),BroadcastReceiver(廣播接收者),使得項目的架構較V3.0多了一層。之所以使用Service(服務),是為了讓數據庫這樣的與界面無關的業務邏輯放到Service(服務)中去處理,這也正是Service(服務)所擅長的。我們知道Android 有四大組件,分別是Activity(活動),Service(服務),BroadcastReceiver(廣播接收者)ContentProvider(內容提供者)。而這四大組件各自所擅長的都不一樣。

比如 :

?(1)Activity擅長處理界面顯示與界面交互工作;

?(2)Service擅長處理與界面無關,專門在后臺進程中執行的操作;

?(3)BroadcastReceiver擅長接收系統廣播以及Activity與Service之間的數據傳遞工作;

?(4)ContentProvider擅長讓不同應用程序間共享數據。

更新列表

1.項目架構增加了Service層和BroadcastReceiver

2.數據模型Bmi類實現了一個標識接口?Serializable

3.其他的都與V3.0保持一致


項目架構圖


技術預報

? 1.Sevice(服務組件技術) ? ?2.BroadcastReceiver(廣播接收者組件技術) ? ?3.數據對象或集合在不同組件間的傳遞(需要讓數據模型類實現標識接口?Serializable)? ? ? ?

界面開發

? ? ? ? V4.0主要是在V3.0的基礎上將項目的架構換成用Service去操作SQLite數據庫,得到數據后發廣播,讓BroadcastReceiver去接收,在界面方面并沒有改動,如果對界面開發不清楚的朋友請參考V3.0。

功能開發

?step1:數據模型層:com.kedi.bmi.model/Bmi.java
package com.kedi.bmi.model;import java.io.Serializable;/*** 指數數據實體類(數據模型) 實現一個標識接口Serializable(代表Bmi可以持久化,可放入Intent在各組件之間傳遞)* * @author 科弟* */ public class Bmi <span style="color:#ff0000;">implements Serializable</span> {/*** */private static final long serialVersionUID = 1L;// 唯一標識private int id;// 身高private double heigth;// 體重private double weigth;// 體重指數private double bmiNum;// 體重狀態private String bmiState;// 體重狀態圖片名private String stateIconId;// 計算時間private long calaTime;/*** 構造方法*/public Bmi() {}/*** 構造方法* * @param id* @param heigth* @param weigth* @param bmiNum* @param bmiState* @param stateIconId* @param calaTime*/public Bmi(int id, double heigth, double weigth, double bmiNum,String bmiState, String stateIconId, long calaTime) {super();this.id = id;this.heigth = heigth;this.weigth = weigth;this.bmiNum = bmiNum;this.bmiState = bmiState;this.stateIconId = stateIconId;this.calaTime = calaTime;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getHeigth() {return heigth;}public void setHeigth(double heigth) {this.heigth = heigth;}public double getWeigth() {return weigth;}public void setWeigth(double weigth) {this.weigth = weigth;}public double getBmiNum() {return bmiNum;}public void setBmiNum(double bmiNum) {this.bmiNum = bmiNum;}public String getBmiState() {return bmiState;}public void setBmiState(String bmiState) {this.bmiState = bmiState;}public String getStateIconId() {return stateIconId;}public void setStateIconId(String stateIconId) {this.stateIconId = stateIconId;}public long getCalaTime() {return calaTime;}public void setCalaTime(long calaTime) {this.calaTime = calaTime;}@Overridepublic String toString() {return "Bmi [id=" + id + ", heigth=" + heigth + ", weigth=" + weigth+ ", bmiNum=" + bmiNum + ", bmiState=" + bmiState+ ", stateIconId=" + stateIconId + ", calaTime=" + calaTime+ "]";}}

? step2:Service(服務)層:com.kedi.bmi.service/DataService.java
<span style="font-size:14px;">package com.kedi.bmi.service;import java.io.Serializable; import java.util.List;import android.app.Service; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder;import com.kedi.bmi.dao.BmiDao; import com.kedi.bmi.model.Bmi;/*** 數據服務* * @author 科弟* 數據服務:(1)創建數據服務public class DataService extends Service ;(2)編寫數據服務邏輯(對數據庫的增,刪,改,查);(3)在AndroidManifest.xml中注冊數據服務DataService;(4)在MainActivity的onCreate()方法中通過startService()方法啟動服務;在onDestroy()方法中通過stopService()方法停止服務;(5)在計算方法中給數據服務發送插入數據的方法;(6)在HistoryRecordActivity的onCreate()方法中給數據服務發送獲取數據的命令;(7)獲得數據后通過發廣播將數據發到 HistoryRecordActivity中,廣播接收者接收到廣播,獲取廣播中的數據,然后完成數據的顯示邏輯;(8)在對應的刪除方法中給數據服務發送刪除或清空的命令,讓數據服務完成刪除或清空功能。*/ public class DataService extends Service {// 數據服務的actionpublic static final String SERVICE_ACTION = "com.kedi.bmi.service.dataservice";// 接收數據的廣播接收者actionpublic static final String RECEIVER_ACTION = "com.kedi.bmi.queryBmis";// 插入歷史記錄數據的命令標識valuepublic static final int INSERT = 0x1;// 刪除某條歷史記錄的命令標識valuepublic static final int DELETE_ITEM = 0x2;// 清除所有歷史記錄的命令標識valuepublic static final int DELETE_ALL = 0x3;// 更新某條歷史記錄的命令標識valuepublic static final int UPDATE = 0x4;// 查詢所有歷史記錄的命令標識valuepublic static final int QUERY = 0x5;// 命令命令標識Keypublic static final String COMMAND = "command";// 傳遞Bmi數據到數據服務的Keypublic static final String KEY_BMI = "bmi";// 傳遞Bmi集合數據到數據服務的Keypublic static final String KEY_BMIS = "bmis";// 操作數據庫的業務邏輯類private BmiDao mBmiDao;@Overridepublic void onCreate() {super.onCreate();mBmiDao = new BmiDao(this);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if (intent != null) {int command = intent.getIntExtra(COMMAND, QUERY);switch (command) {case INSERT:// 插入歷史記錄數據到數據庫Bmi bmiInsert = (Bmi) intent.getSerializableExtra(KEY_BMI);if (bmiInsert != null) {mBmiDao.insertBmi(bmiInsert);}break;case DELETE_ITEM:// 從數據庫中刪除某條歷史記錄Bmi bmiDelete = (Bmi) intent.getSerializableExtra(KEY_BMI);if (bmiDelete != null) {mBmiDao.deleteBmi(bmiDelete);}break;case DELETE_ALL:// 清除數據庫中所有歷史記錄mBmiDao.deleteBmis();break;case UPDATE:// 更新數據庫中的某條歷史記錄Bmi bmiUpdate = (Bmi) intent.getSerializableExtra(KEY_BMI);if (bmiUpdate != null) {mBmiDao.updateBmi(bmiUpdate);}break;case QUERY:// 查詢數據庫中所有的歷史記錄// 創建獲取數據的異步任務類并調用execute()方法執行異步任務new InsertDataAsynkTask().execute();break;default:break;}}return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();}/*** 從數據庫查詢數據的一步任務類(查詢數據庫是耗時操作,最好用一步方式)* * @author 科弟* */class InsertDataAsynkTask extends AsyncTask<Void, Void, List<Bmi>> {/*** 子線程方法,做好事操作*/@Overrideprotected List<Bmi> doInBackground(Void... arg0) {return mBmiDao.getBmis();}@Overrideprotected void onPostExecute(List<Bmi> result) {super.onPostExecute(result);// 將數據傳給HisoryRecordActivity組件中// 這里我們用廣播的方式傳遞數據Intent intent = new Intent(RECEIVER_ACTION);Bundle bundle = new Bundle();//將要傳遞的數據存到Bundle中,bundle.putSerializable(KEY_BMIS, (Serializable) result);//將Bundle存到intent中,以方便在發廣播的時候把數據傳遞到Activity中//在Activity中通過Intent可獲得Intent中存放的數據intent.putExtras(bundle);sendBroadcast(intent);}} }</span><span style="font-size: 18px;"> </span>
? step3:將數據服務注冊到AndroidManifest.xml文件中
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.kedi.bmi"android:versionCode="4"android:versionName="4.0" ><!-- 配置SDK的最小版本號為14,最大版本號為19 --><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><!-- 注冊主界面Activity --><activityandroid:name=".ui.MainActivity"android:screenOrientation="portrait" ></activity><!-- 注冊歡迎界面Activity --><activityandroid:name=".ui.WelcomeActivity"android:screenOrientation="portrait" ><!-- 配置action,category,使得WelcomeActivity成為第一啟動界面 --><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".ui.HistoryRecordActivity"android:screenOrientation="portrait" /><span style="color:#ff0000;"><!-- 注冊數據服務DataService --><serviceandroid:name=".service.DataService"android:permission="permission.DataService" ><intent-filter><action android:name="com.kedi.bmi.service.dataservice" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></service></span></application></manifest></span>

step4:修改MainActivity相對應的代碼部分(紅色字體部分為修改)
package com.kedi.bmi.ui;import java.text.DecimalFormat;import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.TextView; import android.widget.Toast;import com.kedi.bmi.R; import com.kedi.bmi.listener.OnClickOkListener; import com.kedi.bmi.model.Bmi; import com.kedi.bmi.service.DataService; import com.kedi.bmi.utils.DataUtil; import com.kedi.bmi.utils.DialogUtil;/*** BMI指數計算器主界面管理類* * @author 科弟* */ @SuppressLint("ShowToast") public class MainActivity extends Activity implements OnClickListener,OnCheckedChangeListener {private EditText mHeightInputEt;// 身高輸入框private EditText mWeightInputEt;// 體重輸入框private Button mCalaBtn;// 計算按鈕private LinearLayout mResultLl;// 計算結果布局private TextView mWeightBmiTv;// 體重指數文本private TextView mWeightStateTv;// 體重狀態文本private Button mClearBtn;// 清除按鈕private double height;// 身高private double weight;// 體重private double bmi;// bmi指數值private String state;// 體重狀態private String weightBmi;// 您的體重指數:private String weightState;// 您的體重狀況:private ImageView mStateIv;// 體重狀態圖標// 可取體重狀態值數組private String[] states = { "偏瘦", "正常", "偏胖", "肥胖", "重度肥胖", "極重度肥胖" };// 體重狀態圖片id數組private int[] state_imageIds = { R.drawable.r1, R.drawable.r2,R.drawable.r3, R.drawable.r4, R.drawable.r5, R.drawable.r6 };private int state_imageId;// 當前體重狀態圖片id// 標準相關布局或控件private RadioGroup mStandardRg;// 標準可選組布局private RadioButton mWhoStandardRb;// WHO標準單選按鈕private RadioButton mAreaStandardRb;// 亞洲標準單選按鈕private static final int WHO_STANDARD = 0x1;// WHO標準private static final int AREA_STANDARD = 0x2;// 亞洲標準private int mCurrentStandard = WHO_STANDARD;// 當前標準private SharedPreferences sp;// 保存小量數據的類,數據會保存到指定文件名的XML文件中private static final String FILE_NAME = "data.xml";// 文件名// 歷史記錄相關private ImageButton mHistoryIb;<span style="color:#ff0000;">// 數據服務相關Intentprivate Intent intent;</span>@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 去掉系統標題欄requestWindowFeature(Window.FEATURE_NO_TITLE);// 關聯布局文件setContentView(R.layout.activity_main);// 初始化布局或控件initView();// 注冊控件點擊事件setViewListener();weightBmi = getResources().getString(R.string.weight_bmi);// 您的體重指數:weightState = getResources().getString(R.string.weight_state);// 您的體重狀況:<span style="color:#ff0000;">// 開啟數據服務的方法startDataService();</span>}/*** 初始化布局或控件的方法*/private void initView() {mHeightInputEt = (EditText) this.findViewById(R.id.et_height);// 身高輸入框mWeightInputEt = (EditText) this.findViewById(R.id.et_weight);// 體重輸入框mCalaBtn = (Button) this.findViewById(R.id.btn_cala);// 計算按鈕mResultLl = (LinearLayout) this.findViewById(R.id.ll_result);// 計算結果布局mWeightBmiTv = (TextView) this.findViewById(R.id.tv_bmi);// 體重指數文本mWeightStateTv = (TextView) this.findViewById(R.id.tv_state);// 體重狀態文本mStateIv = (ImageView) this.findViewById(R.id.iv_state);mClearBtn = (Button) this.findViewById(R.id.btn_clear);// 清除按鈕// 默認顯示計算按鈕(VISIBLE),隱藏結果布局(GONE)mCalaBtn.setVisibility(View.VISIBLE);mResultLl.setVisibility(View.GONE);mStandardRg = (RadioGroup) this.findViewById(R.id.rg_standard);// 標準可選組布局mWhoStandardRb = (RadioButton) this.findViewById(R.id.rb_who);// WHO標準單選按鈕mAreaStandardRb = (RadioButton) this.findViewById(R.id.rb_area);// 亞洲標準單選按鈕// 歷史記錄相關mHistoryIb = (ImageButton) this.findViewById(R.id.ib_history);}/*** 注冊控件點擊事件的方法*/private void setViewListener() {// 注冊點擊事件mCalaBtn.setOnClickListener(this);mClearBtn.setOnClickListener(this);// 注冊選擇事件mStandardRg.setOnCheckedChangeListener(this);// 歷史記錄相關mHistoryIb.setOnClickListener(this);}@Overridepublic void onClick(View v) {int id = v.getId();switch (id) {case R.id.btn_cala:// 計算邏輯// 獲取身高輸入框數據String heightStr = mHeightInputEt.getText().toString().trim();// 判斷身高輸入框數據是否為空if ("".equals(heightStr) || heightStr.length() == 0) {Toast.makeText(this, getResources().getString(R.string.tip1), 0).show();} else {try {// 將String類型轉化成Double類型height = Double.valueOf(heightStr);// 對身高數據范圍進行判斷(100.0~200.0)if (height < 100.0 || height > 200.0) {Toast.makeText(this,getResources().getString(R.string.height_round),Toast.LENGTH_SHORT).show();} else {String weightStr = mWeightInputEt.getText().toString().trim();// 體重數據非空判斷if ("".equals(weightStr) || weightStr.length() == 0) {Toast.makeText(this,getResources().getString(R.string.tip3),Toast.LENGTH_SHORT).show();} else {try {weight = Double.valueOf(weightStr);// 體重數據范圍判斷(30.0~150.0)if (weight < 30.0 || weight > 150.0) {Toast.makeText(this,getResources().getString(R.string.weight_round),Toast.LENGTH_SHORT).show();} else {// 計算bmi值calaBmi(mCurrentStandard);// 隱藏計算按鈕(GONE),顯示結果布局(VISIBLE)setViewVisible(false);}} catch (Exception e) {Toast.makeText(this,getResources().getString(R.string.tip2),Toast.LENGTH_SHORT).show();}}}} catch (Exception e) {Toast.makeText(this,getResources().getString(R.string.tip2),Toast.LENGTH_SHORT).show();}}break;case R.id.btn_clear:// 清除setViewVisible(true);break;case R.id.ib_history:// 跳轉到歷史記錄界面Intent intent = new Intent(MainActivity.this,HistoryRecordActivity.class);startActivity(intent);break;}}/*** 計算bmi值*/private void calaBmi(int standard) {// height/100.0 cm換算成mheight = height / 100.0;bmi = weight / (height * height);if (standard == WHO_STANDARD) {if (bmi < 18.5) {state = states[0];state_imageId = state_imageIds[0];} else if (bmi >= 18.5 && bmi <= 24.9) {state = states[1];state_imageId = state_imageIds[1];} else if (bmi > 24.9 && bmi <= 29.9) {state = states[2];state_imageId = state_imageIds[2];} else if (bmi > 29.9 && bmi <= 34.9) {state = states[3];state_imageId = state_imageIds[3];} else if (bmi > 34.9 && bmi <= 39.9) {state = states[4];state_imageId = state_imageIds[4];} else {state = states[5];state_imageId = state_imageIds[5];}} else {if (bmi < 18.5) {state = states[0];state_imageId = state_imageIds[0];} else if (bmi >= 18.5 && bmi <= 22.9) {state = states[1];state_imageId = state_imageIds[1];} else if (bmi > 22.9 && bmi <= 24.9) {state = states[2];state_imageId = state_imageIds[2];} else if (bmi > 24.9 && bmi <= 29.9) {state = states[3];state_imageId = state_imageIds[3];} else if (bmi > 29.9 && bmi <= 39.9) {state = states[4];state_imageId = state_imageIds[4];} else {state = states[5];state_imageId = state_imageIds[5];}}mStateIv.setImageResource(state_imageId);// 講計算結果插入數據庫Bmi bmiObj = new Bmi();bmiObj.setHeigth(Double.valueOf(DataUtil.getData(height * 100.0)));bmiObj.setWeigth(Double.valueOf(DataUtil.getData(weight)));bmiObj.setBmiNum(Double.valueOf(DataUtil.getData(bmi)));bmiObj.setBmiState(state);bmiObj.setStateIconId(state_imageId + "");// 當前系統時間(單位:毫秒)bmiObj.setCalaTime(System.currentTimeMillis());<span style="color:#ff0000;">insertBmi(bmiObj);</span>}/*** 控制計算按鈕與結果布局的顯示與隱藏* * @param visible*/private void setViewVisible(boolean visible) {if (visible) {mCalaBtn.setVisibility(View.VISIBLE);mResultLl.setVisibility(View.GONE);// 清空數據mWeightBmiTv.setText("");mWeightStateTv.setText("");mHeightInputEt.setText("");mWeightInputEt.setText("");height = 0.0;weight = 0.0;} else {// 獲得焦點mHeightInputEt.requestFocus();// 格式化數據的類mCalaBtn.setVisibility(View.GONE);mResultLl.setVisibility(View.VISIBLE);DecimalFormat format = new DecimalFormat("0.0");mWeightBmiTv.setText(weightBmi + format.format(bmi));mWeightStateTv.setText(weightState + state);}}@Overridepublic void onCheckedChanged(RadioGroup rg, int arg1) {int id = rg.getCheckedRadioButtonId();switch (id) {case R.id.rb_who:// 選中Who單選按鈕mCurrentStandard = WHO_STANDARD;break;case R.id.rb_area:// 選中亞洲單選按鈕mCurrentStandard = AREA_STANDARD;break;default:mCurrentStandard = WHO_STANDARD;break;}}@Overrideprotected void onResume() {super.onResume();// 獲取當前用戶選擇的標準sp = this.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);mCurrentStandard = sp.getInt("standard", WHO_STANDARD);// 根據用戶上次選擇的標準初始化單選框的選擇狀態switch (mCurrentStandard) {case WHO_STANDARD:mWhoStandardRb.setChecked(true);mAreaStandardRb.setChecked(false);break;case AREA_STANDARD:mWhoStandardRb.setChecked(false);mAreaStandardRb.setChecked(true);break;default:mWhoStandardRb.setChecked(true);mAreaStandardRb.setChecked(false);break;}}@Overrideprotected void onPause() {super.onPause();// 保存當前用戶選擇的標準sp = this.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);Editor editor = sp.edit();editor.putInt("standard", mCurrentStandard);editor.commit();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// 監聽用戶按鍵,如果按回退鍵,退出程序if (keyCode == KeyEvent.KEYCODE_BACK) {// 獲得對話框標題與提示消息String title = getResources().getString(R.string.back);String message = getResources().getString(R.string.back_message);DialogUtil.showDialog(this, title, message,new OnClickOkListener() {@Overridepublic void onClick(View view) {// 退出程序MainActivity.this.finish();}});}return true;}<span style="color:#ff0000;">@Overrideprotected void onDestroy() {super.onDestroy();// 停止數據服務的方法stopDataService();}</span><span style="color:#ff0000;">/*** 開啟數據服務的方法*/private void startDataService() {// 啟動數據服務---startintent = new Intent();intent.setAction(DataService.SERVICE_ACTION);intent.setClass(this, DataService.class);startService(intent);// 啟動數據服務---end}/*** 停止數據服務的方法*/private void stopDataService() {intent = new Intent();intent.setAction(DataService.SERVICE_ACTION);intent.setClass(this, DataService.class);stopService(intent);}/*** 發命令給數據服務,執行插手數據功能* * @param bmiObj* 要插入的Bmi數據對象*/private void insertBmi(Bmi bmiObj) {// 發送插入數據命令給數據服務,執行插入數據功能---startintent.putExtra(DataService.COMMAND, DataService.INSERT);intent.putExtra(DataService.KEY_BMI, bmiObj);startService(intent);// 發送插入數據命令給數據服務,執行插入數據功能---end}</span> }
step5:修改HistoryRecordActivity歷史記錄列表相對應代碼(紅色字體為修改部分)
package com.kedi.bmi.ui;import java.util.List;import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;import com.kedi.bmi.R; import com.kedi.bmi.adapter.HistoryRecordAdapter; import com.kedi.bmi.listener.OnClickOkListener; import com.kedi.bmi.model.Bmi; import com.kedi.bmi.service.DataService; import com.kedi.bmi.utils.DialogUtil;/*** 歷史計算記錄Activity類* * @author 科弟* */ public class HistoryRecordActivity extends Activity implements OnClickListener,OnItemLongClickListener {private LinearLayout mHistoryLl;// 歷史記錄布局private TextView mEmptyTv;// 當歷史列表為空時,顯示該文本提示private ListView mHistoryLv;// 歷史記錄列表視圖private HistoryRecordAdapter mAdapter;// 數據適配器private List<Bmi> mDatas;// 數據集合private ImageButton mBackIb;// 回退按鈕private ImageButton mClearIb;// 清空按鈕<span style="color:#ff0000;">// 數據服務相關Intentprivate Intent intent;// 廣播接送者private DataBroadCastReceiver mReceiver;</span>@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 取消系統默認標題欄requestWindowFeature(Window.FEATURE_NO_TITLE);// 關聯XML布局界面setContentView(R.layout.activity_history_record);// 初始化視圖的方法initView();// 注冊點擊事件監聽器setListener();<span style="color:#ff0000;">// 配置數據服務configDataService();// 注冊DataBroadCastReceiver廣播接收者registerDataBroadCastReceiver();// 獲取所有歷史記錄getBmis();</span>}/*** 初始化視圖的方法*/private void initView() {mHistoryLl = (LinearLayout) this.findViewById(R.id.ll_history);mEmptyTv = (TextView) this.findViewById(R.id.tv_empty);mHistoryLv = (ListView) this.findViewById(R.id.lv_history);mBackIb = (ImageButton) this.findViewById(R.id.ib_back);mClearIb = (ImageButton) this.findViewById(R.id.ib_clear);}/*** 注冊點擊事件監聽器*/private void setListener() {mBackIb.setOnClickListener(this);mClearIb.setOnClickListener(this);// 注冊ListView列表條目長按事件監聽器mHistoryLv.setOnItemLongClickListener(this);}@Overridepublic void onClick(View v) {int id = v.getId();switch (id) {case R.id.ib_back:// 銷毀當前Activityfinish();break;case R.id.ib_clear:// 彈出二次確認對話框// 獲得對話框標題與提示消息String title = getResources().getString(R.string.clear1);String message = getResources().getString(R.string.clear1_message);if (mDatas != null && mDatas.size() > 0) {DialogUtil.showDialog(this, title, message,new OnClickOkListener() {@Overridepublic void onClick(View view) {// 清空所有歷史數據deleteBmis();}});} else {Toast.makeText(this, getResources().getString(R.string.empty),Toast.LENGTH_SHORT).show();}break;}}@Overridepublic boolean onItemLongClick(AdapterView<?> adapterView, View view,final int position, long arg3) {// 彈出二次確認對話框// 獲得對話框標題與提示消息String title = getResources().getString(R.string.delete);String message = getResources().getString(R.string.delete_message);DialogUtil.showDialog(this, title, message, new OnClickOkListener() {@Overridepublic void onClick(View view) {// 刪除當前條目deleteBmi(position);}});return false;}<span style="color:#ff0000;">/*** 配置數據服務*/private void configDataService() {intent = new Intent();intent.setAction(DataService.SERVICE_ACTION);intent.setClass(this, DataService.class);}/*** 發送查詢命令到數據服務,獲取所有的Bmi數據*/private void getBmis() {intent.putExtra(DataService.COMMAND, DataService.QUERY);startService(intent);}</span>/*** 清空所有歷史數據的方法*/private void deleteBmis() {<span style="color:#ff0000;">// 清空數據庫deleteBmisDB();</span>// 清空內存集合mDatas.clear();// 刷新界面mAdapter.notifyDataSetChanged();// 顯示空文本提示,隱藏歷史列表布局mHistoryLl.setVisibility(View.GONE);mEmptyTv.setVisibility(View.VISIBLE);}/*** 刪除當前條目的方法* * @param position*/private void deleteBmi(int position) {// 刪除當前條目<span style="color:#ff0000;">// 刪除數據庫對應位置對象對應Id的數據記錄deleteBmiDB(mDatas.get(position));</span>// 刪除內存集合中對應位置的數據mDatas.remove(position);// 刷新界面mAdapter.notifyDataSetChanged();if (mDatas.size() <= 0) {// 顯示空文本提示,隱藏歷史列表布局mHistoryLl.setVisibility(View.GONE);mEmptyTv.setVisibility(View.VISIBLE);} else {// 隱藏空文本提示,顯示歷史列表布局mHistoryLl.setVisibility(View.VISIBLE);mEmptyTv.setVisibility(View.GONE);}}<span style="color:#ff0000;">/*** 清空數據庫*/private void deleteBmisDB() {// 清空數據庫,給數據服務發送清空命令,執行清空任務intent.putExtra(DataService.COMMAND, DataService.DELETE_ALL);startService(intent);}/*** 刪除數據庫當前條目*/private void deleteBmiDB(Bmi bmi) {// 刪除數據庫當前條目,給數據服務發送刪除當前條目命令,執行刪除當前條目任務intent.putExtra(DataService.COMMAND, DataService.DELETE_ITEM);intent.putExtra(DataService.KEY_BMI, bmi);startService(intent);}</span><span style="color:#ff0000;">/*** 接收從數據服務發送的廣播* * @author 科弟* */class DataBroadCastReceiver extends BroadcastReceiver {// 接收廣播的Action@SuppressWarnings("unchecked")@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (DataService.RECEIVER_ACTION.equals(action)) {mDatas = (List<Bmi>) intent.getSerializableExtra(DataService.KEY_BMIS);if (mDatas != null && mDatas.size() > 0) {// 隱藏空文本提示,顯示歷史列表布局mHistoryLl.setVisibility(View.VISIBLE);mEmptyTv.setVisibility(View.GONE);mAdapter = new HistoryRecordAdapter(HistoryRecordActivity.this, mDatas);mHistoryLv.setAdapter(mAdapter);} else {// 顯示空文本提示,隱藏歷史列表布局mHistoryLl.setVisibility(View.GONE);mEmptyTv.setVisibility(View.VISIBLE);}}}}/*** 注冊DataBroadCastReceiver廣播接收者*/private void registerDataBroadCastReceiver() {mReceiver = new DataBroadCastReceiver();IntentFilter filter = new IntentFilter(DataService.RECEIVER_ACTION);registerReceiver(mReceiver, filter);}/*** 反注冊(銷毀)DataBroadCastReceiver廣播接收者*/private void unRegisterDataBroadCastReceiver() {if (mReceiver != null) {unregisterReceiver(mReceiver);}}</span><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"> @Override</span><span style="font-family: Arial, Helvetica, sans-serif;"> protected void onDestroy() {</span> super.onDestroy();// 反注冊(銷毀)DataBroadCastReceiver廣播接收者unRegisterDataBroadCastReceiver();}}
? ? 其他功能部分沒有改變,可在V3.0的基礎上修改,也可將V3.0中未改變的部分直接移植到V4.0項目中。

結語

??V4.0囊括了Android中的四大組件中的三個組件,SQLite數據庫等核心技術,希望能讓大家對Activity,Service,BroadcastReceiver,SQLite數據庫的有更具實戰意義的理解!


總結

以上是生活随笔為你收集整理的【BMI指数计算器V4.0】项目实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。