Android-android客户端如何实现服务常驻

Android-android客户端如何实现服务常驻

夜无邪 发布于 2017-05-03 字数 308 浏览 1240 回复 3

对于如何实现android客户端上的服务常驻,一直比较困惑,比如微信、微博、米聊这些都是如何实现的呢?
另一个是,像GO桌面这样提供一个常驻内存的选项,这个又是如何实现的~~?
求科普~~~

发现了一个项目提供此功能:
http://code.google.com/p/android-random/downloads/list
但是稍显陈旧~~

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晚风撩人 2017-09-04 3 楼

求大神发一份mqtt android给我,我做的这个不是失去连接就是收不到信息,坚持不了多久,望指点,谢谢 happytianqiu@163.com

浮生未歇 2017-05-16 2 楼

常驻的服务一般通过“定时轮询自检”实现的,如通过检查硬件时间,间隔10s,向自身发送一个消息,通过接受这个消息来判断和启动。

AlarmManager mgr = (AlarmManager) this.getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),60*1000, pi);

不明白你指Go桌面常驻内存在那里,如果是卸载和安装,那是系统的消息,只是被他接听后处理而已。

归属感 2017-05-15 1 楼

android有自带的一个“心跳包”,不会自己去搜,
public class HearBeatFilter{
private final static Logger LOG = LoggerFactory
.getLogger(HearBeatFilter.class);
/** 秒发送一次心跳包 */
private static final int HEARTBEATRATE = 10;
/
心跳包内容 */
private static final String HEARTBEATREQUEST = "HBREQUEST";
private static final String HEARTBEATRESPONSE = "HBRESPONSE";
private KeepAliveFilter heartBeat;
public HearBeatFilter(){
KeepAliveMessageFactory heartBeatFactory = new KeepAliveMessageFactoryImpl();
KeepAliveRequestTimeoutHandler heartBeatHandler = new KeepAliveRequestTimeoutHandlerImpl();
heartBeat = new KeepAliveFilter(heartBeatFactory,
IdleStatus.BOTH_IDLE, heartBeatHandler);
/** 是否回发 */
heartBeat.setForwardEvent(true);
/** 发送频率 */
heartBeat.setRequestInterval(HEARTBEATRATE);
}
private static class KeepAliveMessageFactoryImpl implements
KeepAliveMessageFactory {

@Override
public Object getRequest(IoSession session) {
LOG.info("返回预设语句" + HEARTBEATREQUEST);
/** 返回预设语句 */
return HEARTBEATREQUEST;
}

@Override
public Object getResponse(IoSession session, Object request) {
LOG.info("得到返回");
return HEARTBEATRESPONSE;
}

@Override
public boolean isRequest(IoSession session, Object message) {

if(message.equals(HEARTBEATREQUEST)){
//LOG.info("请求心跳包: " + message);
return true;
}

return false;
}

@Override
public boolean isResponse(IoSession session, Object message) {

if(message.equals(HEARTBEATRESPONSE)){
//LOG.info("返回心跳包: " + message);
return true;

}
return false;
}

}
private static class KeepAliveRequestTimeoutHandlerImpl implements
KeepAliveRequestTimeoutHandler {

@Override
public void keepAliveRequestTimedOut(KeepAliveFilter filter,
IoSession session) throws Exception {
System.err.println("心跳超时");

}

}
public KeepAliveFilter getHeartBeat() {
return heartBeat;
}

}
常驻内存问题,不是很好,android一般内存不大,一直占有内存,容易阻塞,而且系统会自动释放资源,应该让服务在后台运行,来得到想要的信息