refactor remote service callback and service connection.
authorkfl_614 <kfl_614@163.com>
Thu, 31 Dec 2020 09:25:00 +0000 (17:25 +0800)
committerkfl_614 <kfl_614@163.com>
Thu, 31 Dec 2020 09:25:00 +0000 (17:25 +0800)
app/src/main/aidl/com/ic/work/IHeartRateSensorCallback.aidl [new file with mode: 0644]
app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl [new file with mode: 0644]
app/src/main/aidl/com/ic/work/domain/HeartRate.aidl [new file with mode: 0644]
app/src/main/java/com/ic/blood/BloodActivity.java
app/src/main/java/com/ic/blood/fragment/BloodFragment.java
app/src/main/java/com/ic/blood/model/BloodCheckModel.java
app/src/main/java/com/ic/blood/presenter/BloodPresenter.java
app/src/main/java/com/ic/blood/util/ServiceUtil.java
app/src/main/java/com/ic/work/domain/HeartRate.java [new file with mode: 0644]

diff --git a/app/src/main/aidl/com/ic/work/IHeartRateSensorCallback.aidl b/app/src/main/aidl/com/ic/work/IHeartRateSensorCallback.aidl
new file mode 100644 (file)
index 0000000..12554f5
--- /dev/null
@@ -0,0 +1,16 @@
+// IHeartRateSensorCallback.aidl
+package com.ic.work;
+
+
+import com.ic.work.domain.HeartRate;
+
+interface IHeartRateSensorCallback {
+     //获取到了数据,最终数据
+     void onHeartRateGet(in HeartRate heartRate);
+     //数据更新中
+     void onHeartRateUpdate(in HeartRate heartRate);
+     //正在获取数据
+     void onGettingData();
+     //等待中
+     void onWaiting();
+}
\ No newline at end of file
diff --git a/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl b/app/src/main/aidl/com/ic/work/IHeartRateSensorService.aidl
new file mode 100644 (file)
index 0000000..10af642
--- /dev/null
@@ -0,0 +1,13 @@
+// IHeartRateSensorService.aidl
+package com.ic.work;
+
+import com.ic.work.IHeartRateSensorCallback;
+
+interface IHeartRateSensorService {
+   //注册接口
+    void registerCallback(in IHeartRateSensorCallback callback,in String callbackTag);
+    //取消接口注册
+    void unRegisterCallback(in IHeartRateSensorCallback callback);
+    //获取心率相关数据0表示Alarm,1表示客户端用户发出的,3表示服务端发出的单次获取指令
+    oneway void getHeartRateInfo(int from,in String callbackTag);
+}
\ No newline at end of file
diff --git a/app/src/main/aidl/com/ic/work/domain/HeartRate.aidl b/app/src/main/aidl/com/ic/work/domain/HeartRate.aidl
new file mode 100644 (file)
index 0000000..522b480
--- /dev/null
@@ -0,0 +1,4 @@
+// HeartRate.aidl
+package com.ic.work.domain;
+
+parcelable HeartRate;
\ No newline at end of file
index e4e88c3..6004406 100644 (file)
@@ -13,7 +13,6 @@ import android.os.Bundle;
 import android.view.WindowManager;
 
 import com.ic.blood.fragment.BloodFragment;
-import com.ic.blood.util.IcLog;
 
 public class BloodActivity extends AppCompatActivity {
 
index c5ed8d5..9a037a4 100644 (file)
@@ -94,7 +94,6 @@ public class BloodFragment extends Fragment {
     @Override
     public void onPause() {
         super.onPause();
-        bloodModel.stopCheckBlood();
         gifFromAssets.stop();
 
         releaseWakeLock();
index 070ef48..ce69b6f 100644 (file)
@@ -53,14 +53,6 @@ public class BloodCheckModel extends AndroidViewModel {
         return mObsCheckEnd;
     }
 
-    public void startCheckBlood() {
-        bloodPresenter.startCheckBlood();
-    }
-
-    public void stopCheckBlood() {
-        bloodPresenter.stopCheckBlood();
-    }
-
     public void onCreateView() {
         bloodPresenter.onCreate();
     }
index f44177b..6d2f4d0 100644 (file)
@@ -7,27 +7,26 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
-import android.os.Handler;
 import android.os.IBinder;
-import android.os.RemoteException;
 import android.util.SparseArray;
 
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
 import com.ic.aidl.blood.BloodState;
-import com.ic.aidl.blood.IBloodAidlInterface;
-import com.ic.aidl.blood.IBloodRemoteService;
 import com.ic.blood.R;
 import com.ic.blood.util.IcLog;
-import com.ic.blood.util.ServiceUtil;
 import com.ic.blood.util.SystemUtils;
+import com.ic.work.IHeartRateSensorCallback;
+import com.ic.work.IHeartRateSensorService;
+import com.ic.work.domain.HeartRate;
 
 
 public class BloodPresenter {
 
     private static final String TAG = "BloodPresenter";
     public static final String ACTION_ANTI_OFF0 = "com.ic.ACTION_ANTIOFF";
+    public static final String ACTION_HEART_RATE = "com.ic.sensor.data.action.HEART_RATE";
 
     private Context mContext;
 
@@ -37,15 +36,16 @@ public class BloodPresenter {
     private MutableLiveData<Integer> mObsCheckEnd;
     private MutableLiveData<String[]> mObsBloodTempValue;
 
-    private IBloodRemoteService mService;
+    private IHeartRateSensorService mService;
 
     private SparseArray<String> mTipsSpares;
     //判断有没有配戴的,如果没有配戴的话,就不更新数据了
     private boolean mHasWear = false;
+    private boolean mBind;
 
     public BloodPresenter(Context context) {
         this.mContext = context;
-        mTipsSpares = new SparseArray<String>();
+        mTipsSpares = new SparseArray<>();
         mTipsSpares.put(BloodState.BLOOD_NULL_TIPS, "");
         mTipsSpares.put(BloodState.BLOOD_NOT_DEVICE, context.getString(R.string.tips_not_device));
         mTipsSpares.put(BloodState.BLOOD_PLEASE_QUIET, context.getString(R.string.tips_quiet_please));
@@ -133,19 +133,22 @@ public class BloodPresenter {
         }
     };
 
+    /**
+     * 绑定远程服务
+     */
     private void bindRemoteService() {
-        ServiceUtil.bindServiceUtil(mContext,
-                "com.ic.action.WORK_SERVICE",
-                connection,
-                mContext.getPackageName());
+        Intent intent = new Intent();
+        intent.setAction(ACTION_HEART_RATE);
+        mBind = mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE);
     }
 
     public void release() {
         try {
             if (mService != null) {
-                mService.unregisterCallback(bloodInterface);
+                IcLog.d(TAG, "unRegister blood remote callback...");
+                mService.unRegisterCallback(bloodInterface);
             }
-            ServiceUtil.unBindServiceUtil(mContext, connection);
+            mContext.unbindService(connection);
         } catch (Exception e) {
             IcLog.e(TAG, "unregisterScreenReceiver", e);
         } finally {
@@ -160,28 +163,23 @@ public class BloodPresenter {
     }
 
     public void startCheckBlood() {
+        IcLog.d(TAG, "startCheckBlood...");
         if (mService != null) {
             mObsStateTips.postValue(mContext.getString(R.string.tips_ing_check));
             //处理UI变化
             try {
-                mService.startCheckBlood();
+                /**
+                 *  SERVER_CMD(0)服务端单次测量指令,
+                 *  ALARM_CMD(1)定时的测试指,
+                 *  CLIENT_CMD(2)用户UI主动的指令;
+                 */
+                mService.getHeartRateInfo(2, BloodPresenter.class.getName());
             } catch (Exception e) {
                 IcLog.e(TAG, "startCheckBlood", e);
             }
         }
     }
 
-    public void stopCheckBlood() {
-        if (mService != null) {
-            try {
-                mService.stopCheckBlood();
-            } catch (Exception e) {
-                IcLog.e(TAG, "stopCheckBlood", e);
-            }
-        }
-    }
-
-
     private void updateTipsInfo(String t, String b) {
         if (mObsTipsInfo != null) {
             mObsTipsInfo.postValue(new String[]{t, b});
@@ -200,11 +198,13 @@ public class BloodPresenter {
 
 
     private ServiceConnection connection = new ServiceConnection() {
+
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
+            IcLog.d(TAG, "onService onServiceConnected...");
             try {
-                mService = IBloodRemoteService.Stub.asInterface(service);
-                mService.registerCallback(bloodInterface);
+                mService = IHeartRateSensorService.Stub.asInterface(service);
+                mService.registerCallback(bloodInterface, BloodPresenter.class.getName());
                 startCheckBlood();
             } catch (Exception e) {
                 IcLog.e(TAG, "ServiceConnection", e);
@@ -213,43 +213,58 @@ public class BloodPresenter {
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
+            mService = null;
         }
     };
 
-    private IBloodAidlInterface.Stub bloodInterface = new IBloodAidlInterface.Stub() {
+    private IHeartRateSensorCallback.Stub bloodInterface = new IHeartRateSensorCallback.Stub() {
 
 
         @Override
-        public void updateBloodCheckTemp(int high, int low, int heart, int oxygen) throws RemoteException {
+        public void onHeartRateGet(HeartRate heartRate) {
+            IcLog.d(TAG, "final result -- >  "
+                    + heartRate.getBloodHeight() + " low == >  " + heartRate.getBloodLow() +
+                    " heart === > " + heartRate.getHeartRate()
+                    + " oxygen == > " + heartRate.getOxygen());
+            //最终结果
+            updateBoolValue(heartRate.getHeartRate(), heartRate.getBloodLow(),
+                    heartRate.getHeartRate(), heartRate.getOxygen());
+            mObsStateTips.postValue(mContext.getString(R.string.tips_finish_check));
+        }
+
+        @Override
+        public void onHeartRateUpdate(HeartRate heartRate) {
             //如果当前不有配戴,就不更新了
+            IcLog.d(TAG, "updating -- >  "
+                    + heartRate.getBloodHeight() + " low == >  " + heartRate.getBloodLow() +
+                    " heart === > " + heartRate.getHeartRate()
+                    + " oxygen == > " + heartRate.getOxygen());
             if (!mHasWear) {
-                IcLog.d(TAG, "have't wear device height -- >  "
-                        + high + " low == >  " + low +
-                        " heart === > " + heart
-                        + " oxygen == > " + oxygen);
                 mObsStateTips.postValue(mContext.getString(R.string.tips_not_wear));
                 return;
             }
             //测试的数值
             mObsBloodTempValue.postValue(new String[]{
-                    String.valueOf(high),
-                    String.valueOf(low),
-                    String.valueOf(heart),
-                    String.valueOf(oxygen)});
+                    String.valueOf(heartRate.getBloodHeight()),
+                    String.valueOf(heartRate.getBloodLow()),
+                    String.valueOf(heartRate.getHeartRate()),
+                    String.valueOf(heartRate.getOxygen())});
             mObsStateTips.postValue(mContext.getString(R.string.tips_ing_check));
         }
 
         @Override
-        public void updateBloodCheckResult(int high, int low, int heart, int oxygen) throws RemoteException {
-            //最终结果
-            updateBoolValue(high, low, heart, oxygen);
-            mObsStateTips.postValue(mContext.getString(R.string.tips_finish_check));
+        public void onGettingData() {
+            //todo:让UI显示正在测试
+            IcLog.d(TAG, "正在获取数据...");
         }
 
         @Override
-        public void updateBloodCheckTips(int top, int bottom) throws RemoteException {
-            updateTipsInfo(mTipsSpares.get(top), mTipsSpares.get(bottom));
+        public void onWaiting() {
+            IcLog.d(TAG, "任务正在等待...");
+            //updateTipsInfo(mTipsSpares.get(top), mTipsSpares.get(bottom));
+            //让UI显示保持安静,准备测试的玩意
         }
+
     };
 
 
index 2acf7a3..f20c9cc 100644 (file)
@@ -11,23 +11,23 @@ import java.util.List;
 
 public class ServiceUtil {
 
-    public static void startServiceUtil(Context context , String serviceAction, String packageName) {
+    public static void startServiceUtil(Context context, String serviceAction, String packageName) {
         Intent intent = getExplicitIntent(context, new Intent(serviceAction));
-        if(intent != null){
+        if (intent != null) {
             intent.setPackage(packageName);
             context.startService(intent);
         }
     }
 
-    public static void bindServiceUtil(Context context , String action, ServiceConnection connection,String pck) {
+    public static void bindServiceUtil(Context context, String action, ServiceConnection connection, String pck) {
         Intent in = getExplicitIntent(context, new Intent(action));
-        if(in != null){
+        if (in != null) {
             in.setPackage(pck);
-            context.bindService(in, connection, 0);
+            context.bindService(in, connection, Context.BIND_AUTO_CREATE);
         }
     }
 
-    public static void unBindServiceUtil(Context context ,ServiceConnection connection) {
+    public static void unBindServiceUtil(Context context, ServiceConnection connection) {
         context.unbindService(connection);
     }
 
diff --git a/app/src/main/java/com/ic/work/domain/HeartRate.java b/app/src/main/java/com/ic/work/domain/HeartRate.java
new file mode 100644 (file)
index 0000000..e2fa99e
--- /dev/null
@@ -0,0 +1,102 @@
+package com.ic.work.domain;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class HeartRate implements Parcelable {
+    //From,有时候是用户测试,主动通知服务器的
+    private int from;
+    //血压高值
+    private int bloodHeight;
+    //血压低值
+    private int bloodLow;
+    //心跳
+    private int heartRate;
+    //血氧值
+    private int oxygen;
+
+    public HeartRate(int bloodHeight, int bloodLow, int heartRate, int oxygen) {
+        this.bloodHeight = bloodHeight;
+        this.bloodLow = bloodLow;
+        this.heartRate = heartRate;
+        this.oxygen = oxygen;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public void setFrom(int from) {
+        this.from = from;
+    }
+
+    public int getBloodHeight() {
+        return bloodHeight;
+    }
+
+    public void setBloodHeight(int bloodHeight) {
+        this.bloodHeight = bloodHeight;
+    }
+
+    public int getBloodLow() {
+        return bloodLow;
+    }
+
+    public void setBloodLow(int bloodLow) {
+        this.bloodLow = bloodLow;
+    }
+
+    public int getHeartRate() {
+        return heartRate;
+    }
+
+    public void setHeartRate(int heartRate) {
+        this.heartRate = heartRate;
+    }
+
+    public int getOxygen() {
+        return oxygen;
+    }
+
+    public void setOxygen(int oxygen) {
+        this.oxygen = oxygen;
+    }
+
+    public static Creator<HeartRate> getCREATOR() {
+        return CREATOR;
+    }
+
+    protected HeartRate(Parcel in) {
+        from = in.readInt();
+        bloodHeight = in.readInt();
+        bloodLow = in.readInt();
+        heartRate = in.readInt();
+        oxygen = in.readInt();
+    }
+
+    public static final Creator<HeartRate> CREATOR = new Creator<HeartRate>() {
+        @Override
+        public HeartRate createFromParcel(Parcel in) {
+            return new HeartRate(in);
+        }
+
+        @Override
+        public HeartRate[] newArray(int size) {
+            return new HeartRate[size];
+        }
+    };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(from);
+        dest.writeInt(bloodHeight);
+        dest.writeInt(bloodLow);
+        dest.writeInt(heartRate);
+        dest.writeInt(oxygen);
+    }
+}