AlarmManager 定时提醒

原创 2015年07月07日 15:46:38

之前写了一个AlarmManager+Service的轮询Demo,今天写个AlarmManager的新用法,定时器,说白了就是设置一个闹钟。
原理:设置一个定时器,到了定是时间,系统会发出广播,我们自己接收处理就OK了。
Demo:http://download.csdn.net/detail/hello_12413/8876463
效果图:
这里写图片描述

以下是代码部分:

MainActivity.java:

package com.example.alarmreceiverdemo;

import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import com.example.alarmreceiverdemo.utils.DateFormatUtils;

public class MainActivity extends Activity implements OnClickListener {

    private Button setting;

    private TextView time;
    private TextView curTime;
    private StringBuilder builder;
    private PendingIntent mTimedMessagePendingIntent = null;
    private AlarmManager mAlarmManager;

    private int timedYear;
    private int timedMonth;
    private int timedDay;
    private int timedHour;
    private int timedMinute;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        setting = (Button) findViewById(R.id.setting);
        time = (TextView) findViewById(R.id.time);
        curTime = (TextView) findViewById(R.id.cur);
        builder = new StringBuilder();
        setting.setOnClickListener(this);
        handler.sendEmptyMessage(0);
    }

    // 发送定时任务
    private void sendTimedMessage() {
        Intent intent = new Intent(this, AlarmReceiver.class);
        intent.setAction("alarmBroadcastReceiverAction");
        mTimedMessagePendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
        // 设置定时时间
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, timedYear);
        calendar.set(Calendar.MONTH, timedMonth);
        calendar.set(Calendar.DAY_OF_MONTH, timedDay);
        calendar.set(Calendar.HOUR_OF_DAY, timedHour);
        calendar.set(Calendar.MINUTE, timedMinute);
        if (calendar.getTimeInMillis() <= System.currentTimeMillis()) {
            Toast.makeText(this, "请重新设置时间", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "成功设置定时时间", Toast.LENGTH_SHORT).show();
            mAlarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), mTimedMessagePendingIntent);
        }
    }

    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            curTime.setText(DateFormatUtils.getTime());
            handler.sendEmptyMessageDelayed(0, 1 * 1000);
        };
    };

    // 日期选择器监听器
    OnDateSetListener dateSetListener = new OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            timedYear = year;
            timedMonth = monthOfYear;
            timedDay = dayOfMonth;
            builder.append(year);
            builder.append("-");
            builder.append(monthOfYear < 10 ? ("0" + monthOfYear) : monthOfYear);
            builder.append("-");
            builder.append(dayOfMonth < 10 ? ("0" + dayOfMonth) : dayOfMonth);
            builder.append("\t");
            showTimeDialog();
        }
    };
    // 时间选择器监听器
    // 时间选择器监听器
    OnTimeSetListener timeSetListener = new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

            timedHour = hourOfDay;
            timedMinute = minute;

            builder.append(hourOfDay < 10 ? ("0" + hourOfDay) : hourOfDay);
            builder.append(":");
            builder.append(minute < 10 ? ("0" + minute) : minute);
            time.setText(builder.toString());

            sendTimedMessage();
        }
    };

    // 显示日期选择器
    private void showDataDialog() {
        Calendar c = Calendar.getInstance();
        DatePickerDialog datePickerDialog = new DatePickerDialog(this, dateSetListener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
        datePickerDialog.show();
    }

    // 显示时间选择器
    public void showTimeDialog() {
        Calendar c = Calendar.getInstance();
        TimePickerDialog timePickerDialog = new TimePickerDialog(this, timeSetListener, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true);
        timePickerDialog.show();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.setting:
            builder.delete(0, builder.length());
            showDataDialog();

            break;

        default:
            break;
        }
    }
}

广播接收器(记的在AndroidManifest.xml注册)

package com.example.alarmreceiverdemo;

import com.example.alarmreceiverdemo.utils.NotificationHelper;
import com.example.alarmreceiverdemo.utils.PhoneUtils;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * @project AlarmReceiverDemo
 * @ClassName AlarmReceiver.java
 * @Description 接收广播
 * @author xugang
 * @date 2015-7-7 下午12:16:00
 */
public class AlarmReceiver extends BroadcastReceiver {

    public final static String action = "";

    @Override
    public void onReceive(Context context, Intent intent) {
        String act = intent.getAction();
        Toast.makeText(context, "定是时间到:" + act, Toast.LENGTH_SHORT).show();
        NotificationHelper.showNotification(context, PhoneUtils.getIntent(),      context.getString(R.string.app_name), "定时时间到");
    }
}

发送通知:

public class NotificationHelper {
    /**
     * 发通知
     * 
     * @param context
     * @param intent
     * @param title
     * @param content
     */
    public static void showNotification(Context context, Intent intent, String title, String content) {
        NotificationCompat.Builder mBuilder = new  NotificationCompat.Builder(context).setSmallIcon(R.drawable.ic_launcher).setContentTitle(title).setContentText(content);
        mBuilder.setWhen(System.currentTimeMillis());
        PendingIntent pendingintent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(pendingintent);
        Notification notification = mBuilder.build();
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        notification.defaults |= Notification.DEFAULT_ALL;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.
        mNotificationManager.notify((int) System.currentTimeMillis(), notification);
    }
}

得到打开本应用的Intent:

public static Intent getIntent() {
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        intent.setComponent(ComponentName.unflattenFromString("com.example.alarmreceiverdemo/.MainActivity"));
        return intent;
    }

Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/setting"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:text="设置时间:" />

        <TextView
            android:id="@+id/time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dip" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:text="现在时间:" />

        <TextView
            android:id="@+id/cur"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dip" />
    </LinearLayout>

</LinearLayout>

android 后台定时提醒(Service,AlarmManager的使用)

笔者最近将工具书上Service的有关内容都学习了一下,于是打算做一个小应用来练一下手了。 考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是...
  • Double2hao
  • Double2hao
  • 2015年11月08日 16:56
  • 4749

AlarmManager详解-----实现定时提醒

各位好,又几天没见了,我是一个Android菜鸟,这几天项目要做个定时提醒业务,在网上看了很多资料,大多数都是关于AlarmManager去实现(虽然我个人觉得用它去实现不够强大,和健壮,但是没办法,...
  • zhxxqsda
  • zhxxqsda
  • 2015年01月28日 20:11
  • 1440

AlarmManager实现精准定时任务

在项目中,有这么一个功能点,app进程中,需要实现一个定时任务,只要设备处于开机状态,每隔半个小时,就需要定时向服务器上传一次位置信息,并且只要是有网络和获取到GPS信号,进程不能死,如果进程死掉了,...
  • Coder80
  • Coder80
  • 2014年11月03日 22:01
  • 23941

Android 设置定时提醒,AlarmManager简单使用

给app设置定时提醒的功能,典型的例子有闹钟,AlarmManager是Android系统级的服务,原理相当的简单,当你设定一个时间,然后在到达时候后,系统触发一个广播,然后广播通过PendingIn...
  • u010886975
  • u010886975
  • 2017年02月10日 11:45
  • 543

Android AlarmManager实现不间断轮询服务(定时提醒功能)

在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了。但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一...
  • chenguang79
  • chenguang79
  • 2014年11月27日 09:52
  • 6921

Android AlarmManager实现不间断轮询服务

在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了。但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一...
  • tangren03
  • tangren03
  • 2013年07月13日 11:40
  • 34609

Android利用AlarmManager执行定时任务

Android中的AlarmManager是一个全局定时器
  • fxdaniel
  • fxdaniel
  • 2014年11月15日 21:03
  • 7970

AlarmManager 定时广播,定时服务

AlarmManager的作用文档中的解释是:在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Inten...
  • wds1181977
  • wds1181977
  • 2016年04月09日 16:34
  • 1495

Android AlarmManager设置多个定时事件时只最后一个有效问题解决

转自http://blog.csdn.net/wangjia55/article/details/21518931 最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有...
  • m0_37203672
  • m0_37203672
  • 2017年05月05日 19:59
  • 992

解决AlarmManager时间不准

公司项目已经渡过了研发阶段,现在进入了调试阶段(疯狂改Bug有木有!现在一看到有Bug的邮件过来,就想一拳打爆屏幕,当然也只是想想)。言归正传! 在最近的Bug中发现一个问题,项目有用到预约的功能,所...
  • editor1994
  • editor1994
  • 2016年01月30日 09:53
  • 6491
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AlarmManager 定时提醒
举报原因:
原因补充:

(最多只允许输入30个字)