重构android SDK代码

This commit is contained in:
远方夕阳 2019-07-10 17:46:08 +08:00
parent edd5670b45
commit 2978e13c3c
5 changed files with 92 additions and 100 deletions

View File

@ -69,7 +69,6 @@ class CIMCacheManager {
Cursor cursor = resolver.query(Uri.parse(String.format(CONTENT_URI,context.getPackageName())), new String[] { key }, null, null, null); Cursor cursor = resolver.query(Uri.parse(String.format(CONTENT_URI,context.getPackageName())), new String[] { key }, null, null, null);
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
value = cursor.getString(0); value = cursor.getString(0);
cursor.close();
} }
closeQuietly(cursor); closeQuietly(cursor);
return value; return value;

View File

@ -111,7 +111,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
* 重新连接如果断开的话 * 重新连接如果断开的话
*/ */
if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_RECOVERY)) { if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_CONNECTION_RECOVERY)) {
CIMPushManager.connect(context, 0); connect(0);
} }
} }
@ -132,7 +132,7 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false); CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
if (CIMPushManager.isNetworkConnected(context)) { if (CIMPushManager.isNetworkConnected(context)) {
CIMPushManager.connect(context, 0); connect(0);
} }
onConnectionClosed(); onConnectionClosed();
@ -141,9 +141,10 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
private void onConnectionFailed(long reinterval) { private void onConnectionFailed(long reinterval) {
if (CIMPushManager.isNetworkConnected(context)) { if (CIMPushManager.isNetworkConnected(context)) {
onConnectionFailed(); onConnectionFailed();
CIMPushManager.connect(context, reinterval); connect(reinterval);
} }
} }
@ -157,11 +158,18 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
private void onDevicesNetworkChanged() { private void onDevicesNetworkChanged() {
if (CIMPushManager.isNetworkConnected(context)) { if (CIMPushManager.isNetworkConnected(context)) {
CIMPushManager.connect(context, 0); connect(0);
} }
onNetworkChanged(); onNetworkChanged();
} }
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);
CIMPushManager.startService(context,serviceIntent);
}
private void onInnerMessageReceived(com.farsunset.cim.sdk.android.model.Message message, Intent intent) { private void onInnerMessageReceived(com.farsunset.cim.sdk.android.model.Message message, Intent intent) {
if (isForceOfflineMessage(message.getAction())) { if (isForceOfflineMessage(message.getAction())) {

View File

@ -41,19 +41,19 @@ import com.farsunset.cim.sdk.android.model.SentBody;
*/ */
public class CIMPushManager { public class CIMPushManager {
static String ACTION_ACTIVATE_PUSH_SERVICE = "ACTION_ACTIVATE_PUSH_SERVICE"; protected static String ACTION_ACTIVATE_PUSH_SERVICE = "ACTION_ACTIVATE_PUSH_SERVICE";
static String ACTION_CREATE_CIM_CONNECTION = "ACTION_CREATE_CIM_CONNECTION"; protected static String ACTION_CREATE_CIM_CONNECTION = "ACTION_CREATE_CIM_CONNECTION";
static String ACTION_SEND_REQUEST_BODY = "ACTION_SEND_REQUEST_BODY"; protected static String ACTION_SEND_REQUEST_BODY = "ACTION_SEND_REQUEST_BODY";
static String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION"; protected static String ACTION_CLOSE_CIM_CONNECTION = "ACTION_CLOSE_CIM_CONNECTION";
static String ACTION_SET_LOGGER_EANABLE = "ACTION_SET_LOGGER_EANABLE"; protected static String ACTION_SET_LOGGER_EANABLE = "ACTION_SET_LOGGER_EANABLE";
static String KEY_SEND_BODY = "KEY_SEND_BODY"; protected static String KEY_SEND_BODY = "KEY_SEND_BODY";
static String KEY_CIM_CONNECTION_STATUS = "KEY_CIM_CONNECTION_STATUS"; protected static String KEY_CIM_CONNECTION_STATUS = "KEY_CIM_CONNECTION_STATUS";
/** /**
* 初始化,连接服务端在程序启动页或者 在Application里调用 * 初始化,连接服务端在程序启动页或者 在Application里调用
@ -64,57 +64,34 @@ public class CIMPushManager {
*/ */
public static void connect(Context context, String host, int port) { public static void connect(Context context, String host, int port) {
connect(context, host, port, false, 0);
}
private static void connect(Context context, String host, int port, boolean autoBind, long delayedTime) {
if(TextUtils.isEmpty(host) || port == 0) { if(TextUtils.isEmpty(host) || port == 0) {
CIMLogger.getLogger().invalidHostPort(host, port); CIMLogger.getLogger().invalidHostPort(host, port);
return; return;
} }
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED, false);
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_MANUAL_STOP, false);
CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST, host); CIMCacheManager.putString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST, host);
CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT, port); CIMCacheManager.putInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT, port);
if (!autoBind) { CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED, false);
CIMCacheManager.remove(context, CIMCacheManager.KEY_ACCOUNT); CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_MANUAL_STOP, false);
}
CIMCacheManager.remove(context, CIMCacheManager.KEY_ACCOUNT);
Intent serviceIntent = new Intent(context, CIMPushService.class); Intent serviceIntent = new Intent(context, CIMPushService.class);
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST, host);
serviceIntent.putExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, port);
serviceIntent.putExtra(CIMPushService.KEY_DELAYED_TIME, delayedTime);
serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION); serviceIntent.setAction(ACTION_CREATE_CIM_CONNECTION);
startServiceCompat(context,serviceIntent); startService(context,serviceIntent);
} }
public static void setLoggerEnable(Context context,boolean enable) { public static void setLoggerEnable(Context context,boolean enable) {
Intent serviceIntent = new Intent(context, CIMPushService.class); Intent serviceIntent = new Intent(context, CIMPushService.class);
serviceIntent.putExtra(CIMPushService.KEY_LOGGER_ENABLE, enable); serviceIntent.putExtra(CIMPushService.KEY_LOGGER_ENABLE, enable);
serviceIntent.setAction(ACTION_SET_LOGGER_EANABLE); serviceIntent.setAction(ACTION_SET_LOGGER_EANABLE);
startServiceCompat(context,serviceIntent); startService(context,serviceIntent);
} }
protected static void connect(Context context, long delayedTime) {
boolean isManualStop = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_MANUAL_STOP);
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualStop || isManualDestory) {
return;
}
String host = CIMCacheManager.getString(context, CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInt(context, CIMCacheManager.KEY_CIM_SERVIER_PORT);
connect(context, host, port, true, delayedTime);
}
/** /**
* 设置一个账号登录到服务端 * 设置一个账号登录到服务端
@ -124,8 +101,7 @@ public class CIMPushManager {
*/ */
public static void bindAccount(Context context, String account) { public static void bindAccount(Context context, String account) {
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED); if (isDestoryed(context) || account == null || account.trim().length() == 0) {
if (isManualDestory || account == null || account.trim().length() == 0) {
return; return;
} }
@ -159,8 +135,7 @@ public class CIMPushManager {
protected static boolean autoBindAccount(Context context) { protected static boolean autoBindAccount(Context context) {
String account = CIMCacheManager.getString(context, CIMCacheManager.KEY_ACCOUNT); String account = CIMCacheManager.getString(context, CIMCacheManager.KEY_ACCOUNT);
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED); if (account == null || account.trim().length() == 0 || isDestoryed(context)) {
if (account == null || account.trim().length() == 0 || isManualDestory) {
return false; return false;
} }
@ -177,17 +152,14 @@ public class CIMPushManager {
*/ */
public static void sendRequest(Context context, SentBody body) { public static void sendRequest(Context context, SentBody body) {
boolean isManualStop = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_MANUAL_STOP); if (isDestoryed(context) || isStoped(context)) {
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED);
if (isManualStop || isManualDestory) {
return; return;
} }
Intent serviceIntent = new Intent(context, CIMPushService.class); Intent serviceIntent = new Intent(context, CIMPushService.class);
serviceIntent.putExtra(KEY_SEND_BODY, body); serviceIntent.putExtra(KEY_SEND_BODY, body);
serviceIntent.setAction(ACTION_SEND_REQUEST_BODY); serviceIntent.setAction(ACTION_SEND_REQUEST_BODY);
startServiceCompat(context,serviceIntent); startService(context,serviceIntent);
} }
@ -198,8 +170,7 @@ public class CIMPushManager {
*/ */
public static void stop(Context context) { public static void stop(Context context) {
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED); if (isDestoryed(context)) {
if (isManualDestory) {
return; return;
} }
@ -207,7 +178,7 @@ public class CIMPushManager {
Intent serviceIntent = new Intent(context, CIMPushService.class); Intent serviceIntent = new Intent(context, CIMPushService.class);
serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION); serviceIntent.setAction(ACTION_CLOSE_CIM_CONNECTION);
startServiceCompat(context,serviceIntent); startService(context,serviceIntent);
} }
@ -232,14 +203,21 @@ public class CIMPushManager {
*/ */
public static void resume(Context context) { public static void resume(Context context) {
boolean isManualDestory = CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED); if (isDestoryed(context)) {
if (isManualDestory) {
return; return;
} }
autoBindAccount(context); autoBindAccount(context);
} }
public static boolean isDestoryed(Context context) {
return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED);
}
public static boolean isStoped(Context context) {
return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_MANUAL_STOP);
}
public static boolean isConnected(Context context) { public static boolean isConnected(Context context) {
return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE); return CIMCacheManager.getBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE);
} }
@ -253,6 +231,17 @@ public class CIMPushManager {
return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
} }
public static void startService(Context context,Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
}
private static String getVersionName(Context context) { private static String getVersionName(Context context) {
String versionName = null; String versionName = null;
try { try {
@ -263,14 +252,6 @@ public class CIMPushManager {
return versionName; return versionName;
} }
private static void startServiceCompat(Context context,Intent intent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
}
} }

View File

@ -34,7 +34,6 @@ import android.net.Network;
import android.os.Build; import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Message;
import com.farsunset.cim.sdk.android.coder.CIMLogger; import com.farsunset.cim.sdk.android.coder.CIMLogger;
import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.constant.CIMConstant;
@ -50,6 +49,8 @@ public class CIMPushService extends Service {
public final static String KEY_DELAYED_TIME = "KEY_DELAYED_TIME"; 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_LOGGER_ENABLE = "KEY_LOGGER_ENABLE";
private final static int NOTIFICATION_ID = Integer.MAX_VALUE;
private CIMConnectorManager manager; private CIMConnectorManager manager;
private KeepAliveBroadcastReceiver keepAliveReceiver; private KeepAliveBroadcastReceiver keepAliveReceiver;
private ConnectivityManager connectivityManager; private ConnectivityManager connectivityManager;
@ -90,15 +91,19 @@ public class CIMPushService extends Service {
}; };
Handler connectionHandler = new Handler() { Handler connectHandler = new Handler() {
@Override @Override
public void handleMessage(android.os.Message message) { public void handleMessage(android.os.Message message) {
String host = message.getData().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST); connect();
int port = message.getData().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT, 0);
handleConnection(host, port);
} }
}; };
Handler notificationHandler = new Handler() {
@Override
public void handleMessage(android.os.Message message) {
stopForeground(true);
}
};
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
@ -107,9 +112,13 @@ public class CIMPushService extends Service {
NotificationChannel channel = new NotificationChannel(getClass().getSimpleName(),getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW); NotificationChannel channel = new NotificationChannel(getClass().getSimpleName(),getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW);
channel.enableLights(false); channel.enableLights(false);
channel.enableVibration(false); channel.enableVibration(false);
channel.setSound(null, null);
notificationManager.createNotificationChannel(channel); notificationManager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(this, channel.getId()).build(); Notification notification = new Notification.Builder(this, channel.getId())
startForeground(this.hashCode(),notification); .setContentTitle("Push service")
.setContentText("Push service is running")
.build();
startForeground(NOTIFICATION_ID,notification);
} }
intent = (intent == null ? new Intent(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE) : intent); intent = (intent == null ? new Intent(CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE) : intent);
@ -117,7 +126,7 @@ public class CIMPushService extends Service {
String action = intent.getAction(); String action = intent.getAction();
if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) { if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) {
handleDelayConnection(intent); connect(intent.getLongExtra(KEY_DELAYED_TIME, 0));
} }
if (CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) { if (CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) {
@ -138,42 +147,36 @@ public class CIMPushService extends Service {
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
stopForeground(true); notificationHandler.sendEmptyMessageDelayed(0, 1000);
} }
return super.onStartCommand(intent, flags, startId); return super.onStartCommand(intent, flags, startId);
} }
private void handleDelayConnection(Intent intent) { private void connect(long delayMillis) {
long delayMillis = intent.getLongExtra(KEY_DELAYED_TIME, 0); if(delayMillis <= 0) {
connect();
if (delayMillis <= 0) {
String host = intent.getStringExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = intent.getIntExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, 0);
handleConnection(host, port);
return; return;
} }
connectHandler.sendEmptyMessageDelayed(0, delayMillis);
Message msg = connectionHandler.obtainMessage();
msg.what = 0;
msg.setData(intent.getExtras());
connectionHandler.removeMessages(0);
connectionHandler.sendMessageDelayed(msg, delayMillis);
} }
private void handleConnection(String host,int port) { private void connect() {
boolean isManualStop = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_MANUAL_STOP); if(CIMPushManager.isDestoryed(this) || CIMPushManager.isStoped(this)) {
boolean isDestroyed = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_CIM_DESTROYED);
if(isManualStop || isDestroyed) {
return; return;
} }
manager.connect(host, port);
} String host = CIMCacheManager.getString(this, CIMCacheManager.KEY_CIM_SERVIER_HOST);
int port = CIMCacheManager.getInt(this, CIMCacheManager.KEY_CIM_SERVIER_PORT);
manager.connect(host, port);
}
private void handleKeepAlive() { private void handleKeepAlive() {
if (manager.isConnected()) { if (manager.isConnected()) {
@ -181,10 +184,8 @@ public class CIMPushService extends Service {
return; return;
} }
String host = CIMCacheManager.getString(this, CIMCacheManager.KEY_CIM_SERVIER_HOST); connect();
int port = CIMCacheManager.getInt(this, CIMCacheManager.KEY_CIM_SERVIER_PORT);
handleConnection(host,port);
} }
@Override @Override
@ -196,9 +197,12 @@ public class CIMPushService extends Service {
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
manager.destroy(); manager.destroy();
connectionHandler.removeMessages(0); connectHandler.removeMessages(0);
notificationHandler.removeMessages(0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
unregisterReceiver(keepAliveReceiver); unregisterReceiver(keepAliveReceiver);
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {