如何在Android上实现定时使用闹钟进行HTTP请求推送?

Android用闹钟定时做HTTP请求推送的解决方案

如何在Android上实现定时使用闹钟进行HTTP请求推送?

一、引言

在Android应用开发中,有时需要实现类似推送消息的功能,但又无法或不想使用第三方推送服务如百度Push或友盟Push,在这种情况下,可以借助系统内置的闹钟服务(AlarmManager)和HTTP请求来定时获取服务器数据并通知用户,本文将详细介绍这个解决方案。

二、设计思路

1、创建一个后台服务(Service):此服务需运行在独立的进程中,以保证其长时间运行不被系统回收。

2、在服务内部设置闹钟(AlarmManager):设定特定间隔时间触发请求服务器的任务。

3、当闹钟触发时,启动Service:执行HTTP请求,检查服务器是否有新的push消息。

4、如果有新的消息,通过Notification向用户展示

三、具体实现

1. MoboPushAlarmManager

功能:管理闹钟,初始化、校准时间和取消闹钟。

代码示例

如何在Android上实现定时使用闹钟进行HTTP请求推送?

  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队列。

如何在Android上实现定时使用闹钟进行HTTP请求推送?

代码示例:无具体代码,但需实现HTTP请求逻辑。

6. 其他工具类

包括PushActionCreator、MoboPushMessage等,属于第三级或者第一第二级的工具类。

四、相关问题与解答栏目

1、如何优化电量和网络使用?

答案:可以通过设置合理的拉取间隔时间来平衡电量消耗和实时性需求,可以使用Wi-Fi环境下进行数据同步,减少移动网络的使用,还可以考虑使用JobScheduler来替代AlarmManager,以更好地管理后台任务。

2、如何处理可能的异常情况?

答案:在网络请求过程中可能会遇到各种异常情况,如网络中断、服务器无响应等,需要在代码中添加异常处理机制,确保即使出现异常也能正常重试或记录日志以便后续排查问题,对于重要操作可以考虑使用事务机制保证数据的一致性。

以上内容就是解答有关“android用闹钟定时做http请求推送的解决方案”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/633166.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-08 07:34
Next 2024-11-08 07:35

相关推荐

  • 造成美国服务器网络速度慢的原因有哪些呢

    美国服务器网络速度慢的原因有很多,比如被DDOS和CC这类的流量攻击,带宽被非法流量占用堵塞,其下载速度自然受到严重影响。另外如果服务器被病毒入侵,运行缓慢,处理下载请求的反应也会很慢,下载速度自然也会很慢。美国和中国距离较远,在数据传输中也会产生一定的延迟 。

    2024-01-03
    0124
  • 国外云主机租用要考虑哪几个方面问题

    在考虑租用国外云主机时,需要关注四个方面:合法性、安全性、可靠性和成本效益。确保所选择的云主机服务商合法且符合当地法律法规。要加强对数据的保护和备份,提高服务器的安全性。选择一家可靠的云服务商以保障业务流畅和数据安全也非常重要。根据实际需求选择适合的服务套餐,以实现成本效益的最大化。云主机的服务性能也是需要考虑的一个重要因素,特别是其弹性扩容的能力。

    2024-01-19
    0195
  • 外贸仿牌vps服务器租用有哪些优势

    在当前的网络环境中,许多企业和个人都选择使用VPS服务器来托管自己的网站和应用程序,对于一些外贸企业来说,他们可能会选择租用仿牌VPS服务器,外贸仿牌VPS服务器租用有哪些优势呢?A:外贸仿牌VPS服务器租用具有很高的灵活性和可扩展性,可以根据企业的实际需求随时增加或减少资源,3、Q:外贸仿牌VPS服务器租用的安全性如何?

    2023-12-22
    0118
  • 国内大型云服务器租用可以干什么

    国内大型云服务器租用可以用于搭建网站、办公系统、数据库应用、虚拟主机等多种场景 。如果您需要租用云服务器,可以考虑腾讯云或阿里云等大型云服务商 。

    2024-01-01
    0101
  • 服务器加了硬盘后怎么改分区格式

    服务器加了硬盘后怎么改分区在服务器运行过程中,随着业务的发展,可能需要增加硬盘以扩展存储空间,当服务器加了硬盘后,需要对新加的硬盘进行分区,以便更好地管理和使用硬盘空间,本文将详细介绍如何在服务器加了硬盘后进行分区操作。1、查看新加硬盘信息需要查看新加硬盘的信息,包括硬盘大小、分区情况等,可以通过以下命令查看:fdisk -l该命令会……

    2024-03-29
    0112
  • 网络管理服务器作用

    网络管理服务器是用于监控和管理网络设备与服务的关键系统,提供配置、故障处理、性能监控和安全管理等功能。

    2024-03-18
    0137

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入