一、 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)
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();
- }
- }
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>
<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;
- }
- }
- };
- }
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;
}
}
};
}