我正在创建一个警报应用程序,这是运行警报的方法:
public void startAlarm(int minuteToStart)
{
Toast.makeText(context, "Alarm Start in " + formatTime(minuteToStart), Toast.LENGTH_SHORT).show();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, minuteToStart);
Intent intent = new Intent(context, AlarmActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, idPendingIntent, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
}
它在给定特定时间后运行此活动:
public class AlarmActivity extends Activity {
......
}
它有效,但我看到人们正在使用BroadcastReceiver,我做错了吗?我也应该使用BroadcastReceiver吗?我一直在搜索BroadcastReceiver,但我对它的应用程序没有什么不同。
感谢。
答案 0 :(得分:5)
在一般情况下,A - C的答案是正确的。
但是,您使用RTC_WAKEUP
作为警报类型。仅 保证我们的_WAKEUP
警报是,如果我们使用BroadcastReceiver
,那么 Android将确保设备将保持清醒足够长的时间,以便我们执行onReceive()
。任何其他类型的PendingIntent
- 活动或服务 - 都无法保证,设备很可能在实际发生startActivity()
或startService()
之前就已经睡着了。
答案 1 :(得分:3)
您可以AlarmManager
使用PendingIntent
能够使用的任何内容(活动,服务,接收方),但通常与Receivers一起使用 - 将来执行通常很小,不需要运行Activity,因为用户不需要弹出一些东西。
Receiver不是Activity,因此它没有UI,并且处理时间限制大约为10秒,因此请确保快速。如果您需要在特定时间显示UI,请坚持使用Activity
,但通常情况并非,除非它类似于闹钟应用程序,用户有看)。如果您有类似幕后操作的东西,请选择接收器。接收方的onReceive()
传递给Context
,因此可以Context
执行任何操作。
请记住,如果它不是活动,您必须将PendingIntent.getActivity()
调用更改为您决定使用的任何其他内容。
所以这一切都取决于你想做什么。
答案 2 :(得分:0)
你没有 使用BroadcastReceiver
。通常不赞成(在大多数情况下)窃取焦点并在没有用户交互的情况下从后台发起Activity
。但是肯定有一些有效的用例。如果您打算立即启动Activity
,则直接执行此操作而不是通过BroadcastReceiver
完全有效。