有不明之处或者本文有错误地方请大方的提出来,转载请注明来源:http://blog.csdn.net/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;
}
}
};
}