美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > 移动开发 >

Android长连接实现

2018-01-27 11:23|来源:未知 |作者:dnzg |点击:
本文中我们将讲解一下App的长连接实现。一般而言长连接已经是App的标配了,推送功能的实现基础就是长连接,当然了我们也可以通过轮训操作实现推送功能,但是轮训一般及时性比较差,而且网络消耗与电量销毁比较多,因此一般推送功能都是通过长连接实现的。
 
那么如何实现长连接呢?现在一般有这么几种实现方式:
 
使用第三方的长连接服务;
 
通过NIO等方案实现长连接服务;
 
通过MINA等第三方框架实现长连接;
 
1. 使用第三方的长连接服务
 
介绍:这是最简单的方式,我们可以通过接入极光推送,百度推送,友盟等第三方服务实现长连接,通过接入第三方的API我们可以很方便的接入第三方的长连接,推送服务,但是这种方式定制化程度不太好,如果对长连接服务不是要求特别高,对定制化要求不是很高的话基本可以考虑这种方式(目前主流的App都是使用第三方的长连接服务) 
优势:简单,方便 
劣势:定制化程度不高
 
2. 使用NIO等方案实现长连接服务
 
介绍:通过NIO的方式实现长连接,这种方式对技术要求程度比较高,基本都是通过java API实现长连接,实现心跳包,实现异常情况的容错等操作,可以说通过NIO实现长连接对技术要求很高,一般如果没有成行的技术方案比建议这么做,就算实现了长连接,后期连接的维护,对电量,流量的损耗等都需要持续的优化。 
优势:定制化比较高 
劣势:技术要求高,需要持续的维护
 
3. 使用MINA等第三方框架实现长连接
 
介绍:MINA是一个第三方的NIO框架,该框架实现了一整套的长连接机制,包括长连接的建立,心跳包的实现,异常机制的容错等。使用MINA实现长连接可以定制化的实现一些特有的功能,并且比NIO方案较为简单,因为其已经封装了一些长连接的特有机制,比如心跳包,容错等。 
优势:可定制,较NIO方法简单 
劣势:也需要一定的技术储备
 
 
 
长连接具体实现
 
在我们的Android客户端中长连接的实现机制采用–MINA方式。这里多说一句,一开始的长连接采用的是NIO方案,但是采用这种方案之后踩了很多坑,包括心跳,容错等机制都是自己写的,所以耗费了大量的时间,而且对手机电量的消耗很大,最后决定使用MINA NIO框架重新实现一遍长连接,后来经过实测,长连接的稳定性还有耗电量,流量的消耗等指标方面有了很大的提高。
 
下面我将简单的介绍一下通过NIO实现长连接的具体流程:
 
引入MINA jar包,在App启动页面,登录页面启动长连接;
 
创建后台服务,在服务中创建MINA长连接;
 
实现心跳包,重写一些容错机制;
 
实现长连接断了之后的重连机制,并且重连次数有限制不能一直重连;
 
长连接断了之后实现轮训操作,这里的轮训服务只有在长连接断了之后才启动,在长连接恢复之后关闭;
 
以下就是在长连接中实现的具体代码:
 
在Application的onCreate方法中检测App是否登录,若登录的话启动长连接
 
复制代码
/**
* 在Application的onCreate方法中执行启动长连接的操作
**/
@Override
public void onCreate() {
    ...
    // 登录后开启长连接
    if (UserConfig.isPassLogined()) {
        L.i("用户已登录,开启长连接...");
        startLongConn();
    }
    ...
}
复制代码
通过闹钟服务实现具体的启动长连接service的操作,即每隔60秒钟判断长连接是否启动,若未启动则实现启动操作
 
复制代码
/**
* 开始执行启动长连接服务
*/
public void startLongConn() {
    quitLongConn();
    L.i("长连接服务已开启");
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, LongConnService.class);
    intent.setAction(LongConnService.ACTION);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    long triggerAtTime = SystemClock.elapsedRealtime();
    manager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, 60 * 1000, pendingIntent);
}
复制代码
下面的代码就是长连接服务的具体实现
 
复制代码
 1 /**
 2  * 后台长连接服务
 3  **/
 4 public class LongConnService extends Service {
 5     public static String ACTION = "com.youyou.uuelectric.renter.Service.LongConnService";
 6     private static MinaLongConnectManager minaLongConnectManager;
 7     public String tag = "LongConnService";
 8     private Context context;
 9 
10     @Override
11     public int onStartCommand(Intent intent, int flags, int startId) {
12         context = getApplicationContext();
13         // 执行启动长连接的操作
14         startLongConnect();
15         ObserverManager.addObserver("LongConnService", stopListener);
16         return START_STICKY;
17     }
18 
19     public ObserverListener stopListener = new ObserverListener() {
(责任编辑:dnzg)