2

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

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,但我不知道它会对我的应用程序产生什么影响。

谢谢。

4

3 回答 3

6

在一般情况下,A--C 的答案是正确的。

但是,您使用RTC_WAKEUP的是警报类型。我们对警报的唯一保证是,如果我们使用,那么Android 将确保设备将保持唤醒足够长的时间以供我们执行。任何其他类型的活动或服务都无法保证,并且设备很可能在或实际发生之前重新入睡。_WAKEUPBroadcastReceiveronReceive()PendingIntentstartActivity()startService()

于 2013-01-31T02:03:16.223 回答
4

您可以使用AlarmManager任何PendingIntent功能(活动、服务、接收器),但是,它通常与接收器一起使用 - 未来执行的任务通常很小并且不需要 Activity 来运行,因为用户不需要突然出现的东西。

Receiver 不是 Activity,因此它没有 UI,并且处理时间限制约为 10 秒,因此请确保速度快。如果您需要在特定时间显示 UI,请坚持使用Activity,但通常情况并非如此,除非它类似于用户必须看到的闹钟应用程序)。如果您有类似的小型幕后操作,请选择接收器。Receiver'sonReceive()得到一个Context传递给它,所以它可以做任何事情Context

请记住,PendingIntent.getActivity()如果它不是活动,则必须将调用更改为您决定使用的任何其他内容。

所以这一切都取决于你想做什么。

于 2013-01-31T01:58:27.390 回答
1

您不必使用BroadcastReceiver. (在大多数情况下)通常不赞成在Activity没有用户交互的情况下窃取焦点并从后台启动。不过,肯定有有效的用例。如果您打算Activity立即启动,直接而不是 viaBroadcastReceiver是完全有效的。

于 2013-01-31T02:00:33.733 回答