android前台服务需要解绑,Android接入
初始化
配置通道服務
必須在應用啟動時(Application的onCreate方法中)初始化通道服務配置,所有進程都需要執行。try {
// 參考腳手架demo從配置文件獲取
Map ipStrategy = new HashMap();
int env = Constants.RELEASE;
int pubkey = SpdyProtocol.PUBKEY_PSEQ_EMAS;
String appkey = "";
String appsecret =""
String accsHost = "";
String emasAccsTag = AccsClientConfig.DEFAULT_CONFIGTAG;
// initNetwork(mApplication, ipStrategy, accsHost, accsPort)
final AccsClientConfig clientConfig = new AccsClientConfig.Builder()
.setAppKey(appkey)
.setAppSecret(appsecret)
.setInappHost(emasHost)
.setInappPubKey(pubkey)
.setChannelHost(emasHost)
.setChannelPubKey(pubkey)
.setTag(emasAccsTag)
.setConfigEnv(env)
.build();
ACCSClient.init(mApplication, clientConfig);
} catch (AccsException e) {
ALog.w(TAG, "initDefaultAccsConfig", e);
}
appkey、appsecret、emasHost可以參考腳手架Demo工程如何獲取。
emasAccsTag一般情況下可以使用AccsClientConfig.DEFAULT_CONFIGTAG,也可以自定義,后續獲取accs實例時需要。
注意
如果emasHost即accs的服務地址帶有端口或者有定制IP邏輯,需要做一些特殊網絡設置。
特殊網絡設置
參考腳手架demo代碼,當accs服務地址為accs.server.com:port這種格式時,accsHost為accs.server.com,accsPort為port,需要特殊網絡設置。
如果配置的有定制的IP策略,也需要特殊網絡設置,在初始化通道服務配置之前調用,實現如下:private static void initNetwork(Context context, final Map ipStrategy, final String accsHost, final String accsPort) {
if ((ipStrategy == null || ipStrategy.isEmpty()) && TextUtils.isEmpty(accsPort)) {
return;
}
SessionCenter.init(context);
final IStrategyInstance instance = StrategyCenter.getInstance();
StrategyCenter.setInstance(new IStrategyInstance() {
private String mACCSDomainIp;
@Override
public void initialize(Context context) {
instance.initialize(context);
}
@Override
public void switchEnv() {
instance.switchEnv();
}
@Override
public void saveData() {
instance.saveData();
}
@Override
public String getFormalizeUrl(String rawUrlString) {
return instance.getFormalizeUrl(rawUrlString);
}
@Override
public List getConnStrategyListByHost(String host) {
List list = null;
if (ipStrategy != null && !ipStrategy.isEmpty()) {
String strategy = ipStrategy.get(host);
if (TextUtils.isEmpty(strategy)) {
return instance.getConnStrategyListByHost(host);
}
final String[] ipPort = strategy.split(":");
list = new ArrayList();
IConnStrategy connStrategy = new IConnStrategy() {
@Override
public String getIp() {
return ipPort[0];
}
@Override
public int getIpType() {
return 0;
}
@Override
public int getIpSource() {
return 0;
}
@Override
public int getPort() {
return Integer.parseInt(ipPort[1]);
}
@Override
public ConnProtocol getProtocol() {
return ConnProtocol.valueOf("http2", "0rtt", "emas", false);
}
@Override
public int getConnectionTimeout() {
return 10000;
}
@Override
public int getReadTimeout() {
return 10000;
}
@Override
public int getRetryTimes() {
return 1;
}
@Override
public int getHeartbeat() {
return 0;
}
};
list.add(connStrategy);
} else if (accsHost != null && accsHost.equals(host) && !TextUtils.isEmpty(accsPort)) {
if (TextUtils.isEmpty(mACCSDomainIp)) {
try {
InetAddress ip = InetAddress.getByName(accsHost);
mACCSDomainIp = ip.getHostAddress();
} catch (UnknownHostException e) {
}
}
list = new ArrayList();
IConnStrategy connStrategy = new IConnStrategy() {
@Override
public String getIp() {
return mACCSDomainIp;
}
@Override
public int getIpType() {
return 0;
}
@Override
public int getIpSource() {
return 0;
}
@Override
public int getPort() {
return Integer.parseInt(accsPort);
}
@Override
public ConnProtocol getProtocol() {
return ConnProtocol.valueOf("http2", "0rtt", "emas", false);
}
@Override
public int getConnectionTimeout() {
return 10000;
}
@Override
public int getReadTimeout() {
return 10000;
}
@Override
public int getRetryTimes() {
return 1;
}
@Override
public int getHeartbeat() {
return 0;
}
};
list.add(connStrategy);
} else {
return instance.getConnStrategyListByHost(host);
}
return list;
}
@Override
public String getSchemeByHost(String host) {
return instance.getSchemeByHost(host);
}
@Override
public String getSchemeByHost(String host, String dftScheme) {
return instance.getSchemeByHost(host, dftScheme);
}
@Override
public String getCNameByHost(String host) {
return instance.getCNameByHost(host);
}
@Override
public String getClientIp() {
return instance.getClientIp();
}
@Override
public void notifyConnEvent(String host, IConnStrategy connStrategy, ConnEvent connEvent) {
instance.notifyConnEvent(host, connStrategy, connEvent);
}
@Override
public String getUnitByHost(String s) {
return null;
}
@Override
public void forceRefreshStrategy(String host) {
instance.forceRefreshStrategy(host);
}
@Override
public void registerListener(IStrategyListener listener) {
instance.registerListener(listener);
}
@Override
public void unregisterListener(IStrategyListener listener) {
instance.unregisterListener(listener);
}
});
}
通道服務建立連接
初始化配置后,就可以建立連接了,這一步可以異步執行,避免造成主線程卡頓。//建議異步進行建立連接
new Thread() {
@Override
public void run() {
try {
ACCSClient.getAccsClient(AccsClientConfig.DEFAULT_CONFIGTAG).bindApp(mChannelID, mAppReceiver);
} catch (AccsException e) {
ALog.w(TAG, "initDefaultAccs", e);
}
}
}.start();
mChannelID為渠道ID,可以根據需要自己定義
mAppReceiver聲明如下:public final static String TEST_SERVICE_ID = "emas-test";
private final static Map SERVICES = new HashMap() {
private static final long serialVersionUID = 2527336442338823324L;
{
put(TEST_SERVICE_ID, "com.taobao.demo.accs.TestAccsService");
}
};
private IAppReceiver mAppReceiver = new IAppReceiver() {
private String TAG = "mAppReceiver";
@Override
public void onBindApp(int errorCode) {
ALog.i(TAG, "onBindApp", "errorCode", errorCode);
}
@Override
public void onUnbindApp(int errorCode) {
ALog.i(TAG, "onUnbindApp", "errorCode", errorCode);
}
@Override
public void onBindUser(String userId, int errorCode) {
ALog.i(TAG, "onBindUser", "errorCode", errorCode);
}
@Override
public void onUnbindUser(int errorCode) {
ALog.i(TAG, "onUnbindUser", "errorCode", errorCode);
}
@Override
public void onSendData(String dataId, int errorCode) {
ALog.i(TAG, "onSendData");
}
@Override
public void onData(String userId, String dataId, byte[] data) {
ALog.i(TAG, "onData");
}
@Override
public String getService(String serviceId) {
String service = SERVICES.get(serviceId);
return service;
}
@Override
public Map getAllServices() {
return SERVICES;
}
};
當連接建立成功之后,通過onBindApp回調通知業務方。
其中 TEST_SERVICE_ID 是為了示例定義的服務器端業務服務標識
com.taobao.demo.accs.TestAccsService 是客戶端接收此業務服務數據的本地服務,繼承自TaoBaseService,定義如下/**
* 第一個accs默認實例, 消息回調類
*/
public class TestAccsService extends TaoBaseService {
private static final String TAG = "TestAccsService";
/**
* bindService回調
*
* @param serviceId 服務ID
* @param errorCode 錯誤碼=200為成功,其他失敗
* @param extraInfo
*/
@Override
public void onBind(String serviceId, int errorCode, ExtraInfo extraInfo) {
ALog.d(TAG, "onBind", "serviceId", serviceId, "errorCode", errorCode);
}
/**
* unbindService回調
*
* @param serviceId 服務ID
* @param errorCode 錯誤碼=200為成功,其他失敗
* @param extraInfo
*/
@Override
public void onUnbind(String serviceId, int errorCode, ExtraInfo extraInfo) {
ALog.d(TAG, "onUnbind", "serviceId", serviceId, "errorCode", errorCode);
}
/**
* sendData回調
*
* @param serviceId 服務ID
* @param dataId 數據ID
* @param errorCode 錯誤碼=200為成功,其他失敗
* @param extraInfo
*/
@Override
public void onSendData(String serviceId, String dataId, int errorCode, ExtraInfo extraInfo) {
ALog.d(TAG, "onSendData", "serviceId", serviceId, "dataId", dataId, "errorCode", errorCode);
}
/**
* sendRequest回調
*
* @param serviceId 服務ID
* @param dataId 數據ID
* @param errorCode 錯誤碼=200為成功,其他失敗
* @param bytes
* @param extraInfo
*/
@Override
public void onResponse(String serviceId, String dataId, int errorCode, byte[] bytes, ExtraInfo extraInfo) {
}
/**
* 下行數據回調
*
* @param serviceId 服務ID
* @param userId 用戶ID
* @param dataId 數據ID
* @param bytes
* @param extraInfo
*/
@Override
public void onData(String serviceId, String userId, String dataId, byte[] bytes, ExtraInfo extraInfo) {
}
/**
* 連接成功狀態回調
*
* @param conninfo
*/
@Override
public void onConnected(ConnectInfo conninfo) {
ALog.d(TAG, "onConnected", "host", conninfo.host, "isInapp", conninfo.isInapp);
}
/**
* 連接失敗狀態回調
*
* @param conninfo
*/
@Override
public void onDisconnected(ConnectInfo conninfo) {
ALog.e(TAG, "onDisconnected", "host", conninfo.host, "isInapp", conninfo.isInapp,
"errorCode", conninfo.errorCode, "errorDetail", conninfo.errordetail);
}
}
記得在manifest進行聲明
總結
以上是生活随笔為你收集整理的android前台服务需要解绑,Android接入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android getevent参数,a
- 下一篇: 乐视1s 安装android6,乐视X5