您的位置:首页 > 移动开发 > Android开发

android之定时器AlarmManager

2012-10-15 17:50 411 查看
最终效果图:


当我们点击定时时,会弹出一个时间选择器,选定好时间之后,系统便可以进行定时了。注意,这里可不是会真的响铃,我们在定时的任务里并没有添加响铃的代码,只是在Logcat中做了个简单的打印。本例子重点在于讲解在android中AlarmManager的使用。

activity的代码:

view plaincopy
to clipboardprint?

package cn.com.chenzheng_java;

import java.util.Calendar;

import android.app.Activity;

import android.app.AlarmManager;

import android.app.PendingIntent;

import android.app.TimePickerDialog;

import android.app.TimePickerDialog.OnTimeSetListener;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.TimePicker;

import android.widget.CompoundButton.OnCheckedChangeListener;

public class AlarmManagerActivity extends Activity implements OnClickListener,OnTimeSetListener,OnCheckedChangeListener{

Calendar calendar = Calendar.getInstance();// 代表当前时间的日历

Button button1 ;

CheckBox checkBox;

boolean flag = false ;// 是否只执行一次

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.alarm);

button1 = (Button) findViewById(R.id.button_alarm1);

checkBox = (CheckBox) findViewById(R.id.checkBox1_alarm);

checkBox.setOnCheckedChangeListener(this);

button1.setOnClickListener(this);

}

@Override

public void onClick(View v) {

if(v==button1){

calendar.setTimeInMillis(System.currentTimeMillis());

new TimePickerDialog(AlarmManagerActivity.this, this,

calendar.get(Calendar.HOUR_OF_DAY),

calendar.get(Calendar.MINUTE), true).show();

}

}

/**

* 当我们设置了新时间时触发。

*/

@Override

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

// 将时间设置为定时的时间

calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);

calendar.set(Calendar.MINUTE, minute);

Intent intent = new Intent(AlarmManagerActivity.this,MyAlarmBroadCast.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);

/***

* 获取全局定时器的服务管理器

*/

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

if(flag){

/**

* 指定的任务只会执行一次,如果该pendingIntent指定的任务已经被执行过了,那么该方法直接会被cancel掉。

* set(int type, long triggerAtTime, PendingIntent operation)

* type 指定定时模式。

* triggerAtTime 触发任务的时间。该参数和定时模式息息相关

* operation 该参数指定一个广播Intent,当时间到了时,系统会广播里面的intent,触发相应的广播接收者执行某些操作,比如响铃……

*/

alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

}

else

{

/**

* 通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔

* 如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent);

* 注意,这里的pendingIntent要和setRepeating方法中的一致哦。

*/

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);

}

Log.i("通知", "定时成功!");

}

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

flag = !isChecked;

}

}

alarm.xml

view plaincopy
to clipboardprint?

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical">

<AnalogClock android:id="@+id/analogClock1_alarm"

android:layout_width="wrap_content" android:layout_height="wrap_content"></AnalogClock>

<CheckBox android:text="是否重复响铃" android:id="@+id/checkBox1_alarm" android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>

<Button android:text="定时" android:id="@+id/button_alarm1"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

MyAlarmBroadCast.java

view plaincopy
to clipboardprint?

package cn.com.chenzheng_java;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

import android.widget.Toast;

/**

* 声明接受AlarmManager时间到了时发布的广播

* @author chenzheng_java

*/

public class MyAlarmBroadCast extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

Log.i("通知", "收到了广播");

// 可以在此处添加响铃的代码

}

}

Manifest.xml代码:

view plaincopy
to clipboardprint?

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="cn.com.chenzheng_java"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name="AlarmManagerActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name="MyAlarmBroadCast"/>

</application>

</manifest>

------------------------------------------------------------------

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作

使用的步骤:

第一:获取管理器。AlarmManager alarmManager = this.getSystemService(ALARM_SERVICE);

第二:通过AlarmManager的set和setRepeating方法定时。可以通过cancel()方法取消定时。

在set和setRepeating方法中,第一个参数type代表定时模式,这里的定时模式主要有以下几种。



原贴地址:http://blog.csdn.net/chenzheng_java/archive/2011/03/20/6263096.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: