如何以编程方式将提醒设置为特定日期

时间:2015-10-13 16:47:51

标签: android alarmmanager

这里我有一个代码来设置用户的日期和时间。当时间到来时,会弹出通知。                              问题是用户必须手动设置时间。我想以编程方式将其设置为特定日期,比如2016年1月23日。那么用户只需单击设置按钮而忘记其他事情。

java

AlarmReceiiver文件: -

 package com.defcomdevs.invento16;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v7.app.NotificationCompat;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {
int notifyId=1;
@Override
public void onReceive(Context context, Intent intent) {
    //Toast.makeText(context,"Alarm has been set",Toast.LENGTH_SHORT).show();
    /*Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(context, notification);
    r.play();*/
    NotificationCompat.Builder mNotify=new NotificationCompat.Builder(context);
    mNotify.setSmallIcon(R.drawable.index);
    mNotify.setContentTitle("Coding");
    mNotify.setContentText("INVENTO: Coding competition is going to be conducted today.");
    Intent resultIntent=new Intent(context,Coding.class);
    TaskStackBuilder stackBuilder=TaskStackBuilder.create(context);
    stackBuilder.addParentStack(Coding.class); //add the to-be-displayed activity to the top of stack
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
    mNotify.setContentIntent(resultPendingIntent);
    NotificationManager notificationManager=(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(notifyId,mNotify.build());
}
}

AlarmActivity.java: -

package com.defcomdevs.invento16;

import android.os.Bundle;
import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NavUtils;
import android.view.MenuItem;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

public class AlarmActivity extends AppCompatActivity {
private TextView t1,t2,info;
private DatePicker dp;
private TimePicker tp;
private View v1,v2;
private Button b1;
final static int req1=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_alarm);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    b1= (Button) findViewById(R.id.submitalarm);
    t1= (TextView) findViewById(R.id.setdate);
    t2= (TextView) findViewById(R.id.settime);
    tp= (TimePicker) findViewById(R.id.timePicker);
    info= (TextView) findViewById(R.id.alarminfo);
    dp= (DatePicker) findViewById(R.id.datepicker);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    Calendar now=Calendar.getInstance(); //initialize calendar variable
    dp.init(
            now.get(Calendar.YEAR),
            now.get(Calendar.MONTH),
            now.get(Calendar.DAY_OF_MONTH),
            null
    );      //read current day,month & year
            //now is a variable,it doesn't mean 'now'
    tp.setCurrentHour(now.get(Calendar.HOUR_OF_DAY));   //set current hour
    tp.setCurrentMinute(now.get(Calendar.MINUTE));  //set current minute
    b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Calendar current = Calendar.getInstance();    //initialize an instance of Calendar
            Calendar cal = Calendar.getInstance();
            cal.set(dp.getYear(),
                    dp.getMonth(),
                    dp.getDayOfMonth(),
                    tp.getCurrentHour(),
                    tp.getCurrentMinute(),
                    00);        //get current time and date
            if (cal.compareTo(current) <= 0) {
                Toast.makeText(getApplicationContext(),"Invalid Date/Time.Please Re-enter",Toast.LENGTH_LONG).show();
            }
            else{
                setAlarm(cal);
            }
        }
    });



}
private void setAlarm(Calendar target){

    info.setText("\n\n***\n"
            + "Alarm is set@ " + target.getTime() + "\n"
            + "***\n");
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), req1, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, target.getTimeInMillis(), pendingIntent);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    if(id==android.R.id.home){
        Intent intent=new Intent(this,MainActivity.class);
        startActivity(intent);
        this.finish();
    }
    return super.onOptionsItemSelected(item);
}
}

我怎么能这样做?请帮忙。谢谢。

2 个答案:

答案 0 :(得分:3)

此代码将闹钟设置为2016年1月23日18:05:00。所以你不需要TimePicker和DatePicker。请参阅此处的文档:Calendar

Calendar cal = Calendar.getInstance();
cal.set(2016, 0, 23, 18, 5, 0);

setAlarm(cal);

答案 1 :(得分:0)

这是我的贡献我所做的我还没有测试过这个但概念是正确的只是尝试一下......

     Calendar calendar = Calendar.getInstance();
     calendar.set(2016,MonthSelect("May"),DaySelect("Monday"));
if (SDK_INT < Build.VERSION_CODES.KITKAT) {
            alarmMgr.set(AlarmManager.RTC_WAKEUP,  calendar.getTimeInMillis(), alarmIntent);
        }else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
            alarmMgr.setExact(AlarmManager.RTC_WAKEUP,  calendar.getTimeInMillis(), alarmIntent);
        }
        else if (SDK_INT >= Build.VERSION_CODES.M) {
            alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,  calendar.getTimeInMillis(), alarmIntent);


        }
.......... then the other functions called..

 private int MonthSelect(String mMonth){

        if(mMonth=="January"){
           return 0;
        }else if(mMonth.equalsIgnoreCase("February")){
            return 1;
        }else if(mMonth.equalsIgnoreCase("March")){
            return 2;
        }else if(mMonth.equalsIgnoreCase("April")){
            return 3;
        }else if(mMonth.equalsIgnoreCase("May")){
            return 4;
        }else if(mMonth.equalsIgnoreCase("June")){
            return 5;
        }else if(mMonth.equalsIgnoreCase("July")){
            return 6;
        }else if(mMonth.equalsIgnoreCase("August")){
            return 7;
        }else if(mMonth.equalsIgnoreCase("September")){
            return 8;
        }else if(mMonth.equalsIgnoreCase("October")){
            return 9;
        }else if(mMonth.equalsIgnoreCase("Novermber")){
            return 10;
        }else {
            return 11;
        }
    }
    private int DaySelect(String mDay){
        if(mDay.equalsIgnoreCase("Monday")){
            return  Calendar.MONDAY;
        }else if (mDay.equalsIgnoreCase("Tuesday")){
            return  Calendar.TUESDAY;
        }else if (mDay.equalsIgnoreCase("Wednesday")){
            return  Calendar.WEDNESDAY;
        }else if (mDay.equalsIgnoreCase("Thursday")){
            return  Calendar.THURSDAY;
        }else if (mDay.equalsIgnoreCase("Friday")){
            return  Calendar.FRIDAY;
        }else if (mDay.equalsIgnoreCase("Saturday")){
            return  Calendar.SATURDAY;
        }else{
            return  Calendar.SUNDAY;
        }
    }