From 7a9a3699605351c897e56bc484380bb692879b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9C=E6=96=B9=E5=A4=95=E9=98=B3?= Date: Sat, 27 Aug 2022 23:01:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9android12=E4=B8=AD=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=87=BA=E7=8E=B0ForegroundServiceStartNotAllowedExce?= =?UTF-8?q?ption=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../android/cim-android-sdk-4.2.0.jar | Bin 75669 -> 0 bytes cim-client-sdk/cim-android-sdk/pom.xml | 2 +- .../cim/sdk/android/CIMConnectorManager.java | 15 ++-- .../android/CIMEventBroadcastReceiver.java | 42 ++++----- .../cim/sdk/android/CIMPushManager.java | 55 +++++------- .../cim/sdk/android/CIMPushService.java | 60 ++++++------- .../android/coder/ClientMessageDecoder.java | 6 +- .../cim/sdk/android/constant/BundleKey.java | 38 ++++++++ .../cim/sdk/android/constant/CIMConstant.java | 83 +----------------- .../sdk/android/constant/IntentAction.java | 66 ++++++++++++++ .../sdk/android/constant/ProtobufType.java | 41 +++++++++ .../cim/sdk/android/constant/RequestKey.java | 32 +++++++ .../sdk/android/constant/ServiceAction.java | 44 ++++++++++ .../farsunset/cim/sdk/android/model/Pong.java | 4 +- .../cim/sdk/android/model/SentBody.java | 4 +- .../cim-client-android/app/build.gradle | 10 +-- .../farsunset/cim/activity/LoginActivity.java | 3 +- 18 files changed, 316 insertions(+), 191 deletions(-) delete mode 100644 cim-client-sdk-libs/android/cim-android-sdk-4.2.0.jar create mode 100644 cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/BundleKey.java create mode 100644 cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/IntentAction.java create mode 100644 cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ProtobufType.java create mode 100644 cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/RequestKey.java create mode 100644 cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ServiceAction.java diff --git a/README.md b/README.md index a6f3eb0..1fdebd1 100644 --- a/README.md +++ b/README.md @@ -189,5 +189,5 @@ https://www.yuque.com/yuanfangxiyang/ma4ytb/vvy3iz/edit#nnzKN android端sdk引用 ``` - implementation "com.farsunset:cim-android-sdk:4.2.0" + implementation "com.farsunset:cim-android-sdk:4.2.5" ``` \ No newline at end of file diff --git a/cim-client-sdk-libs/android/cim-android-sdk-4.2.0.jar b/cim-client-sdk-libs/android/cim-android-sdk-4.2.0.jar deleted file mode 100644 index 02273d2f84f27a169e2ee806e143341138f5fd86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75669 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

Z44Z8qcbWXM$-bH{lEh;_U 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.farsunset cim-android-sdk - 4.2.0 + 4.2.5 jar ${project.groupId}:${project.artifactId} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMConnectorManager.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMConnectorManager.java index 8bd4640..095f6b0 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMConnectorManager.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -27,6 +27,7 @@ import android.os.Handler; import com.farsunset.cim.sdk.android.coder.ClientMessageDecoder; import com.farsunset.cim.sdk.android.coder.ClientMessageEncoder; import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.IntentAction; import com.farsunset.cim.sdk.android.logger.CIMLogger; import com.farsunset.cim.sdk.android.model.*; @@ -95,7 +96,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FAILED); + intent.setAction(IntentAction.ACTION_CONNECT_FAILED); context.sendBroadcast(intent); return; @@ -205,7 +206,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FINISHED); + intent.setAction(IntentAction.ACTION_CONNECT_FINISHED); context.sendBroadcast(intent); } @@ -218,7 +219,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED); + intent.setAction(IntentAction.ACTION_CONNECTION_CLOSED); context.sendBroadcast(intent); } @@ -237,7 +238,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED); + intent.setAction(IntentAction.ACTION_MESSAGE_RECEIVED); intent.putExtra(Message.class.getName(), (Message) obj); context.sendBroadcast(intent); @@ -246,7 +247,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED); + intent.setAction(IntentAction.ACTION_REPLY_RECEIVED); intent.putExtra(ReplyBody.class.getName(), (ReplyBody) obj); context.sendBroadcast(intent); } @@ -260,7 +261,7 @@ class CIMConnectorManager { if (message instanceof SentBody) { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_SEND_FINISHED); + intent.setAction(IntentAction.ACTION_SEND_FINISHED); intent.putExtra(SentBody.class.getName(), (SentBody) message); context.sendBroadcast(intent); } @@ -288,7 +289,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setPackage(context.getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_CONNECT_FAILED); + intent.setAction(IntentAction.ACTION_CONNECT_FAILED); intent.putExtra("interval", interval); context.sendBroadcast(intent); diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java index 5945434..7ab04e8 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMEventBroadcastReceiver.java @@ -25,8 +25,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; -import android.os.Build; +import com.farsunset.cim.sdk.android.constant.BundleKey; import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.IntentAction; +import com.farsunset.cim.sdk.android.constant.ServiceAction; import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.cim.sdk.android.model.SentBody; @@ -38,7 +40,6 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { protected Context context; - @SuppressWarnings("deprecation") @Override public void onReceive(Context context, Intent intent) { @@ -50,6 +51,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { * 操作事件广播,用于提高service存活率 */ if (Intent.ACTION_USER_PRESENT.equals(action) + || Intent.ACTION_BOOT_COMPLETED.equals(action) || Intent.ACTION_POWER_CONNECTED.equals(action) || Intent.ACTION_POWER_DISCONNECTED.equals(action)) { startPushService(); @@ -58,7 +60,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { /* * 设备网络状态变化事件 */ - if (CIMConstant.IntentAction.ACTION_NETWORK_CHANGED.equals(action) + if (IntentAction.ACTION_NETWORK_CHANGED.equals(action) || ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { onDevicesNetworkChanged(); @@ -67,14 +69,14 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { /* * cim断开服务器事件 */ - if (CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED.equals(action)) { + if (IntentAction.ACTION_CONNECTION_CLOSED.equals(action)) { onInnerConnectionClosed(); } /* * cim连接服务器失败事件 */ - if (CIMConstant.IntentAction.ACTION_CONNECT_FAILED.equals(action)) { + if (IntentAction.ACTION_CONNECT_FAILED.equals(action)) { long interval = intent.getLongExtra("interval", CIMConstant.RECONNECT_INTERVAL_TIME); onInnerConnectFailed(interval); } @@ -82,21 +84,21 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { /* * cim连接服务器成功事件 */ - if (CIMConstant.IntentAction.ACTION_CONNECT_FINISHED.equals(action)) { + if (IntentAction.ACTION_CONNECT_FINISHED.equals(action)) { onInnerConnectFinished(); } /* * 收到推送消息事件 */ - if (CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED.equals(action)) { + if (IntentAction.ACTION_MESSAGE_RECEIVED.equals(action)) { onInnerMessageReceived((Message) intent.getSerializableExtra(Message.class.getName()), intent); } /* * 获取收到replyBody成功事件 */ - if (CIMConstant.IntentAction.ACTION_REPLY_RECEIVED.equals(action)) { + if (IntentAction.ACTION_REPLY_RECEIVED.equals(action)) { onReplyReceived((ReplyBody) intent.getSerializableExtra(ReplyBody.class.getName())); } @@ -104,27 +106,26 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { /* * 获取sendBody发送成功事件 */ - if (CIMConstant.IntentAction.ACTION_SEND_FINISHED.equals(action)) { + if (IntentAction.ACTION_SEND_FINISHED.equals(action)) { onSentSucceed((SentBody) intent.getSerializableExtra(SentBody.class.getName())); } /* * 重新连接,如果断开的话 */ - if (CIMConstant.IntentAction.ACTION_CONNECTION_RECOVERY.equals(action)) { + if (IntentAction.ACTION_CONNECTION_RECOVERY.equals(action)) { connect(0); } } private void startPushService() { - Intent intent = new Intent(context, CIMPushService.class); - intent.setAction(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent); - } else { - context.startService(intent); + try { + Intent intent = new Intent(context, CIMPushService.class); + intent.setAction(ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE); + CIMPushManager.startService(context,intent); + }catch (Exception ignore){ + context.sendBroadcast(new Intent(IntentAction.ACTION_CONNECTION_RECOVERY)); } } @@ -167,8 +168,8 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { private void connect(long delay) { Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMPushService.KEY_DELAYED_TIME, delay); - serviceIntent.setAction(CIMPushManager.ACTION_CREATE_CIM_CONNECTION); + serviceIntent.putExtra(BundleKey.KEY_DELAYED_TIME, delay); + serviceIntent.setAction(ServiceAction.ACTION_CREATE_CIM_CONNECTION); CIMPushManager.startService(context, serviceIntent); } @@ -181,12 +182,11 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver { } private boolean isForceOfflineMessage(String action) { - return CIMConstant.MessageAction.ACTION_999.equals(action); + return CIMConstant.ACTION_999.equals(action); } /** * 接收消息实现方法 - * * @param message * @param intent */ diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java index 130bc18..970478b 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -30,7 +30,9 @@ import android.net.NetworkInfo; import android.os.Build; import android.os.LocaleList; import android.text.TextUtils; -import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.BundleKey; +import com.farsunset.cim.sdk.android.constant.RequestKey; +import com.farsunset.cim.sdk.android.constant.ServiceAction; import com.farsunset.cim.sdk.android.logger.CIMLogger; import com.farsunset.cim.sdk.android.model.SentBody; @@ -43,24 +45,6 @@ import java.util.UUID; public class CIMPushManager { - protected static final String ACTION_CREATE_CIM_CONNECTION = "ACTION_CREATE_CIM_CONNECTION"; - - protected static final String ACTION_DESTROY_CIM_SERVICE = "ACTION_DESTROY_CIM_SERVICE"; - - protected static final String ACTION_ACTIVATE_PUSH_SERVICE = "ACTION_ACTIVATE_PUSH_SERVICE"; - - protected static final String ACTION_SEND_REQUEST_BODY = "ACTION_SEND_REQUEST_BODY"; - - protected static final String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION"; - - protected static final String ACTION_SET_LOGGER_EATABLE = "ACTION_SET_LOGGER_EATABLE"; - - protected static final String ACTION_SHOW_PERSIST_NOTIFICATION = "ACTION_SHOW_PERSIST_NOTIFICATION"; - - protected static final String ACTION_HIDE_PERSIST_NOTIFICATION = "ACTION_HIDE_PERSIST_NOTIFICATION"; - - protected static final String ACTION_CIM_CONNECTION_PONG = "ACTION_CIM_CONNECTION_PONG"; - /** * 初始化,连接服务端,在程序启动页或者 在Application里调用 * @param context @@ -82,7 +66,7 @@ public class CIMPushManager { Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); + serviceIntent.setAction(ServiceAction.ACTION_CREATE_CIM_CONNECTION); startService(context, serviceIntent); } @@ -94,8 +78,8 @@ public class CIMPushManager { */ public static void setLoggerEnable(Context context, boolean enable) { Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMPushService.KEY_LOGGER_ENABLE, enable); - serviceIntent.setAction(ACTION_SET_LOGGER_EATABLE); + serviceIntent.putExtra(BundleKey.KEY_LOGGER_ENABLE, enable); + serviceIntent.setAction(ServiceAction.ACTION_SET_LOGGER_EATABLE); startService(context, serviceIntent); } @@ -109,10 +93,10 @@ public class CIMPushManager { */ public static void startForeground(Context context,int icon, String channel , String message) { Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMPushService.KEY_NOTIFICATION_MESSAGE, message); - serviceIntent.putExtra(CIMPushService.KEY_NOTIFICATION_CHANNEL, channel); - serviceIntent.putExtra(CIMPushService.KEY_NOTIFICATION_ICON, icon); - serviceIntent.setAction(ACTION_SHOW_PERSIST_NOTIFICATION); + serviceIntent.putExtra(BundleKey.KEY_NOTIFICATION_MESSAGE, message); + serviceIntent.putExtra(BundleKey.KEY_NOTIFICATION_CHANNEL, channel); + serviceIntent.putExtra(BundleKey.KEY_NOTIFICATION_ICON, icon); + serviceIntent.setAction(ServiceAction.ACTION_SHOW_PERSIST_NOTIFICATION); startService(context, serviceIntent); } @@ -122,7 +106,7 @@ public class CIMPushManager { */ public static void cancelForeground(Context context) { Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_HIDE_PERSIST_NOTIFICATION); + serviceIntent.setAction(ServiceAction.ACTION_HIDE_PERSIST_NOTIFICATION); startService(context, serviceIntent); } @@ -159,7 +143,7 @@ public class CIMPushManager { public static void setTag(Context context, String tag) { SentBody sent = new SentBody(); - sent.setKey(CIMConstant.RequestKey.CLIENT_SET_TAG); + sent.setKey(RequestKey.CLIENT_SET_TAG); sent.put("tag", tag); sendRequest(context, sent); @@ -172,7 +156,7 @@ public class CIMPushManager { public static void removeTag(Context context) { SentBody sent = new SentBody(); - sent.setKey(CIMConstant.RequestKey.CLIENT_REMOVE_TAG); + sent.setKey(RequestKey.CLIENT_REMOVE_TAG); sendRequest(context, sent); } @@ -187,7 +171,7 @@ public class CIMPushManager { } Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_CIM_CONNECTION_PONG); + serviceIntent.setAction(ServiceAction.ACTION_CIM_CONNECTION_PONG); startService(context, serviceIntent); } @@ -199,7 +183,7 @@ public class CIMPushManager { CIMCacheManager.putString(context, CIMCacheManager.KEY_UID, uid); SentBody sent = new SentBody(); - sent.setKey(CIMConstant.RequestKey.CLIENT_BIND); + sent.setKey(RequestKey.CLIENT_BIND); sent.put("uid", String.valueOf(uid)); sent.put("channel", "android"); sent.put("deviceId", getDeviceId(context)); @@ -237,8 +221,8 @@ public class CIMPushManager { } Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.putExtra(CIMPushService.KEY_SEND_BODY, body); - serviceIntent.setAction(ACTION_SEND_REQUEST_BODY); + serviceIntent.putExtra(BundleKey.KEY_SEND_BODY, body); + serviceIntent.setAction(ServiceAction.ACTION_SEND_REQUEST_BODY); startService(context, serviceIntent); } @@ -255,7 +239,7 @@ public class CIMPushManager { CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_MANUAL_STOP, true); Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); + serviceIntent.setAction(ServiceAction.ACTION_CLOSE_CIM_CONNECTION); startService(context, serviceIntent); } @@ -269,7 +253,7 @@ public class CIMPushManager { CIMCacheManager.remove(context, CIMCacheManager.KEY_UID); Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_DESTROY_CIM_SERVICE); + serviceIntent.setAction(ServiceAction.ACTION_DESTROY_CIM_SERVICE); startService(context, serviceIntent); } @@ -337,6 +321,7 @@ public class CIMPushManager { } } + private static String getVersionName(Context context) { try { diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java index c71e937..565e63e 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/CIMPushService.java @@ -32,7 +32,9 @@ import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.util.Log; -import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.BundleKey; +import com.farsunset.cim.sdk.android.constant.IntentAction; +import com.farsunset.cim.sdk.android.constant.ServiceAction; import com.farsunset.cim.sdk.android.logger.CIMLogger; import com.farsunset.cim.sdk.android.model.Pong; import com.farsunset.cim.sdk.android.model.SentBody; @@ -46,13 +48,6 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class CIMPushService extends Service { - static final String KEY_SEND_BODY = "KEY_SEND_BODY"; - static final String KEY_DELAYED_TIME = "KEY_DELAYED_TIME"; - static final String KEY_LOGGER_ENABLE = "KEY_LOGGER_ENABLE"; - static final String KEY_NOTIFICATION_MESSAGE = "KEY_NOTIFICATION_MESSAGE"; - static final String KEY_NOTIFICATION_CHANNEL = "KEY_NOTIFICATION_CHANNEL"; - static final String KEY_NOTIFICATION_ICON = "KEY_NOTIFICATION_ICON"; - private static final String TRANSIENT_NTC_CHANNEL_ID = "CIM_PUSH_TRANSIENT_NTC_ID"; private static final String PERSIST_NTC_CHANNEL_ID = "CIM_PUSH_PERSIST_NTC_ID"; @@ -89,20 +84,13 @@ public class CIMPushService extends Service { private final ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { - Intent intent = new Intent(); - intent.setPackage(getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); - sendBroadcast(intent); + sendBroadcast(new Intent(IntentAction.ACTION_NETWORK_CHANGED)); } @Override public void onLost(Network network) { - Intent intent = new Intent(); - intent.setPackage(getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); - sendBroadcast(intent); + sendBroadcast(new Intent(IntentAction.ACTION_NETWORK_CHANGED)); } - }; private final Handler connectHandler = new Handler() { @@ -125,50 +113,52 @@ public class CIMPushService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { - String action = intent == null ? CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE : intent.getAction(); + Intent newIntent = intent == null ? new Intent(ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE) : intent; + + String action = newIntent.getAction(); if (!persistHolder.get()) { createNotification(); } - if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) { - this.prepareConnect(intent.getLongExtra(KEY_DELAYED_TIME, 0)); + if (ServiceAction.ACTION_CREATE_CIM_CONNECTION.equals(action)) { + this.prepareConnect(newIntent.getLongExtra(BundleKey.KEY_DELAYED_TIME, 0)); } - if (CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) { - connectorManager.send((SentBody) intent.getSerializableExtra(KEY_SEND_BODY)); + if (ServiceAction.ACTION_SEND_REQUEST_BODY.equals(action)) { + connectorManager.send((SentBody) newIntent.getSerializableExtra(BundleKey.KEY_SEND_BODY)); } - if (CIMPushManager.ACTION_CLOSE_CIM_CONNECTION.equals(action)) { + if (ServiceAction.ACTION_CLOSE_CIM_CONNECTION.equals(action)) { connectorManager.close(); } - if (CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action)) { + if (ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE.equals(action)) { handleKeepAlive(); } - if (CIMPushManager.ACTION_DESTROY_CIM_SERVICE.equals(action)) { + if (ServiceAction.ACTION_DESTROY_CIM_SERVICE.equals(action)) { connectorManager.close(); this.stopSelf(); } - if (CIMPushManager.ACTION_CIM_CONNECTION_PONG.equals(action)) { + if (ServiceAction.ACTION_CIM_CONNECTION_PONG.equals(action)) { connectorManager.send(Pong.getInstance()); } - if (CIMPushManager.ACTION_SET_LOGGER_EATABLE.equals(action)) { - boolean enable = intent.getBooleanExtra(KEY_LOGGER_ENABLE, true); + if (ServiceAction.ACTION_SET_LOGGER_EATABLE.equals(action)) { + boolean enable = newIntent.getBooleanExtra(BundleKey.KEY_LOGGER_ENABLE, true); CIMLogger.getLogger().debugMode(enable); } - if (CIMPushManager.ACTION_SHOW_PERSIST_NOTIFICATION.equals(action)) { - createPersistNotification(intent.getStringExtra(KEY_NOTIFICATION_CHANNEL), - intent.getStringExtra(KEY_NOTIFICATION_MESSAGE), - intent.getIntExtra(KEY_NOTIFICATION_ICON,0)); + if (ServiceAction.ACTION_SHOW_PERSIST_NOTIFICATION.equals(action)) { + createPersistNotification(newIntent.getStringExtra(BundleKey.KEY_NOTIFICATION_CHANNEL), + newIntent.getStringExtra(BundleKey.KEY_NOTIFICATION_MESSAGE), + newIntent.getIntExtra(BundleKey.KEY_NOTIFICATION_ICON,0)); persistHolder.set(true); } - if (CIMPushManager.ACTION_HIDE_PERSIST_NOTIFICATION.equals(action)) { + if (ServiceAction.ACTION_HIDE_PERSIST_NOTIFICATION.equals(action)) { stopForeground(true); persistHolder.set(false); } @@ -177,7 +167,7 @@ public class CIMPushService extends Service { notificationHandler.sendEmptyMessageDelayed(0, 200); } - return super.onStartCommand(intent,flags,startId); + return Service.START_REDELIVER_INTENT; } private void prepareConnect(long delayMillis) { @@ -319,6 +309,8 @@ public class CIMPushService extends Service { intentFilter.addAction(Intent.ACTION_POWER_CONNECTED); intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); intentFilter.addAction(Intent.ACTION_USER_PRESENT); + intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED); + intentFilter.addAction(IntentAction.ACTION_CONNECTION_RECOVERY); return intentFilter; } diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/coder/ClientMessageDecoder.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/coder/ClientMessageDecoder.java index feff18e..6eefd0d 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/coder/ClientMessageDecoder.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/coder/ClientMessageDecoder.java @@ -22,7 +22,7 @@ package com.farsunset.cim.sdk.android.coder; -import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.ProtobufType; import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.cim.sdk.android.model.Ping; import com.farsunset.cim.sdk.android.model.ReplyBody; @@ -72,11 +72,11 @@ public class ClientMessageDecoder { /* 消息读取完成后,通过type来解析成对应的消息体 */ - if (CIMConstant.ProtobufType.PING == type) { + if (ProtobufType.PING == type) { return Ping.getInstance(); } - if (CIMConstant.ProtobufType.REPLY_BODY == type) { + if (ProtobufType.REPLY_BODY == type) { ReplyBodyProto.Model bodyProto = ReplyBodyProto.Model.parseFrom(bodyBuffer.array()); ReplyBody body = new ReplyBody(); body.setKey(bodyProto.getKey()); diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/BundleKey.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/BundleKey.java new file mode 100644 index 0000000..6476c86 --- /dev/null +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/BundleKey.java @@ -0,0 +1,38 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android.constant; + +public interface BundleKey { + + String KEY_SEND_BODY = "KEY_SEND_BODY"; + + String KEY_DELAYED_TIME = "KEY_DELAYED_TIME"; + + String KEY_LOGGER_ENABLE = "KEY_LOGGER_ENABLE"; + + String KEY_NOTIFICATION_MESSAGE = "KEY_NOTIFICATION_MESSAGE"; + + String KEY_NOTIFICATION_CHANNEL = "KEY_NOTIFICATION_CHANNEL"; + + String KEY_NOTIFICATION_ICON = "KEY_NOTIFICATION_ICON"; + +} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/CIMConstant.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/CIMConstant.java index 00c7d98..582f1fe 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/CIMConstant.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/CIMConstant.java @@ -30,84 +30,9 @@ public interface CIMConstant { */ int DATA_HEADER_LENGTH = 3; - interface ProtobufType { - - /* - 客户端->服务端 发送的心跳响应 - */ - byte PONG = 0; - - /* - 服务端->客户端 发送的心跳请求 - */ - byte PING = 1; - - byte MESSAGE = 2; - - byte SENT_BODY = 3; - - byte REPLY_BODY = 4; - } - - interface RequestKey { - - String CLIENT_BIND = "client_bind"; - - String CLIENT_SET_TAG = "client_set_tag"; - - String CLIENT_REMOVE_TAG = "client_remove_tag"; - - } - - interface MessageAction { - - /* - 被其他设备登录挤下线消息 - */ - String ACTION_999 = "999"; - } - - interface IntentAction { - - /* - 消息广播action - */ - String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.MESSAGE_RECEIVED"; - - /* - 发送sendBody成功广播 - */ - String ACTION_SEND_FINISHED = "com.farsunset.cim.SEND_FINISHED"; - - /* - 链接意外关闭广播 - */ - String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED"; - - /* - 链接失败广播 - */ - String ACTION_CONNECT_FAILED = "com.farsunset.cim.CONNECT_FAILED"; - - /* - 链接成功广播 - */ - String ACTION_CONNECT_FINISHED = "com.farsunset.cim.CONNECT_FINISHED"; - - /* - 发送sendBody成功后获得replayBody回应广播 - */ - String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED"; - - /* - 网络变化广播 - */ - String ACTION_NETWORK_CHANGED = "com.farsunset.cim.NETWORK_CHANGED"; - - /* - 重试连接 - */ - String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; - } + /* + 被其他设备登录挤下线消息 + */ + String ACTION_999 = "999"; } diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/IntentAction.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/IntentAction.java new file mode 100644 index 0000000..b4604a2 --- /dev/null +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/IntentAction.java @@ -0,0 +1,66 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android.constant; + +public interface IntentAction { + + /* + 消息广播action + */ + String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.MESSAGE_RECEIVED"; + + /* + 发送sendBody成功广播 + */ + String ACTION_SEND_FINISHED = "com.farsunset.cim.SEND_FINISHED"; + + /* + 链接意外关闭广播 + */ + String ACTION_CONNECTION_CLOSED = "com.farsunset.cim.CONNECTION_CLOSED"; + + /* + 链接失败广播 + */ + String ACTION_CONNECT_FAILED = "com.farsunset.cim.CONNECT_FAILED"; + + /* + 链接成功广播 + */ + String ACTION_CONNECT_FINISHED = "com.farsunset.cim.CONNECT_FINISHED"; + + /* + 发送sendBody成功后获得replayBody回应广播 + */ + String ACTION_REPLY_RECEIVED = "com.farsunset.cim.REPLY_RECEIVED"; + + /* + 网络变化广播 + */ + String ACTION_NETWORK_CHANGED = "com.farsunset.cim.NETWORK_CHANGED"; + + /* + 重试连接 + */ + String ACTION_CONNECTION_RECOVERY = "com.farsunset.cim.CONNECTION_RECOVERY"; + +} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ProtobufType.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ProtobufType.java new file mode 100644 index 0000000..9ebed58 --- /dev/null +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ProtobufType.java @@ -0,0 +1,41 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android.constant; + +public interface ProtobufType { + + /* + 客户端->服务端 发送的心跳响应 + */ + byte PONG = 0; + + /* + 服务端->客户端 发送的心跳请求 + */ + byte PING = 1; + + byte MESSAGE = 2; + + byte SENT_BODY = 3; + + byte REPLY_BODY = 4; +} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/RequestKey.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/RequestKey.java new file mode 100644 index 0000000..a8b8e3d --- /dev/null +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/RequestKey.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android.constant; + +public interface RequestKey { + + String CLIENT_BIND = "client_bind"; + + String CLIENT_SET_TAG = "client_set_tag"; + + String CLIENT_REMOVE_TAG = "client_remove_tag"; + +} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ServiceAction.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ServiceAction.java new file mode 100644 index 0000000..73a5503 --- /dev/null +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/constant/ServiceAction.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2019 Xia Jun(3979434@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *************************************************************************************** + * * + * Website : http://www.farsunset.com * + * * + *************************************************************************************** + */ +package com.farsunset.cim.sdk.android.constant; + +public interface ServiceAction { + + String ACTION_CREATE_CIM_CONNECTION = "ACTION_CREATE_CIM_CONNECTION"; + + String ACTION_DESTROY_CIM_SERVICE = "ACTION_DESTROY_CIM_SERVICE"; + + String ACTION_ACTIVATE_PUSH_SERVICE = "ACTION_ACTIVATE_PUSH_SERVICE"; + + String ACTION_SEND_REQUEST_BODY = "ACTION_SEND_REQUEST_BODY"; + + String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION"; + + String ACTION_SET_LOGGER_EATABLE = "ACTION_SET_LOGGER_EATABLE"; + + String ACTION_SHOW_PERSIST_NOTIFICATION = "ACTION_SHOW_PERSIST_NOTIFICATION"; + + String ACTION_HIDE_PERSIST_NOTIFICATION = "ACTION_HIDE_PERSIST_NOTIFICATION"; + + String ACTION_CIM_CONNECTION_PONG = "ACTION_CIM_CONNECTION_PONG"; + +} diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/Pong.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/Pong.java index d5ae022..c7534cf 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/Pong.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/Pong.java @@ -21,7 +21,7 @@ */ package com.farsunset.cim.sdk.android.model; -import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.ProtobufType; import java.io.Serializable; @@ -56,7 +56,7 @@ public class Pong implements Serializable, BinaryBody { @Override public byte getType() { - return CIMConstant.ProtobufType.PONG; + return ProtobufType.PONG; } } diff --git a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/SentBody.java b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/SentBody.java index 65d724c..63ebc7d 100644 --- a/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/SentBody.java +++ b/cim-client-sdk/cim-android-sdk/src/main/java/com/farsunset/cim/sdk/android/model/SentBody.java @@ -21,7 +21,7 @@ */ package com.farsunset.cim.sdk.android.model; -import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.ProtobufType; import com.farsunset.cim.sdk.android.model.proto.SentBodyProto; import java.io.Serializable; @@ -108,7 +108,7 @@ public class SentBody implements Serializable, BinaryBody { @Override public byte getType() { - return CIMConstant.ProtobufType.SENT_BODY; + return ProtobufType.SENT_BODY; } } diff --git a/cim-use-examples/cim-client-android/app/build.gradle b/cim-use-examples/cim-client-android/app/build.gradle index 30523fe..9662cf6 100644 --- a/cim-use-examples/cim-client-android/app/build.gradle +++ b/cim-use-examples/cim-client-android/app/build.gradle @@ -34,11 +34,11 @@ android { } dependencies { - implementation "com.farsunset:cim-android-sdk:4.2.0" - implementation 'androidx.appcompat:appcompat:1.5.0' - implementation 'com.google.android.material:material:1.6.1' - implementation 'androidx.annotation:annotation:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation "com.farsunset:cim-android-sdk:4.2.5" + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.annotation:annotation:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'com.google.protobuf:protobuf-lite:3.0.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' diff --git a/cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/LoginActivity.java b/cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/LoginActivity.java index e47810a..8cec312 100644 --- a/cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/LoginActivity.java +++ b/cim-use-examples/cim-client-android/app/src/main/java/com/farsunset/cim/activity/LoginActivity.java @@ -19,6 +19,7 @@ import com.farsunset.cim.sdk.android.CIMEventListener; import com.farsunset.cim.sdk.android.CIMListenerManager; import com.farsunset.cim.sdk.android.CIMPushManager; import com.farsunset.cim.sdk.android.constant.CIMConstant; +import com.farsunset.cim.sdk.android.constant.RequestKey; import com.farsunset.cim.sdk.android.model.Message; import com.farsunset.cim.sdk.android.model.ReplyBody; import com.farsunset.cim.sdk.android.model.SentBody; @@ -96,7 +97,7 @@ public class LoginActivity extends AppCompatActivity implements CIMEventListener /* *第三步 用户id绑定成功,可以接收消息了 */ - if (replyBody.getKey().equals(CIMConstant.RequestKey.CLIENT_BIND)) { + if (replyBody.getKey().equals(RequestKey.CLIENT_BIND)) { ballsView.runaway(); Intent intent = new Intent(this,MessageActivity.class); intent.putExtra("uid",uidEdit.getText().toString().trim());