Android 中基于 PendingIntent 与 AlarmManager 的定时广播

代码与范例:

Calendar cal = new GregorianCalendar();
cal.set(2014, 6, 19, 9, 23)  // 2014年6月19日9点23分
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); // AlarmReceiver 需要继承 BroadcastReceiver,于是它将在接受到广播后执行 onReceive() 方法
intent.putExtra("intentID", 0);  // 亦可以向 Intent 中添加数据
PendingIntent pintent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent); // 将在先前指定时刻发出广播

说明:上述代码将创建并注册一个定时发出的广播,广播接收器 AlarmReceiver 将接收该广播。广播接收器需要事先在 Manifest 文件中注册,如下所示。

此外,如果要为 AlarmManager 设置间隔,需要注意的是,参数(单位为毫秒)大小有一定的限制,且 AlarmManager 无法在系统关机后保留。

Android中在系统启动完成时自动运行程序

代码与范例:

启动活动的情况

public class StartupReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Intent activityIntent = new Intent(context, StartupActivity.class); 
        activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(activityIntent);
    }  
}

启动服务的情况

public class StartupReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent(context, StartupService.class);
            context.startService(serviceIntent);
    }
}

Manifest文件

……
<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” >
</uses-permission>
……
<application >
……
<receiver android:name=”.StartupReceiver” >
<intent-filter>
<action android:name=”android.intent.action.BOOT_COMPLETED” />
</intent-filter>
</receiver>
</application>
……

说明:通过 Intent 和 BroadcastReceiver 来实现系统启动后自动执行程序。需要在Manifest中注册该 BroadcastReceiver 并声明相应的权限。StartupReceiver 应当作为单独的类存在,而不能被包含在,例如,一个 Activity 类内部。这种情况下将无法接受到广播。更多的意图请参见官方文档。