使用AlarmManager定期执行工作

新建一个Service来模拟后台执行的程序,PollingService.java:

package com.ryantang.rtpollingdemo;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
/**
 * Polling service
 * @Author Ryan
 * @Create 2013-7-13 涓婂崍10:18:44
 */
public class PollingService extends Service {

    public static final String ACTION = "com.ryantang.service.PollingService";

    private Notification mNotification;
    private NotificationManager mManager;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        initNotifiManager();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        new PollingThread().start();
    }
    //初始化通知栏配置
    private void initNotifiManager() {
        mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        int icon = R.drawable.ic_launcher;
        mNotification = new Notification();
        mNotification.icon = icon;
        mNotification.tickerText = "New Message";
        mNotification.defaults |= Notification.DEFAULT_SOUND;
        mNotification.flags = Notification.FLAG_AUTO_CANCEL;
    }
    //弹出Notification
    private void showNotification() {
        mNotification.when = System.currentTimeMillis();
        //Navigator to the new activity when click the notification title
        Intent i = new Intent(this, MessageActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i,
                Intent.FLAG_ACTIVITY_NEW_TASK);
        mNotification.setLatestEventInfo(this,
                getResources().getString(R.string.app_name), "You have new message!", pendingIntent);
        mManager.notify(0, mNotification);
    }

    /**
     * Polling thread
     * 模拟向Server轮询的异步线程
     * @Author Ryan
     * @Create 2013-7-13 涓婂崍10:18:34
     */
    int count = 0;
    class PollingThread extends Thread {
        @Override
        public void run() {
            System.out.println("Polling...");
            count ++;
            //当计数能被5整除时弹出通知
            if (count % 5 == 0) {
                showNotification();
                System.out.println("New message!");
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service:onDestroy");
    }

}

别望了在AndroidManifest.xml中注册Service:

<service android:name="com.ryantang.rtpollingdemo.PollingService">
            <intent-filter>
                <action android:name="com.ryantang.service.PollingService"/>
            </intent-filter>
        </service>

当计数能被5整除时弹出通知,点击通知后进入MessageActivity.java:

package com.ryantang.rtpollingdemo;

import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;

public class MessageActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message);
        System.out.println("新的activity");
        NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

        manager.cancelAll();
    }
}

使用AlarmManager封装已给PollingUtils.java来执行Service的启动和停止,PollingUtils.java:

package com.ryantang.rtpollingdemo;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
/**
 * Polling Tools
 * @Author Ryan
 * @Create 2013-7-13 涓婂崍10:14:43
 */
public class PollingUtils {

    /**开启轮询服务
     * @param context
     * @param seconds  定期执行的时间间隔
     * @param cls
     * @param action
     */
    public static void startPollingService(Context context, int seconds, Class<?> cls,String action) {
        //获取AlarmManager系统服务
        AlarmManager manager = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        //包装需要执行Service的Intent
        Intent intent = new Intent(context, cls);
        intent.setAction(action);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //触发服务的起始时间
        long triggerAtTime = SystemClock.elapsedRealtime();
        //使用AlarmManager的setRepeating方法设置定期执行时间间隔(seconds秒)和需要执行的Service
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,
                seconds * 1000, pendingIntent);
    }

    /**
     * 停止轮询服务
     * @param context
     * @param cls
     * @param action
     */
    public static void stopPollingService(Context context, Class<?> cls,String action) {
        //获取AlarmManager系统服务
        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);
    }
}

最后在主程序中执行,MainActivity.java:

package com.ryantang.rtpollingdemo;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Start polling service
        System.out.println("Start polling service...");
        PollingUtils.startPollingService(this, 30, PollingService.class,
                PollingService.ACTION);// PollingService.ACTION与AndroidManifest.xml一一对应
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Stop polling service
        System.out.println("Stop polling service...");
        PollingUtils.stopPollingService(this, PollingService.class,
                PollingService.ACTION);
    }

}

Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

(1)在指定时长后执行某项操作

//操作:发送一个广播,广播接收后Toast提示定时操作完成
Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("short");
PendingIntent sender=
PendingIntent.getBroadcast(Main.this, 0, intent, 0);

//设定一个五秒后的时间
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 5);

AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
//或者以下面方式简化
//alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+5*1000, sender);
//注意:receiver记得在manifest.xml注册,使用的是静态的广播消息机制
public static class alarmreceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals("short")){
      Toast.makeText(context, "short alarm", Toast.LENGTH_LONG).show();
}else{
       Toast.makeText(context, "repeating alarm",Toast.LENGTH_LONG).show();
    }
  }
}
<receiver android:name="" >
        <intent-filter >
            <action android:name="short"><action />
        </intent-filter>
</receiver>

AlarmManager类型如下:

AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。

AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发射时唤醒手机休眠;

AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;在指定的延时过后,发送广播,但不唤醒设备。

AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发射时唤醒手机休眠;

RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。

(2)周期性的执行某项操作

Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(Main.this, 0, intent, 0);
//开始时间
long firstime=SystemClock.elapsedRealtime();
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
 //5秒一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 5*1000, sender);

AlarmManager的setRepeating()相当于Timer的Schedule(task,delay,peroid);有点差异的地方时Timer这个方法是指定延迟多长时间以后开始周期性的执行task;

AlarmManager的取消:(其中需要注意的是取消的Intent必须与启动Intent保持绝对一致才能支持取消AlarmManager)

Intent intent =new Intent(Main.this, alarmreceiver.class);
intent.setAction("repeating");
PendingIntent sender=PendingIntent
.getBroadcast(Main.this, 0, intent, 0);
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
alarm.cancel(sender);
时间: 2024-10-12 23:21:44

使用AlarmManager定期执行工作的相关文章

Linux下设置定期执行脚本

下面针对的是非ubuntu环境,会在文章末尾介绍ubuntu的一些区别. 在Linux下,经常需要定期的执行一些脚本从而来实现一些功能. 在Linux下我们用crontab来实现定期的执行脚本这个功能,下面就介绍一下crontab的使用.以及我遇到的一些问题 一. crontab的使用说明 1. crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作.而linux任

linux命令行传递参数定期执行PHP文件

最近在做一个项目,需要在linux下传递参数定期执行PHP文件,网上查询资料,确实有相关资料,现整理如下: 1.linux执行PHP文件 #{PHP安装bin路径} {PHP文件路径} {需要参数1 参数2 参数3}#各参数之间,用空格分开#查看php安装bin路径 可执行which php命令 /usr/bin/php /local/www/index.php 111 222 333 2.接收参数 一般情况下,php接收命令行传递过来的参数,$argv保存所有参数组成的数组,$argc保存参数

如何让django方法自动地定期执行

实现思路:1.首先把需要自动执行的django method写成django command2.将自己定义的django command添加到cron中使用cron服务实现定期执行 Part1 在django工程中添加自定义的django command1.我们自己建立的application叫做myapp,首先在这个app目录下,我们需要新建management目录,这个目录里应该包括:__init__.py(内容为空,用于打包)和commands目录,然后在commands目录下包括:__i

.net全局定时定期执行某些操作在Global.asax中具体实现

全局定时定期执行某些操作看起来是多么自动化的一个问题不过在.net的Global.asax文件中稍微配置即可实现,详细配置如下,感兴趣的朋友可以参考下哈 <%@ Application Language="C#" %> <%@ import Namespace="System.Data" %> <%@ import Namespace="System.Data.SqlClient" %> <%@ impo

如何利用Cron让django应用定期执行

最近用Django写了一个项目,但是有一个地方需要应用在后台自动定期执行检查,并存入数据库,如果单纯的写Python程序的话不能很好的跟django的结合在一起,写起来也和麻烦,查找资料的时候发现了django有一个功能,就是django command,通过这个就可以使用django的manage.py去执行命令了. 参考:资料1   资料2   资料3 实现思路: 1.首先把需要自动执行的django method写成django command 2.将自己定义的django command

Linux 通过cron定期执行 php文件(转)

Linux 通过cron定期执行 php文件 补充几点: 1. 要在php文件头加上解释器的路径,通常是 #!/usr/bin/php 2. 授予要执行的php文件执行权限   chmod a+x xx.php 3. vi cronfile    输入:  0 * * * *  绝对路径/xx.php > /dev/null 2>&1 4. crontab cronfile 5. 如果 报错说  Extension "path/xx.php" not present

如何通过计划任务定期执行PS1脚本

PS1脚本大家都执行过,直接通过windows powershell就可以执行,但是如果我们想定期执行某个PS1脚本,该如何去实现呢?我们可以通过:系统计划任务来实现这个需求,实现方法见下 打开:计算机管理,右键:任务计划程序,新建基本任务,如图: 2.  输入任务名称 3.  选择任务执行的周期 4.  输入命令执行的开始时间 5.  选择start a program 6.  浏览Powershell所在的目录,并输入以下参数 -command ". 'c:\test.ps1'"

C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(downmoon) 系列三: windows service系列三--制作可控制界面的windows service 一.经常有人问起如何让程序定期自动执行? 除了像系统任务和SQL JOB/DTS等都可以满足不同的用户需求外,这里演示了如何做一个简单的windows serivce的框架.主要的功能是按照

mac corntab定期执行任务

crontab中的每一行代表一个定期执行的任务,分为6个部分.前5个部分表示何时执行命令,最后一个部分表示执行的命令.每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格.前5个部分分别代表:分钟,小时,天,月,星期,每个部分的取值范围如下:分钟 0 - 59小时 0 - 23天 1 - 31月 1 - 12星期 0 - 6 0表示星期天 除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:星号 表示任意值,比如在小时部分填