Android 如何使用Alarm Manager和BroadcastReceiver显示警报框

Android 如何使用Alarm Manager和BroadcastReceiver显示警报框,android,broadcastreceiver,android-alertdialog,android-broadcast,android-alarms,Android,Broadcastreceiver,Android Alertdialog,Android Broadcast,Android Alarms,我希望我的android应用程序在每天的特定时间弹出一个警报对话框。据我所知,我们需要使用Alarm manager设置一天中重复的时间,然后发送广播以显示警报对话框。即使应用程序已关闭,也应在指定时间显示警报框。我尝试了以下代码,但在指定的时间它没有做任何事情。请建议需要做什么。我是android开发的新手,这是我的第一个实现 主要活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCr

我希望我的android应用程序在每天的特定时间弹出一个警报对话框。据我所知,我们需要使用Alarm manager设置一天中重复的时间,然后发送广播以显示警报对话框。即使应用程序已关闭,也应在指定时间显示警报框。我尝试了以下代码,但在指定的时间它没有做任何事情。请建议需要做什么。我是android开发的新手,这是我的第一个实现

主要活动

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.YEAR,Calendar.MONTH,Calendar.DAY_OF_MONTH,6, 10);
    setAlarm(calendar.getTimeInMillis());


}

private void setAlarm(long timeInMillis) {
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlertBox.class);

    PendingIntent penIntent = PendingIntent.getBroadcast(this,0,intent,0);
    am.setRepeating(AlarmManager.RTC_WAKEUP,timeInMillis,AlarmManager.INTERVAL_DAY,penIntent);

    //Toast.makeText(this,"Alarm is set",Toast.LENGTH_SHORT).show();
}
警报箱

    @Override
public void onReceive(Context context, Intent intent) {

   DisplayAlertBox(context, "Tip of the Day");
}

private void DisplayAlertBox(Context context, String msg) {
    Toast.makeText(context, "Dialog Box should display Now", Toast.LENGTH_LONG).show();
    PendingIntent alertBox = PendingIntent.getActivity(context,0, new Intent(context,MainActivity.class),0);

    AlertDialog.Builder aBuilder = new AlertDialog.Builder(context);
    aBuilder.setTitle("Message");
    aBuilder.setMessage(msg);
    aBuilder.setPositiveButton("Accept",new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int whichButton)
        {

        }});

    aBuilder.create();
    aBuilder.show();
}

什么都没有发生的原因是因为你对广播接收器没有一个清晰的理解

一旦注册,BroadcastReceivers将坐在那里等待它可以接收的广播。注册BroadcastReceiver可以在清单文件中完成,也可以通过代码完成。它可以等待接收的广播可以是隐式广播或显式广播。但在你的情况下,这是一个明确的广播。所以你会在你的舱单上声明如下:

<receiver android:name="com.package.AlertBox">
    <intent-filter>
        <action android:name="can.be.any.name.like.tip.of.the.day"
    </intent-filter>
</receiver>
请记住,用作意图操作的字符串必须与广播接收器正在收听的字符串匹配。这样,onReceive()方法将能够触发

但是,我还应该提到,BroadcastReceiver不应该位于运行AlertDialog的地方。BroadcastReceivers用于短时间执行代码,不用于长时间持续。因此,一项活动或服务将是一个更好的选择


你应该考虑让ALARMMIX管理器启动一个透明的活动来代替对话片段。 可能在用户每天进入应用程序时显示它。如果您使用服务来检查共享pref,这将更容易。如果用户进入应用程序,请在创建时检查共享pref。如果为false,则显示警报。@droidv此任务旨在为患者提供训练常规提示。即使他们不使用该应用程序,他们也应该在一天中的特定时间在“警报”对话框中获取提示。这就像提醒通知,但我希望提醒作为警报对话框出现,而不是通知。@user1717876如果此提示真的那么重要,我会使用在其自身进程中运行的服务来触发通知,而不是IntentService。您将拥有更好的控制能力,您将在一个地方拥有与何时发出通知相关的所有业务逻辑,并且您的UI中的样板代码将更少。感谢您的详细回复。关于您上次建议使用活动而不是BroadcastReceiver,即使应用程序已关闭,它是否仍能正常工作。我希望该对话框即使在应用程序未使用时也能出现。这就是我使用广播接收器的原因。还是我应该创建一个服务?@user1717876当您使用AlarmManager时,无论您使用的是Activity、BroadcastReceiver还是Service。如果您查看AlarmManager的文档:您会注意到第三句话说,如果应用程序未运行,将启动它。因此,即使您使用活动并且您的应用程序已关闭,AlarmManager也会启动您的应用程序,并显示您在提供给AlarmManager的意图中设置的活动。我建议使用活动,因为广播接收器和服务不用于显示对话框。

AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent("can.be.any.name.like.tip.of.the.day");
PendingIntent penIntent = PendingIntent.getBroadcast(this,0,intent,0);
am.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, AlarmManager.INTERVAL_DAY, penIntent);