日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android前台服务需要解绑,Android接入

發(fā)布時(shí)間:2025/3/20 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android前台服务需要解绑,Android接入 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

初始化

配置通道服務(wù)

必須在應(yīng)用啟動(dòng)時(shí)(Application的onCreate方法中)初始化通道服務(wù)配置,所有進(jìn)程都需要執(zhí)行。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,也可以自定義,后續(xù)獲取accs實(shí)例時(shí)需要。

注意

如果emasHost即accs的服務(wù)地址帶有端口或者有定制IP邏輯,需要做一些特殊網(wǎng)絡(luò)設(shè)置。

特殊網(wǎng)絡(luò)設(shè)置

參考腳手架demo代碼,當(dāng)accs服務(wù)地址為accs.server.com:port這種格式時(shí),accsHost為accs.server.com,accsPort為port,需要特殊網(wǎng)絡(luò)設(shè)置。

如果配置的有定制的IP策略,也需要特殊網(wǎng)絡(luò)設(shè)置,在初始化通道服務(wù)配置之前調(diào)用,實(shí)現(xiàn)如下: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);

}

});

}

通道服務(wù)建立連接

初始化配置后,就可以建立連接了,這一步可以異步執(zhí)行,避免造成主線程卡頓。//建議異步進(jìn)行建立連接

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,可以根據(jù)需要自己定義

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;

}

};

當(dāng)連接建立成功之后,通過(guò)onBindApp回調(diào)通知業(yè)務(wù)方。

其中 TEST_SERVICE_ID 是為了示例定義的服務(wù)器端業(yè)務(wù)服務(wù)標(biāo)識(shí)

com.taobao.demo.accs.TestAccsService 是客戶端接收此業(yè)務(wù)服務(wù)數(shù)據(jù)的本地服務(wù),繼承自TaoBaseService,定義如下/**

* 第一個(gè)accs默認(rèn)實(shí)例, 消息回調(diào)類(lèi)

*/

public class TestAccsService extends TaoBaseService {

private static final String TAG = "TestAccsService";

/**

* bindService回調(diào)

*

* @param serviceId 服務(wù)ID

* @param errorCode 錯(cuò)誤碼=200為成功,其他失敗

* @param extraInfo

*/

@Override

public void onBind(String serviceId, int errorCode, ExtraInfo extraInfo) {

ALog.d(TAG, "onBind", "serviceId", serviceId, "errorCode", errorCode);

}

/**

* unbindService回調(diào)

*

* @param serviceId 服務(wù)ID

* @param errorCode 錯(cuò)誤碼=200為成功,其他失敗

* @param extraInfo

*/

@Override

public void onUnbind(String serviceId, int errorCode, ExtraInfo extraInfo) {

ALog.d(TAG, "onUnbind", "serviceId", serviceId, "errorCode", errorCode);

}

/**

* sendData回調(diào)

*

* @param serviceId 服務(wù)ID

* @param dataId 數(shù)據(jù)ID

* @param errorCode 錯(cuò)誤碼=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回調(diào)

*

* @param serviceId 服務(wù)ID

* @param dataId 數(shù)據(jù)ID

* @param errorCode 錯(cuò)誤碼=200為成功,其他失敗

* @param bytes

* @param extraInfo

*/

@Override

public void onResponse(String serviceId, String dataId, int errorCode, byte[] bytes, ExtraInfo extraInfo) {

}

/**

* 下行數(shù)據(jù)回調(diào)

*

* @param serviceId 服務(wù)ID

* @param userId 用戶ID

* @param dataId 數(shù)據(jù)ID

* @param bytes

* @param extraInfo

*/

@Override

public void onData(String serviceId, String userId, String dataId, byte[] bytes, ExtraInfo extraInfo) {

}

/**

* 連接成功狀態(tài)回調(diào)

*

* @param conninfo

*/

@Override

public void onConnected(ConnectInfo conninfo) {

ALog.d(TAG, "onConnected", "host", conninfo.host, "isInapp", conninfo.isInapp);

}

/**

* 連接失敗狀態(tài)回調(diào)

*

* @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進(jìn)行聲明

總結(jié)

以上是生活随笔為你收集整理的android前台服务需要解绑,Android接入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。