From b2d2d7ac99fbded83237d7a1ea1deef854113521 Mon Sep 17 00:00:00 2001 From: BigPickle Date: Thu, 4 Jun 2026 17:51:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DGPS=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=B5=81=E6=96=AD=E8=A3=82=EF=BC=8C=E6=89=93?= =?UTF-8?q?=E9=80=9AMainService=E2=86=92=E5=B9=BF=E6=92=AD=E2=86=92ChildSe?= =?UTF-8?q?rvice=E5=AE=8C=E6=95=B4=E9=93=BE=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GpsSubscribeResult 增加 latitude/longitude/locationTime 字段及序列化 - GpsSubscribeReceiverService 重写 onCreate/onDestroy 动态注册广播接收器,onStartCommand 读取 SID 并绑定 - GpsSubscribeControlView 启动服务时传递 EXTRA_SUBSCRIBE_SID - MainService 步长判断通过后调用 sendSubscribeResult();initManager() 补调 initContext(this) - GpsReceiverChildService{1,2,3} 补调 super.onStartCommand - AndroidManifest.xml 修正广播 Action 为 cc.winboll.studio.GPS_SUBSCRIBE_CALLBACK - GpsSubscribeManager/GpsSubscribeObserverReceiver 广播 Extra 键名改用常量 - GpsSubscribeConst 新增 EXTRA_SUBSCRIBE_SID/EXTRA_SUBSCRIBE_RESULT/EXTRA_LOCATION_POINT --- gitsion/build.properties | 4 +- .../gitsion/GpsReceiverChildService1.java | 1 + .../gitsion/GpsReceiverChildService2.java | 1 + .../gitsion/GpsReceiverChildService3.java | 1 + .../winboll/studio/gitsion/MainService.java | 26 ++++++++- libgitsion/src/main/AndroidManifest.xml | 2 +- .../manager/GpsSubscribeManager.java | 2 +- .../libgitsion/model/GpsSubscribeConst.java | 5 ++ .../libgitsion/model/GpsSubscribeResult.java | 37 ++++++++++++- .../GpsSubscribeObserverReceiver.java | 2 +- .../service/GpsSubscribeReceiverService.java | 55 +++++++++++++++++++ .../view/GpsSubscribeControlView.java | 3 +- 12 files changed, 128 insertions(+), 11 deletions(-) diff --git a/gitsion/build.properties b/gitsion/build.properties index d8a96d5..b74b676 100644 --- a/gitsion/build.properties +++ b/gitsion/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed Jun 03 12:37:33 GMT 2026 +#Thu Jun 04 17:48:23 HKT 2026 stageCount=27 libraryProject= baseVersion=15.11 publishVersion=15.11.26 -buildCount=37 +buildCount=43 baseBetaVersion=15.11.27 diff --git a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService1.java b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService1.java index f2548de..d7ff1c0 100644 --- a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService1.java +++ b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService1.java @@ -21,6 +21,7 @@ public final class GpsReceiverChildService1 extends GpsSubscribeReceiverService @Override public int onStartCommand(Intent intent, int flags, int startId) { + super.onStartCommand(intent, flags, startId); return START_NOT_STICKY; } } diff --git a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService2.java b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService2.java index eaec1fc..8cd892d 100644 --- a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService2.java +++ b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService2.java @@ -20,6 +20,7 @@ public final class GpsReceiverChildService2 extends GpsSubscribeReceiverService @Override public int onStartCommand(Intent intent, int flags, int startId) { + super.onStartCommand(intent, flags, startId); return START_NOT_STICKY; } } diff --git a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService3.java b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService3.java index cad364d..f5eae25 100644 --- a/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService3.java +++ b/gitsion/src/main/java/cc/winboll/studio/gitsion/GpsReceiverChildService3.java @@ -20,6 +20,7 @@ public final class GpsReceiverChildService3 extends GpsSubscribeReceiverService @Override public int onStartCommand(Intent intent, int flags, int startId) { + super.onStartCommand(intent, flags, startId); return START_NOT_STICKY; } } diff --git a/gitsion/src/main/java/cc/winboll/studio/gitsion/MainService.java b/gitsion/src/main/java/cc/winboll/studio/gitsion/MainService.java index cf2a4d4..900d2dd 100644 --- a/gitsion/src/main/java/cc/winboll/studio/gitsion/MainService.java +++ b/gitsion/src/main/java/cc/winboll/studio/gitsion/MainService.java @@ -18,7 +18,9 @@ import androidx.core.app.NotificationCompat; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libgitsion.manager.GpsSubscribeManager; import cc.winboll.studio.libgitsion.manager.SubscribeLocationManager; +import cc.winboll.studio.libgitsion.model.GpsSubscribeConst; import cc.winboll.studio.libgitsion.model.GpsSubscribeMsg; +import cc.winboll.studio.libgitsion.model.GpsSubscribeResult; import java.util.Map; @@ -85,6 +87,7 @@ public final class MainService extends Service { */ private void initManager() { mSubscribeManager = GpsSubscribeManager.getInstance(); + mSubscribeManager.initContext(this); mLocationRuleManager = SubscribeLocationManager.getInstance(); } @@ -189,20 +192,37 @@ public final class MainService extends Service { //更新前台通知文案 updateForegroundNotification(locationInfo); + double currentLat = location.getLatitude(); + double currentLng = location.getLongitude(); + long currentTime = location.getTime(); + //遍历全部订阅者进行推送规则判断 Map subscribeAllMap = mSubscribeManager.getSubscribeMap(); for (Map.Entry entry : subscribeAllMap.entrySet()) { final String subscribeSid = entry.getKey(); final GpsSubscribeMsg subscribeConfig = entry.getValue(); - double currentLat = location.getLatitude(); - double currentLng = location.getLongitude(); - //判断是否满足推送条件(全订阅/步长阈值) boolean allowPush = mLocationRuleManager.isNeedPush(subscribeSid, currentLat, currentLng); if (allowPush) { //推送成功后刷新该订阅者基准定点坐标 mLocationRuleManager.updateSubscriberPoint(subscribeSid, currentLat, currentLng); + mLocationRuleManager.addPushCount(subscribeSid); + + //发送结果广播给订阅者 + GpsSubscribeResult result = new GpsSubscribeResult( + subscribeSid, + GpsSubscribeConst.RESULT_SUCCESS, + "GPS定位推送", + GpsSubscribeConst.GPS_STATE_LOCATED, + 0, + System.currentTimeMillis(), + currentLat, + currentLng, + currentTime + ); + mSubscribeManager.sendSubscribeResult(result); + LogUtils.d(TAG, "推送GPS数据至订阅者 SID:" + subscribeSid); } } } diff --git a/libgitsion/src/main/AndroidManifest.xml b/libgitsion/src/main/AndroidManifest.xml index 4079f4b..f1b9965 100644 --- a/libgitsion/src/main/AndroidManifest.xml +++ b/libgitsion/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ - + diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/manager/GpsSubscribeManager.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/manager/GpsSubscribeManager.java index 611f925..36399e5 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/manager/GpsSubscribeManager.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/manager/GpsSubscribeManager.java @@ -59,7 +59,7 @@ public final class GpsSubscribeManager { return; } Intent intent = new Intent(GpsSubscribeConst.ACTION_SUBSCRIBE_CALLBACK); - intent.putExtra("data",result); + intent.putExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_RESULT, result); appContext.sendBroadcast(intent); } diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeConst.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeConst.java index 9dc27ac..ea40520 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeConst.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeConst.java @@ -37,6 +37,11 @@ public final class GpsSubscribeConst { public static final String ACTION_SUBSCRIBE_REQUEST = "cc.winboll.studio.GPS_SUBSCRIBE_REQUEST"; public static final String ACTION_SUBSCRIBE_CALLBACK = "cc.winboll.studio.GPS_SUBSCRIBE_CALLBACK"; + //Intent Extra 键名 + public static final String EXTRA_SUBSCRIBE_SID = "extra_subscribe_sid"; + public static final String EXTRA_SUBSCRIBE_RESULT = "extra_subscribe_result"; + public static final String EXTRA_LOCATION_POINT = "extra_location_point"; + //超时毫秒 public static final long SUBSCRIBE_TIME_OUT = 5000; diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeResult.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeResult.java index 4d8be3f..c7371b9 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeResult.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/model/GpsSubscribeResult.java @@ -17,19 +17,28 @@ public final class GpsSubscribeResult implements Parcelable { private final int gpsRunningState; private final long realEffectiveInterval; private final long currentTimeStamp; + private final double latitude; + private final double longitude; + private final long locationTime; public GpsSubscribeResult(String subscribeUniqueId, int resultCode, String resultDesc, int gpsRunningState, long realEffectiveInterval, - long currentTimeStamp) { + long currentTimeStamp, + double latitude, + double longitude, + long locationTime) { this.subscribeUniqueId = subscribeUniqueId; this.resultCode = resultCode; this.resultDesc = resultDesc; this.gpsRunningState = gpsRunningState; this.realEffectiveInterval = realEffectiveInterval; this.currentTimeStamp = currentTimeStamp; + this.latitude = latitude; + this.longitude = longitude; + this.locationTime = locationTime; } public String getSubscribeUniqueId() { @@ -56,6 +65,18 @@ public final class GpsSubscribeResult implements Parcelable { return currentTimeStamp; } + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public long getLocationTime() { + return locationTime; + } + @Override public int describeContents() { return 0; @@ -69,6 +90,9 @@ public final class GpsSubscribeResult implements Parcelable { dest.writeInt(gpsRunningState); dest.writeLong(realEffectiveInterval); dest.writeLong(currentTimeStamp); + dest.writeDouble(latitude); + dest.writeDouble(longitude); + dest.writeLong(locationTime); } public static final Creator CREATOR = new Creator() { @@ -80,6 +104,9 @@ public final class GpsSubscribeResult implements Parcelable { in.readString(), in.readInt(), in.readLong(), + in.readLong(), + in.readDouble(), + in.readDouble(), in.readLong() ); } @@ -98,6 +125,9 @@ public final class GpsSubscribeResult implements Parcelable { bundle.putInt("gpsState", gpsRunningState); bundle.putLong("realInterval", realEffectiveInterval); bundle.putLong("time", currentTimeStamp); + bundle.putDouble("lat", latitude); + bundle.putDouble("lng", longitude); + bundle.putLong("locTime", locationTime); return bundle; } @@ -108,7 +138,10 @@ public final class GpsSubscribeResult implements Parcelable { bundle.getString("desc"), bundle.getInt("gpsState"), bundle.getLong("realInterval"), - bundle.getLong("time") + bundle.getLong("time"), + bundle.getDouble("lat"), + bundle.getDouble("lng"), + bundle.getLong("locTime") ); } } diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/receiver/GpsSubscribeObserverReceiver.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/receiver/GpsSubscribeObserverReceiver.java index 0014da0..9607c0f 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/receiver/GpsSubscribeObserverReceiver.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/receiver/GpsSubscribeObserverReceiver.java @@ -28,7 +28,7 @@ public final class GpsSubscribeObserverReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(GpsSubscribeConst.ACTION_SUBSCRIBE_CALLBACK.equals(action)){ - GpsSubscribeResult result = intent.getParcelableExtra("data"); + GpsSubscribeResult result = intent.getParcelableExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_RESULT); if(listener != null && result != null){ listener.onResultBack(result); } diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/service/GpsSubscribeReceiverService.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/service/GpsSubscribeReceiverService.java index 008b551..7087760 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/service/GpsSubscribeReceiverService.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/service/GpsSubscribeReceiverService.java @@ -1,11 +1,17 @@ package cc.winboll.studio.libgitsion.service; import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.IBinder; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libgitsion.manager.SubscribeLocationManager; +import cc.winboll.studio.libgitsion.model.GpsSubscribeConst; import cc.winboll.studio.libgitsion.model.GpsSubscribeMsg; +import cc.winboll.studio.libgitsion.model.GpsSubscribeResult; import cc.winboll.studio.libgitsion.model.LocationPoint; /** @@ -19,10 +25,59 @@ public abstract class GpsSubscribeReceiverService extends Service { //当前绑定的视图订阅SID protected String bindViewSid; + private BroadcastReceiver mCallbackReceiver; + public void bindControlSid(String sid){ this.bindViewSid = sid; } + @Override + public void onCreate() { + super.onCreate(); + LogUtils.d(TAG_PARENT, "Service onCreate, 注册广播接收器"); + mCallbackReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (GpsSubscribeConst.ACTION_SUBSCRIBE_CALLBACK.equals(intent.getAction())) { + GpsSubscribeResult result = intent.getParcelableExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_RESULT); + if (result != null && bindViewSid != null + && bindViewSid.equals(result.getSubscribeUniqueId())) { + LocationPoint point = new LocationPoint( + result.getLatitude(), + result.getLongitude(), + result.getLocationTime() + ); + GpsSubscribeMsg config = SubscribeLocationManager.getInstance() + .getSubscribeConfig(bindViewSid); + LogUtils.d(TAG_PARENT, "收到GPS推送,转发至 onReceiveGpsData,SID:" + bindViewSid); + onReceiveGpsData(point, config); + } + } + } + }; + registerReceiver(mCallbackReceiver, new IntentFilter(GpsSubscribeConst.ACTION_SUBSCRIBE_CALLBACK)); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null && intent.hasExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_SID)) { + String sid = intent.getStringExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_SID); + bindControlSid(sid); + LogUtils.d(TAG_PARENT, "绑定SID:" + sid); + } + return START_NOT_STICKY; + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mCallbackReceiver != null) { + unregisterReceiver(mCallbackReceiver); + mCallbackReceiver = null; + LogUtils.d(TAG_PARENT, "广播接收器已注销"); + } + } + /** * 统一接收GPS推送入口 */ diff --git a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/view/GpsSubscribeControlView.java b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/view/GpsSubscribeControlView.java index f91903b..f5af975 100644 --- a/libgitsion/src/main/java/cc/winboll/studio/libgitsion/view/GpsSubscribeControlView.java +++ b/libgitsion/src/main/java/cc/winboll/studio/libgitsion/view/GpsSubscribeControlView.java @@ -139,9 +139,10 @@ public final class GpsSubscribeControlView extends LinearLayout { mLocationManager.putSubscribeConfig(currentSubscribeSid, subscribeMsg); mLocationManager.clearPushCount(currentSubscribeSid); - //开启订阅自动启动专属接收服务 + //开启订阅自动启动专属接收服务(携带SID) if(mBindReceiverServiceClazz != null){ Intent startServiceIntent = new Intent(getContext(), mBindReceiverServiceClazz); + startServiceIntent.putExtra(GpsSubscribeConst.EXTRA_SUBSCRIBE_SID, currentSubscribeSid); getContext().startService(startServiceIntent); } }