Android开发:利用AlarmManager不间断向服务器发送请求以及notification通知

一.前言

嗯,其实需求很简单,但是因为服务器不会主动联系客户端,所以客户端必须不间断的向服务器请求以便得到一些数据,突然不知道怎么描述这个问题了,总之,我是通过AlarmManager来实现客户端不断地向服务器发送请求,好吧,往下。

二.实现

客户端不断的发请求,然后通过获得的响应做一些处理就可以了,流程就简简单单的像下面这个图。

第一步:利用AlarmManager开启轮询服务

public class MyAlarmManager
{
 //开启轮询服务
    public static void startPollingService(Context context, int seconds, Class<?> cls,String carUserId) {
        //获取AlarmManager系统服务
        AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Log.e("startPollingService:","开启轮询服务");
        Intent intent = new Intent(context, cls);
        intent.putExtra("carUserId",carUserId);//添加需要传递的一些参数
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);//我是用的是service
        //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), seconds * 1000, pendingIntent);

    }

    //停止轮询服务
    public static void stopPollingService(Context context, Class<?> cls,String action) {
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //取消正在执行的服务
        manager.cancel(pendingIntent);
    }
}

第二步:Service/BroadcastReceiver/Activity完成相应的请求

我使用的是Service

/**
 *轮询服务
 *使用notification弹出消息
 */
public class QueryUnusualService extends Service {

    private Notification notification;
    private NotificationManager manager;
    private Handler handler;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what)
                {
                    case R.id.query_unusual_car_result:
                        List<Map<String,Object>> unusualCarList = (List<Map<String,Object>>)msg.getData().getSerializable("unusualCarList");
                        if(unusualCarList==null||unusualCarList.size()<1)
                            return;
                        showNotification(unusualCarList);
                        break;
                    default:
                        break;
                }
            }
        };
    }
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        //请求数据
        CarController.queryUnusualCar(intent.getStringExtra("carUserId"), handler);
    }
    //弹出Notification
    private void showNotification(List<Map<String,Object>> unusualCarList) {
        final Bitmap largeIcon = ((BitmapDrawable) getResources().getDrawable(R.drawable.stefan)).getBitmap();
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        PendingIntent pendingIntent3 = PendingIntent.getActivity(this, 0, new Intent().setAction("intvehapp.intvehapp.Activity.BaiDuMapActivity"), 0);
        notification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.head_image)
                .setLargeIcon(largeIcon)
                .setTicker("新消息!!")
                .setContentTitle("新消息!!!!")
                .setContentText("新消息~")
                .setContentIntent(pendingIntent3).setNumber(1).getNotification(); // 需要注意build()是在API
        // level16及之后增加的,API11可以使用getNotificatin()来替代
        notification.flags |= Notification.FLAG_AUTO_CANCEL; // FL
        manager.notify(1, notification);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service:onDestroy");
    }
}

大功告成

三.问题

大家在开发的过程中可能会发现一些问题,比如

1.不间断轮询失败

这里一定要注意 manager.setRepeating()的参数,特别是第一个参数和第二个参数相对应,即关于闹铃的类型问题:

//一共有五种闹铃类型:
    public static final int ELAPSED_REALTIME
    //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。
    public static final int ELAPSED_REALTIME_WAKEUP      //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002)
    ublic static final int RTC
    //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
    public static final int RTC_WAKEUP
    //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
    Public static final int POWER_OFF_WAKEUP
    //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。     

2.Notification不提示消息的问题

1).请设置icon

2).如果API是16请将getNotification()换成build()

时间: 2024-08-25 08:09:23

Android开发:利用AlarmManager不间断向服务器发送请求以及notification通知的相关文章

[Windows Phone 8开发]使用HttpWebRequest和HttpWebResponse向服务器发送Json数据(POST方法)

public string szJson = ""; byte[] json; UploadClass up = new UploadClass(); public ValidatePage() { InitializeComponent(); } private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { //我做了一个实现上传某些关键的Json数据,返回服务器Appid的功能,类似新浪微博

学习-【前端】-angularjs基本框架以及向服务器发送请求的方法

昨天写了个跨域的东西,自己琢磨了下,想到这种方式正好也是之前想的混合app如何交互服务器的解决办法.心里还是蛮开心的.今天又花时间把前端客户端部分的框架做了出来,整合的思路是参照node社区移动端的设计方案,把所有controllers和所有services放到一起,不过请求数据未用$resource也没有用原生的$http,而是使用了restangular,用完这个再把配置文件单独整合到一个文件夹里.整个框架看起来都十分的整洁了. 先给个结构图: 因为是由产品驱动的架构,所以最开始没有使用bo

在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 -

作为总公司IT部门,自然承担着各个分公司的运维技术支持工作,由于公司的性质,分公司经常负责维护这各家官老爷的服务器,同时这些服务器也作为和官老爷数据之间的连接......此处省略一万字. 今天分公司就有个负责人发过来一段服务器的报错信息,大致如下" FireF|y゛ 2016/5/23 15:36:19日志名称:          Application来源:            XXXXX 日期:            2016/5/23 11:47:30事件 ID:         0任务

向服务器发送请求

向服务器发送请求 1.向服务器发送请求 如需要将请求发送到服务器,我们使用XMLHttpRequest对象的open()和send()方法: xmlhttp.open("GET","test1.txt",true); xmlhttp.send(); 方法解释: (1)open(method,url,async): 规定请求的类型.URL以及是否异步处理请求: method:请求的类型,可以是GET或者POST: url:文件在服务器上的位置: async:true(

在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/36425825 SQL Server 2008 + VS2010 用C#编写的代码,进行数据库还原的时候,出错: 错误内容: 在向服务器发送请求时发生传输级错误. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程. 解决方法: 将SQL链接语句构造成如下: string strLink = @"server=.;database=Data

AJAX向服务器发送请求

原生的: 1.>:GET请求 $(function () { $("#btnGetDate").click(function () { //开始通过AJAX向服务器发送请求. var xhr; if (XMLHttpRequest) {//表示用户使用的高版本IE,谷歌,狐火等浏览器 xhr = new XMLHttpRequest(); } else {// 低IE xhr=new ActiveXObject("Microsoft.XMLHTTP"); }

【03】AJAX 向服务器发送请求

AJAX 向服务器发送请求 创建 XMLHttpRequest 对象后,就可以向服务器发送请求了. XMLHttpRequest 对象的 open() 方法和 send() 方法用来向服务器发送请求. 注意:AJAX 向服务器发送的是 http 请求,与我们浏览网页时发送的 http 请求一样.我们可以右键查看当前网页的源代码,由很多 HTML.CSS和JavaScript 组成,如果我们使用 AJAX 请求当前的 URL ,返回的内容是一样的.(魔芋:也就是说ajax发送的,和我们平时输入网址

在向服务器发送请求时发生传输级错误。

遇到的问题和原帖差不多,不过是另一种状况,提出来,希望能帮助其他的小伙伴,俺是菜鸟,有不对的地方请多多包涵. 问题状况:恢复数据库的时候,将数据库给脱机 而后联机.再点击其他功能页面的时候,报错提示:在向服务器发送请求时发生传输级错误. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程) 下面的解决方法,解决了问题. 在向服务器发送请求时发生传输级错误. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程) 开始一直以

ajax-向服务器发送请求

ajax-向服务器发送请求 1.将请求发送到服务器,使用XMLHttpRequest对象的 open() 和 send() 方法.     xmlhttp. open(method,url,async) 方法:     method:请求的类型:get 或者 post: url:文件在服务器上的位置(该文件可以是任何类型的文件,比如:.txt,.xml,.asp,.PHP): async: true(异步)或 false(同步)                  注:XMLHttpRequest