您的位置:首页 > 其它

使用AlarmManager实现定时功能

2015-03-31 17:05 387 查看
我们经常会需要一些定时的服务,就是在某个时刻执行一定的任务,第一反应就是建立一条延时线程

new Handler().postAtTime(r, uptimeMillis);

这样开辟了一条线程,可能在某个时刻系统资源紧缺的情况下清理掉了,即使没有被清理,也可能会因为内存吃紧等情况下回收掉该线程。那么怎么实现定时操作,第一反应是安卓操作系统实现闹钟的功能,那么我们可以尝试从闹钟功能方面进行入手,看有没有相关的接口,在安卓方便,比回调接口更为被动发动的技能就是广播了,我们可以考虑是否通过广播来接收到某一个时刻的到来呢,终于,系统还是提供了AlarmManager给开发者较为便捷的方式实现定时功能;

本例程共有3个类;



MainActivity.java

public class MainActivity extends Activity {

	private AlarmManager alarmManager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
		Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); // 创建Intent对象
		PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,
				intent, 0); // 创建PendingIntent
		alarmManager.set(AlarmManager.RTC_WAKEUP, getTime(), pi); // 设置闹钟,当前时间就唤醒
	}

	private long getTime() {
		Calendar c=Calendar.getInstance();//获取日期对象    
		c.setTimeInMillis(System.currentTimeMillis());        //设置Calendar对象
		int time = c.get(Calendar.SECOND) + 5;
		c.set(Calendar.SECOND, time);                //设置闹钟的秒数
		c.set(Calendar.MILLISECOND, 0);            //设置闹钟的毫秒数
		return c.getTimeInMillis();
	}
}


AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i=new Intent(context, AlarmActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}


接收到广播之后就跳转到AlarmActivity中;
例程中也不需要使用相关的权限,清单配置文档如下:

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

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

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

</intent-filter>

</activity>

<activity android:name=".AlarmActivity" />

<!-- android:process=":remote": 新开一个进程 -->

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

</application>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: