Android PendingIntent与AlarmManager

本文介绍了如何利用Android中的AlarmManager结合PendingIntent实现定时任务,包括启动广播接收器以定期显示时间的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有不明之处或者本文有错误地方请大方的提出来,转载请注明来源:http://blog.youkuaiyun.com/geekerparadise/article/details/7787729

一、   PendingIntent:

PendingIntent,顾名思义,是一个延迟意图,也就是说这个意图不确定发出时间,Pendingintent相当于包装了Intent。

通过以下函数中intent的描述可以启动一个Activity、Broadcast、Service,要想启动新的Activity,要设置相应的flag. Intent.FLAG_ACTIVITY_NEW_TASK

getActivity(Context context, int requestCode, Intent intent, int flags)
getBroadcast(Context context, int requestCode, Intent intent, int flags)
getService(Context context, int requestCode, Intent intent, int flags)

二、 AlarmManager:

AlarmManager是一个可访问系统Alarm服务的一个类,在规定的时间内触发,也可以循环触发。

它有几种类型:       

RTC_WAKEUP能唤醒系统,使用的是绝对时间,即System.currentTimeMillis

public staticfinal int RTC_WAKEUP = 0;

RTC不能唤醒系统,使用的是绝对时间,即System.currentTimeMillis

public staticfinal int RTC = 1;

能唤醒系统使用的是相对时间。SystemClock.elapsedRealtime()

public staticfinal int ELAPSED_REALTIME_WAKEUP = 2;

不能唤醒系统,使用的是相对时间。SystemClock.elapsedRealtime()

public static finalint ELAPSED_REALTIME = 3;

在OPhone等一些其他sdk中有这么一个参数POWER_OFF_WAKEUP,它是一个关机闹铃,即使是在关机状态下也能唤醒。


三、   举例说明:

1:定义一个Broadcast,定时显示时间。

package com.jm.notifying;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

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

public class AlarmReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Calendar now = Calendar.getInstance();
		DateFormat format = SimpleDateFormat.getTimeInstance();
		/*定时循环显示当前时间*/
		Toast.makeText(context, format.format(now.getTime()), Toast.LENGTH_LONG).show();
	}
}

2:Manifest文件中配置:

<receiver android:name=".AlarmReceiver"></receiver>

3:主界面定义两个按钮,开始和关闭。

package com.jm.notifying;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/**
 * 启动和停止界面
 * @author jinmeng
 *
 */
public class AlarmActivity extends Activity {
	//两个按钮,开始和停止
	Button start;
	Button stop;
	//一个延迟意图
	PendingIntent operation;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.alert_activity);
		start = (Button) findViewById(R.id.btn1);
		stop = (Button) findViewById(R.id.btn2);
		//定义一个Intent用于封装到PendingIntent中
		Intent launchIntent = new Intent(AlarmActivity.this,AlarmReceiver.class);
		operation = PendingIntent.getBroadcast(AlarmActivity.this, 0, launchIntent, 0);
		//设置时间监听器
		start.setOnClickListener(listener);
		stop.setOnClickListener(listener);
	}

	/**
	 * 根据不同的组件触发不同的事件,并通过AlarmManager来循环打印时间
	 */
	OnClickListener listener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			//获取AlarmManager实例
			AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
			long interval = 5 * 1000;
			switch (v.getId()) {
			case R.id.btn1:
				//启动一个循环执行的效果
				manager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+interval, interval, operation);
				break;
			case R.id.btn2:
				//取消执行
				Toast.makeText(AlarmActivity.this, "Cancel", Toast.LENGTH_LONG).show();
				manager.cancel(operation);
				break;
			default:
				break;
			}
		}
	};
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值