我需要使用带闹钟管理器的广播吗?

时间:2013-01-31 01:54:46

标签: android broadcastreceiver alarmmanager android-pendingintent

我正在创建一个警报应用程序,这是运行警报的方法:

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,但我对它的应用程序没有什么不同。

感谢。

3 个答案:

答案 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完全有效。

相关问题