From 2cfb492b4b46856729434980240c16f1d5710966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9C=E6=96=B9=E5=A4=95=E9=98=B3?= Date: Thu, 30 Jul 2020 23:49:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0android=20sdk=20=E5=B8=B8?= =?UTF-8?q?=E9=A9=BB=E9=80=9A=E7=9F=A5=E6=A0=8F=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cim-client-sdk/.idea/cim-client-sdk.iml | 9 ++ cim-client-sdk/.idea/misc.xml | 6 ++ cim-client-sdk/.idea/modules.xml | 8 ++ cim-client-sdk/.idea/vcs.xml | 6 ++ cim-client-sdk/.idea/workspace.xml | 44 ++++++++++ .../cim/sdk/android/CIMPushManager.java | 18 ++++ .../cim/sdk/android/CIMPushService.java | 79 ++++++++++++++++-- .../app/libs/cim-android-sdk-3.8.0.jar | Bin 74189 -> 75491 bytes 8 files changed, 161 insertions(+), 9 deletions(-) create mode 100644 cim-client-sdk/.idea/cim-client-sdk.iml create mode 100644 cim-client-sdk/.idea/misc.xml create mode 100644 cim-client-sdk/.idea/modules.xml create mode 100644 cim-client-sdk/.idea/vcs.xml create mode 100644 cim-client-sdk/.idea/workspace.xml diff --git a/cim-client-sdk/.idea/cim-client-sdk.iml b/cim-client-sdk/.idea/cim-client-sdk.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/cim-client-sdk/.idea/cim-client-sdk.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/cim-client-sdk/.idea/misc.xml b/cim-client-sdk/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/cim-client-sdk/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/cim-client-sdk/.idea/modules.xml b/cim-client-sdk/.idea/modules.xml new file mode 100644 index 0000000..e563934 --- /dev/null +++ b/cim-client-sdk/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/cim-client-sdk/.idea/vcs.xml b/cim-client-sdk/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/cim-client-sdk/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/cim-client-sdk/.idea/workspace.xml b/cim-client-sdk/.idea/workspace.xml new file mode 100644 index 0000000..e4dba17 --- /dev/null +++ b/cim-client-sdk/.idea/workspace.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 1594434419483 + + + + + + \ No newline at end of file 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 7d80369..2efc722 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 @@ -52,6 +52,10 @@ public class CIMPushManager { 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 KEY_SEND_BODY = "KEY_SEND_BODY"; /** @@ -87,6 +91,20 @@ public class CIMPushManager { startService(context, serviceIntent); } + 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); + startService(context, serviceIntent); + } + + public static void cancelForeground(Context context) { + Intent serviceIntent = new Intent(context, CIMPushService.class); + serviceIntent.setAction(ACTION_HIDE_PERSIST_NOTIFICATION); + startService(context, serviceIntent); + } /** * 设置一个账号登录到服务端 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 2e2054e..0a71f36 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 @@ -36,6 +36,8 @@ import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.logger.CIMLogger; import com.farsunset.cim.sdk.android.model.SentBody; +import java.util.concurrent.atomic.AtomicBoolean; + /** * 与服务端连接服务 * @@ -45,13 +47,23 @@ public class CIMPushService extends Service { public final static String KEY_DELAYED_TIME = "KEY_DELAYED_TIME"; public final static String KEY_LOGGER_ENABLE = "KEY_LOGGER_ENABLE"; + public final static String KEY_NOTIFICATION_MESSAGE = "KEY_NOTIFICATION_MESSAGE"; + public final static String KEY_NOTIFICATION_CHANNEL = "KEY_NOTIFICATION_CHANNEL"; + public final static String KEY_NOTIFICATION_ICON = "KEY_NOTIFICATION_ICON"; + + private final static String TRANSIENT_NTC_CHANNEL_ID = "CIM_PUSH_TRANSIENT_NTC_ID"; + private final static String PERSIST_NTC_CHANNEL_ID = "CIM_PUSH_PERSIST_NTC_ID"; private final static int NOTIFICATION_ID = Integer.MAX_VALUE; + private final static int PERSIST_NOTIFICATION_ID = Integer.MIN_VALUE; + private CIMConnectorManager connectorManager; private KeepAliveBroadcastReceiver keepAliveReceiver; private ConnectivityManager connectivityManager; private NotificationManager notificationManager; + private final AtomicBoolean persistHolder = new AtomicBoolean(false); + @Override public void onCreate() { @@ -101,6 +113,9 @@ public class CIMPushService extends Service { private final Handler notificationHandler = new Handler() { @Override public void handleMessage(android.os.Message message) { + if (persistHolder.get()){ + return; + } stopForeground(true); } }; @@ -108,10 +123,12 @@ public class CIMPushService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { - createNotification(); - String action = intent == null ? CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE : intent.getAction(); + if (!persistHolder.get()) { + createNotification(); + } + if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) { this.prepareConnect(intent.getLongExtra(KEY_DELAYED_TIME, 0)); } @@ -138,8 +155,20 @@ public class CIMPushService extends Service { this.stopSelf(); } + 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)); + persistHolder.set(true); + } + + if (CIMPushManager.ACTION_HIDE_PERSIST_NOTIFICATION.equals(action)) { + stopForeground(true); + persistHolder.set(false); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - notificationHandler.sendEmptyMessageDelayed(0, 1000); + notificationHandler.sendEmptyMessageDelayed(0, 200); } return super.onStartCommand(intent,flags,startId); @@ -200,7 +229,9 @@ public class CIMPushService extends Service { connectHandler.removeMessages(0); - notificationHandler.removeMessages(0); + stopForeground(true); + + persistHolder.set(false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { unregisterReceiver(keepAliveReceiver); @@ -217,17 +248,15 @@ public class CIMPushService extends Service { return; } - String channelId = getClass().getName(); - - if (notificationManager.getNotificationChannel(channelId) == null) { - NotificationChannel channel = new NotificationChannel(channelId, getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW); + if (notificationManager.getNotificationChannel(TRANSIENT_NTC_CHANNEL_ID) == null) { + NotificationChannel channel = new NotificationChannel(TRANSIENT_NTC_CHANNEL_ID, getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW); channel.enableLights(false); channel.enableVibration(false); channel.setSound(null, null); notificationManager.createNotificationChannel(channel); } - Notification notification = new Notification.Builder(this,channelId) + Notification notification = new Notification.Builder(this,TRANSIENT_NTC_CHANNEL_ID) .setContentTitle(CIMPushService.class.getSimpleName()) .build(); @@ -235,6 +264,38 @@ public class CIMPushService extends Service { } + private void createPersistNotification(String channelName ,String message,int icon) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && notificationManager.getNotificationChannel(PERSIST_NTC_CHANNEL_ID) == null) { + NotificationChannel channel = new NotificationChannel(PERSIST_NTC_CHANNEL_ID,channelName, NotificationManager.IMPORTANCE_DEFAULT); + channel.enableLights(false); + channel.enableVibration(false); + channel.setSound(null, null); + notificationManager.createNotificationChannel(channel); + } + + + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setPackage(getPackageName()); + + Notification.Builder builder; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ + builder = new Notification.Builder(this,PERSIST_NTC_CHANNEL_ID); + }else { + builder = new Notification.Builder(this); + } + + builder.setAutoCancel(false) + .setOngoing(false) + .setSmallIcon(icon) + .setWhen(System.currentTimeMillis()) + .setContentIntent(PendingIntent.getActivity(this, 0, intent, 0)) + .setContentTitle(channelName) + .setContentText(message); + + startForeground(PERSIST_NOTIFICATION_ID, builder.build()); + } + private class KeepAliveBroadcastReceiver extends BroadcastReceiver { @Override diff --git a/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-3.8.0.jar b/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-3.8.0.jar index 91f1eacb4bd9ff718590c798b540077054c06a41..216bd86965e19e57c83c2ce5c62ad6d9f6e8f946 100644 GIT binary patch delta 13805 zcmaL8bwE_z^FO{zFWu7J-5nCr9Z~|)UD60F-6aT1iV_McB^}ZY0@5W7f^>t_Z&{w_ z`Mml5@w>8~!c?%s2T9~}s*KM*i9l;IIj0ryu&)9o7!I#7Glt%jNH3BdV{ zi1)K@Y;xuX6XqEzWwsOa6%6)xpL(Bq!2ikIGsA@c`40iwTDUlIKH_+D$_x)>OrZv{ z!&*%sH>?c@3d7nq;8R$O04EJ=72zadZ7kfge}3nLl%fGq&>k#B0YJej3E;PI?x~eP zf-D5gdpl}~B9q(T0Dx$u6krxz$`G+2xc05YUOeD?`LD+5~<|TEAKT)h18;;3| z!q)jF{-cp+kHEI!hZB#=tv$VPcUuzk@Qg1Xt^CeG^|IdMmrl~Z#Lc0npk3F~8&ZZdXAk6a11*!Gn1{?2ZOVj_xAZE4WX%;zyh z5XbJhu6^xjmB43jv`avp%XF8_

_YOZ!By=D${Q?Wu9ZD7jGn6Ap)AXw6+o6&%SG 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 xpDrvQXd3V@oP|H1xc|@Og#5+