【问题标题】:How can i call my alarm at the time of event occurs in android?我如何在android中发生事件时拨打我的警报?
【发布时间】:2016-05-27 13:35:53
【问题描述】:

说明: 我在我的应用程序中创建了一个日历。它提供了在每月特定日期添加和删除事件等功能。 此事件保存在我的 SQLite 数据库中并从数据库中显示。无论如何,我解释了我所做的几乎所有事情。

我想要什么?

假设,我在 2016 年 12 月 14 日添加了我朋友的生日事件。那么,这个事件将在我朋友生日到来的时候触发。

我想在特定的日子触发那个事件,比如闹钟。

这是我的日历代码

public class CalendarFragment extends Fragment{

    View rootView;
    String str_date="";
    String month="";
    String year="";
    ListView event_list;
    String parts[];
    String monthYear="";
    String monthAyear="";

    private SimpleDateFormat dateFormatForMonth = new SimpleDateFormat("MMM - yyyy", Locale.getDefault());
    EventAdapter adapter=null;
    DatabaseHandler db=null;

    List<Event> list_data;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView=inflater.inflate(R.layout.fragment_calendar, container, false);

        event_list=(ListView)rootView.findViewById(R.id.event_listview);


        final ImageButton showPreviousMonthBut = (ImageButton) rootView.findViewById(R.id.prev_button);
        final ImageButton showNextMonthBut = (ImageButton) rootView.findViewById(R.id.next_button);

        db=new DatabaseHandler(getContext());
        final TextView year_name=(TextView)rootView.findViewById(R.id.year_name);

        final CompactCalendarView compactCalendarView = (CompactCalendarView) rootView.findViewById(R.id.compactcalendar_view);
        compactCalendarView.drawSmallIndicatorForEvents(true);
        compactCalendarView.setCurrentDayBackgroundColor(getResources().getColor(R.color.black));

        compactCalendarView.setCurrentSelectedDayBackgroundColor(getResources().getColor(R.color.dark_red));

        compactCalendarView.invalidate();

        year_name.setText(dateFormatForMonth.format(compactCalendarView.getFirstDayOfCurrentMonth()));
        monthYear=dateFormatForMonth.format(compactCalendarView.getFirstDayOfCurrentMonth());

        parts=monthYear.split("-");
        month=parts[0].replace(" ","");
        year=parts[1].replace(" ","");

        monthAyear=month+"-"+year;
        list_data=db.getAllEvents();

        showData(monthAyear);
        compactCalendarView.setListener(new CompactCalendarView.CompactCalendarViewListener() {
            @Override
            public void onDayClick(Date dateClicked) {
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd-MMM-yyyy");
                str_date=simpleDateFormat.format(dateClicked);
                dialogShow();

            }

            @Override
            public void onMonthScroll(Date firstDayOfNewMonth) {
                monthYear=dateFormatForMonth.format(firstDayOfNewMonth);
                parts=monthYear.split("-");
                month=parts[0].replace(" ","");
                year=parts[1].replace(" ","");
                monthAyear=month+"-"+year;
                showData(monthAyear);
                year_name.setText(dateFormatForMonth.format(firstDayOfNewMonth));
            }
        });

        showPreviousMonthBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                compactCalendarView.showPreviousMonth();
            }
        });

        showNextMonthBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                compactCalendarView.showNextMonth();
            }
        });

//
        return rootView;
    }
    public void dialogShow(){

        final Dialog dialog=new Dialog(getContext());
        dialog.setContentView(R.layout.dialog_layout);
        dialog.setTitle("Add Event");

        final TextView event_name=(TextView)dialog.findViewById(R.id.event_name);
        final TextView event_desc=(TextView)dialog.findViewById(R.id.event_description);
        final TextView event_date=(TextView)dialog.findViewById(R.id.event_date);

        event_date.setText(str_date);
        Button btn_save=(Button)dialog.findViewById(R.id.btn_save);

        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                db.addEvent(new Event(event_name.getText().toString(),event_desc.getText().toString(),event_date.getText().toString(),monthAyear));
                dialog.hide();
                Toast.makeText(getContext(), "Event added successfully....", Toast.LENGTH_SHORT).show();
                showData(monthAyear);
            }
        });
        dialog.show();

    }
    public void showData(String monthWyear){
        List<Event> list_data=db.getEvent(monthWyear);
        adapter=new EventAdapter(getActivity(),list_data);
        event_list.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.findItem(R.id.spinner).setVisible(false);
        super.onCreateOptionsMenu(menu, inflater);
    }
}

请帮帮我,我该怎么办?

【问题讨论】:

  • 使用广播接收器
  • 是的,我知道但是如何将日期设置为 broadcaseReciver????
  • 你必须每 24 小时调用一次后台服务!
  • 您可以在“dialogShow()”->“btn_save”点击事件中创建警报。您已将选定的日期时间存储在“str_date”中。从此“str_date”变量中,您可以获得日期、月份和年份。

标签: android calendar


【解决方案1】:

您需要使用 AlarmManager 类通过 Push Notifications 通知用户:

因此,要使其正常工作,您需要以毫秒为单位传递代表您的目标日期的时间,例如:2016 年 12 月 24 日 -> 转换为毫秒并将其传递给 AlaramManager

    private Calendar calendar;
    calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    delay = calendar.getTimeInMillis();

public class SetUpNotification {

public  void setAlarm(long delay, String taskName, String taskDetails, Context context)
{
    Intent alertIntent = new Intent(context, AlertReceiver.class);
    alertIntent.putExtra("TaskName", taskName);
    alertIntent.putExtra("TaskDetails", taskDetails);




    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    final int _id = (int) System.currentTimeMillis();

    Log.d("Delay", delay+"");
    Log.d("ID", _id+"");
    alarmManager.set(AlarmManager.RTC_WAKEUP, delay,
            PendingIntent.getBroadcast(context, _id, alertIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT));
}

}

public class AlertReceiver extends BroadcastReceiver {
static int x = 0;

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

    String taskName = intent.getStringExtra("TaskName");
    String taskDetails = intent.getStringExtra("TaskDetails");

    Log.d("BroadcastReceiver", "OnRecieve");
    createNotification(context, taskName , taskDetails, "EatThatFrog");
    x++;
    Log.d("X", x+"");
}

public void createNotification(Context context, String msg, String msgText, String msgAlert){

    PendingIntent notificIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, DashboardActivity.class), 0);

    NotificationCompat.Builder mBuilder =
            (NotificationCompat.Builder) new NotificationCompat.Builder(context)

                    .setSmallIcon(R.drawable.notification_icon)
                    .setContentTitle(msg)
                    .setTicker(msgAlert)
                    .setContentText(msgText);

    mBuilder.setContentIntent(notificIntent);


    mBuilder.setDefaults(Notification.DEFAULT_SOUND);

    mBuilder.setAutoCancel(true);

    NotificationManager mNotificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    mNotificationManager.notify(1 + x, mBuilder.build());

}

}

【讨论】:

  • 假设在一个月内我有多个事件?
  • 随心所欲地添加,它有一个队列,根据最终 int _id = (int) System.currentTimeMillis();这是独一无二的
  • 你能解释一下延迟和 System.currentTimeInMillis() 的含义是什么。我永远不会在系统时间上调用闹钟我想在我的时间设置闹钟。请解释一下
  • 延迟只是一个长变量,我在其中存储我的 calander.getTimeinMilliseconds() 和 System.cureentTimeInMillis() 用于为您要发送的每个通知生成唯一 ID
  • 在我的数据库中,我每月有很多事件,我将在 Calendaer.set() 中传递什么?我的帖子在哪里?请告诉我。
【解决方案2】:

您可以报警管理器类并让您的广播接收器来处理该事件,并且为了在对话框中显示事件,您可以将对话框作为一个活动来显示数据库中的事件详细信息

用于报警

public void setAlarm(View v){
        Intent intent = new Intent(this,AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ Delay,pendingIntent);


    }

在广播接收器中

public void onReceive(Context ctxt, Intent intent) {
                Intent i=new Intent(ctxt, EventActivity.class);

                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                ctxt.startActivity(i);
              }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2016-03-22
    相关资源
    最近更新 更多