Android用闹钟定时做HTTP请求推送的解决方案
一、引言
在Android应用开发中,有时需要实现类似推送消息的功能,但又无法或不想使用第三方推送服务如百度Push或友盟Push,在这种情况下,可以借助系统内置的闹钟服务(AlarmManager)和HTTP请求来定时获取服务器数据并通知用户,本文将详细介绍这个解决方案。
二、设计思路
1、创建一个后台服务(Service):此服务需运行在独立的进程中,以保证其长时间运行不被系统回收。
2、在服务内部设置闹钟(AlarmManager):设定特定间隔时间触发请求服务器的任务。
3、当闹钟触发时,启动Service:执行HTTP请求,检查服务器是否有新的push消息。
4、如果有新的消息,通过Notification向用户展示。
三、具体实现
1. MoboPushAlarmManager
功能:管理闹钟,初始化、校准时间和取消闹钟。
代码示例:
public void initPullAlarm(Context context, boolean boot) { Bundle bundle = new Bundle(); bundle.putInt(START_SERVICE_TYPE, TYPE_REQUEST); PendingIntent pendingIntent = getPendingIntent(context, bundle, REQ_PULL); //循环时间 long repeat_time = HOUR_MILLIS * 2; Log.i(TAG, "repeat_time is " + repeat_time); // 计算下一次执行时间 long triggerAtMillis = boot ? 10000 : 0; Log.i(TAG, "initPullAlarm,and next pull time is after: " + triggerAtMillis); // 这个行为会覆盖之前的Alarm,主要根据PendingIntent来辨别不同的闹钟 getAlarmManager(context).setRepeating(AlarmManager.RTC, System.currentTimeMillis() + triggerAtMillis, repeat_time, pendingIntent); }
2. MobogeniePushServiceNew
功能:处理由闹钟触发的PendingIntent,启动Service执行任务。
代码示例:
@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); LogUtil.p("pushservice onStart"); if (intent == null) { LogUtil.d("mobopush", "intent == null)"); return; } // 解析打开service的意图 parsePushServiceIntent(intent); } private void parsePushServiceIntent(Intent intent) { Log.i(TAG, "parsePushServiceIntent"); if (intent == null) { return; } Bundle bundle = intent.getExtras(); if (bundle == null) { // 不明渠道调起service,默认处理为准备获取新消息,重设闹钟 PushAlarmManager.getInstance().initPullAlarm(this, false); return; } int type = bundle.getInt(PushAlarmManager.START_SERVICE_TYPE); if (type == PushAlarmManager.TYPE_STARTSERVICE) { //判断闹钟是否过期,如果过期则重设 } else if (type == PushAlarmManager.TYPE_REQUEST) { // 预设的网络请求 mREQ_RESULT = REQ_RESULT.ING; MoboPushRequest.getInstance().pullPushMessages(this, this, MoboPushRequest.REQUEST_NORMAL); } } //请求网络回调的数据处理 @Override public void onMessageLoaded(int actionCode, int requestCode, MessageResponse response) { //将网络请求回来的结果利用MessageSelector选择器,选择出有用的消息 getMessageSelector().assignMessageFromNet(MobogeniePushServiceNew.this, new MessageGetListener() { @Override public void showMessages(List msgs) { if (msgs.size() > 0) { for (MoboPushMessage msg : msgs) { notifyMessageAndDelete(msg, false); } } } @Override public void prepareMessages(List msgs) { if (msgs == null || msgs.size() == 0) { return; } MoboPushMessageDBUtils.insertBatch(MobogeniePushServiceNew.this, msgs); } }
3. MoboPushNotifyHelper
功能:创建并发送通知,取消通知。
代码示例:
public void notifyMessageAndDelete(final MoboPushMessage message, boolean isAtmeCount) { if (!isAtmeCount && !message.atmeCount) { return; } if (message.atmeCount != -1) { // 更新数据库中的未读数 message.unReadNum += message.atmeCount; MoboPushMessageDBUtils.updateUnreadNum(message); } notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.cancel(message.atmeCount); notificationManager.cancel(message.atmeId); Intent intent = new Intent(this, ChatActivity.class); intent.putExtra(Constant.EXTRA_CONTENT_ID, message.contentId); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 设置通知内容 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.ic_logo) .setContentTitle(message.fromName) .setContentText(message.content) .setWhen(message.createTime) .setAutoCancel(true) .setTicker("您有新的消息") .setContentIntent(pendingIntent); notificationManager.notify(message.atmeId, builder.build()); }
4. MoboMessageSelector
功能:从多个push中根据时间选择出可用的push。
代码示例:无具体代码,但需实现筛选逻辑。
5. MoboPushRequest
功能:请求服务器,从服务器列表中获取push队列。
代码示例:无具体代码,但需实现HTTP请求逻辑。
6. 其他工具类
包括PushActionCreator、MoboPushMessage等,属于第三级或者第一第二级的工具类。
四、相关问题与解答栏目
1、如何优化电量和网络使用?
答案:可以通过设置合理的拉取间隔时间来平衡电量消耗和实时性需求,可以使用Wi-Fi环境下进行数据同步,减少移动网络的使用,还可以考虑使用JobScheduler来替代AlarmManager,以更好地管理后台任务。
2、如何处理可能的异常情况?
答案:在网络请求过程中可能会遇到各种异常情况,如网络中断、服务器无响应等,需要在代码中添加异常处理机制,确保即使出现异常也能正常重试或记录日志以便后续排查问题,对于重要操作可以考虑使用事务机制保证数据的一致性。
以上内容就是解答有关“android用闹钟定时做http请求推送的解决方案”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/633166.html