2017-05-02 7 views
1

약간의 문제가 있으며 도움을 주시면 매우 감사하겠습니다. 클라이언트 medicins에 대한 로컬 데이터베이스와 같은 앱이 있는데, 알약을 추가 할 때 특정 알약을 먹어야 할 때 미리 알림을 추가 할 수있는 가능성이 있습니다. 그는 1 시간 (일시적) 만 설정하고 그 주부터 며칠을 선택할 수 있습니다. 그래서 앱은 그 특정 시간에 매일 알람을 울리고 있습니다. 즉, 앱이 많은 알람을 발생시키는 것입니다. 최선의 방법이라고 생각하지 않지만, 내가 만든 방식입니다. 이 일을 더 잘하는 방법이라면 저를 도와주세요. 하지만 내 주요 문제는 지금 고객이 약을 삭제하려고 할 때 각 알약의 알람을 비활성화 할 수 있도록 보류중인 의도를 저장하는 방법입니다.각 개체에 대한 알람 저장 및 삭제 방법

public class Home extends AppCompatActivity implements View.OnClickListener { 

////////////////////DECLARARI/////////////////// 
LinearLayout[] med = new LinearLayout[11]; 
TextView[] name = new TextView[11]; 
TextView[] nr = new TextView[11]; 
TextView[] plus = new TextView[11]; 
TextView[] minus = new TextView[11]; 
TextView[] info = new TextView[11]; 

public static final String PREFS_NAME = "MyMeds"; 
//////////////////////////////////////////////// 

public void calendar(View view, final EditText dateMed){ 
    final Calendar calendar = Calendar.getInstance(); 
    final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener(){ 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
      calendar.set(Calendar.YEAR, year); 
      calendar.set(Calendar.MONTH, monthOfYear); 
      calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

      String data = "dd/MM/yy"; 
      SimpleDateFormat sdf = new SimpleDateFormat(data, Locale.ENGLISH); 
      dateMed.setText(sdf.format(calendar.getTime())); 
     } 
    }; 

    view.findViewById(R.id.dateMed).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new DatePickerDialog(Home.this, date, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show(); 
     } 
    }); 
} 

public void clock(View view, final Calendar setat){ 
    final TextView ora = (TextView)view.findViewById(R.id.clock); 
    ora.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final Calendar time = Calendar.getInstance(); 
      int hour = time.get(Calendar.HOUR_OF_DAY); 
      int minute = time.get(Calendar.MINUTE); 

      TimePickerDialog timePickerDialog; 
      timePickerDialog = new TimePickerDialog(Home.this, new TimePickerDialog.OnTimeSetListener(){ 
       @Override 
       public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute){ 
        if(selectedHour < 10 && selectedMinute >= 10) ora.setText("0"+selectedHour + ":" + selectedMinute); 
        if(selectedHour >= 10 && selectedMinute < 10) ora.setText(selectedHour + ":" + "0" + selectedMinute); 
        if(selectedHour < 10 && selectedMinute < 10) ora.setText("0" + selectedHour + ":" + "0" + selectedMinute); 
        if(selectedHour >= 10 && selectedMinute >= 10) ora.setText(selectedHour + ":" + selectedMinute); 
        setat.set(Calendar.HOUR_OF_DAY, selectedHour); 
        setat.set(Calendar.MINUTE, selectedMinute); 
       } 
      }, hour, minute, true); 
      timePickerDialog.setTitle(""); 
      timePickerDialog.show(); 
     } 
    }); 
} 

public void setAlarm(int day , Calendar setat){ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.DAY_OF_WEEK, day+1); 
    calendar.set(Calendar.HOUR_OF_DAY, setat.get(Calendar.HOUR_OF_DAY)); 
    calendar.set(Calendar.MINUTE, setat.get(Calendar.MINUTE)); 
    calendar.set(Calendar.SECOND, 0); 

    long time = calendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis(); 

    Log.d("day", String.valueOf(calendar.get(Calendar.DAY_OF_WEEK))); 
    Log.d("time", String.valueOf(setat.get(Calendar.HOUR_OF_DAY)) + ":" + String.valueOf(setat.get(Calendar.MINUTE))); 
    Log.d("actual", String.valueOf(Calendar.getInstance().get(Calendar.MINUTE))); 

    Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), Calendar.getInstance().get(Calendar.MILLISECOND), intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarmManager = (AlarmManager)getApplicationContext().getSystemService(ALARM_SERVICE); 

    if(calendar.getTimeInMillis() > System.currentTimeMillis()) 
     Log.d("bigger", "yes"); 
    else 
     Log.d("bigger", "no"); 

    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
} 

public void addMedNou(){ 
    findViewById(R.id.add).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(Home.this); 
      View view = getLayoutInflater().inflate(R.layout.adddialog, null); 
      builder.setView(view); 
      final AlertDialog dialog = builder.create(); 

      final EditText nameMed = (EditText)view.findViewById(R.id.nameMed); 
      final EditText nrMed = (EditText)view.findViewById(R.id.nrMed); 
      final EditText comm = (EditText)view.findViewById(R.id.comm); 
      final EditText dateMed = (EditText)view.findViewById(R.id.dateMed); 
      FrameLayout add = (FrameLayout)view.findViewById(R.id.add); 
      FrameLayout cancel = (FrameLayout)view.findViewById(R.id.cancel); 
      calendar(view, dateMed); 
      reminder(view); 

      add.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if(!nameMed.getText().toString().isEmpty() && !nrMed.getText().toString().isEmpty()){ 
         SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
         SharedPreferences.Editor edit = valoriSalvate.edit(); 

         int total = valoriSalvate.getInt("total", 0); 
         total++; 
         if(total <= 10){ 
          edit.putInt("total", total); 
          edit.putString("nume" + total, nameMed.getText().toString()); 
          edit.putInt("nr" + total, Integer.parseInt(nrMed.getText().toString())); 
          edit.putString("comm" + total, comm.getText().toString()); 
          edit.putString("date" + total, dateMed.getText().toString()); 
         } 
         edit.commit(); 
         dialog.dismiss(); 
         Intent repeat = new Intent(Home.this, Home.class); 
         startActivity(repeat); 
        } 
        else 
         dialog.dismiss(); 
       } 
      }); 

      cancel.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
       } 
      }); 

      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dialog.show(); 
     } 
    }); 
} 

public void reminder(final View view){ 
    view.findViewById(R.id.reminder).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AlertDialog.Builder reminder = new AlertDialog.Builder(Home.this); 
      final View layout = getLayoutInflater().inflate(R.layout.alarm, null); 
      reminder.setView(layout); 
      final AlertDialog dialog = reminder.create(); 

      final Calendar setat = Calendar.getInstance(); 
      clock(layout, setat); 
      layout.findViewById(R.id.confirm).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        CheckBox[] boxes = new CheckBox[8]; 
        boxes[0] = (CheckBox)layout.findViewById(R.id.check0); 
        boxes[1] = (CheckBox)layout.findViewById(R.id.check1); 
        boxes[2] = (CheckBox)layout.findViewById(R.id.check2); 
        boxes[3] = (CheckBox)layout.findViewById(R.id.check3); 
        boxes[4] = (CheckBox)layout.findViewById(R.id.check4); 
        boxes[5] = (CheckBox)layout.findViewById(R.id.check5); 
        boxes[6] = (CheckBox)layout.findViewById(R.id.check6); 

        if(boxes[0].isChecked()) {setAlarm(1, setat);} 
        if(boxes[1].isChecked()) {setAlarm(2, setat);} 
        if(boxes[2].isChecked()) {setAlarm(3, setat);} 
        if(boxes[3].isChecked()) {setAlarm(4, setat);} 
        if(boxes[4].isChecked()) {setAlarm(5, setat);} 
        if(boxes[5].isChecked()) {setAlarm(6, setat);} 
        if(boxes[6].isChecked()) {setAlarm(7, setat);} 

        Toast.makeText(Home.this, "Alarm has been set!", Toast.LENGTH_SHORT).show(); 
        dialog.dismiss(); 
       } 
      }); 

      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dialog.show(); 
     } 
    }); 
} 

public void declarari(){ 
    for(int i=1;i<=10;i++){ 
     String mID = "m" + i; 
     String nrID = "nr" + i; 
     String nameID = "name" + i; 
     String plusID = "plus" + i; 
     String minusID = "minus" + i; 
     String infoID = "info" + i; 
     int resID = getResources().getIdentifier(mID, "id", getPackageName()); 
     int resNrID = getResources().getIdentifier(nrID, "id", getPackageName()); 
     int resNameID = getResources().getIdentifier(nameID, "id", getPackageName()); 
     int resPlusID = getResources().getIdentifier(plusID, "id", getPackageName()); 
     int resMinusID = getResources().getIdentifier(minusID, "id", getPackageName()); 
     int resInfoID = getResources().getIdentifier(infoID, "id", getPackageName()); 
     med[i] = ((LinearLayout)findViewById(resID)); 
     nr[i] = ((TextView)findViewById(resNrID)); 
     name[i] = ((TextView)findViewById(resNameID)); 
     plus[i] = ((TextView)findViewById(resPlusID)); 
     plus[i].setOnClickListener(this); 
     minus[i] = ((TextView)findViewById(resMinusID)); 
     minus[i].setOnClickListener(this); 
     info[i] = ((TextView)findViewById(resInfoID)); 
     info[i].setOnClickListener(this); 
    } 
} 

public void afisare(){ 
    SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor edit = valoriSalvate.edit(); 

    int total = valoriSalvate.getInt("total", 0); 
    for(int i=1;i<=total;i++){ 
     med[i].setVisibility(View.VISIBLE); 
     String keyNume = "nume" + i; 
     name[i].setText(valoriSalvate.getString(keyNume, null)); 
     String keyNr = "nr" + i; 
     nr[i].setText(String.valueOf(valoriSalvate.getInt(keyNr, 0))); 
    } 

    edit.commit(); 
} 

public void setari(){ 
    findViewById(R.id.setari).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent setari = new Intent(Home.this, setari.class); 
      startActivity(setari); 
     } 
    }); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 
    addMedNou(); 
    setari(); 
    declarari(); 
    afisare(); 
} 

@Override 
public void onClick(View v){ 
    int actual; 

    SharedPreferences valoriSalvate = getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor edit = valoriSalvate.edit(); 

    AlertDialog.Builder builder = new AlertDialog.Builder(Home.this); 
    View info = getLayoutInflater().inflate(R.layout.infoo, null); 
    builder.setView(info); 
    AlertDialog dialog = builder.create(); 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

    TextView title = (TextView)info.findViewById(R.id.title); 
    TextView pastile = (TextView)info.findViewById(R.id.pastile); 
    TextView date = (TextView)info.findViewById(R.id.date); 
    TextView comentariu = (TextView)info.findViewById(R.id.comentariu); 

관심을 가져 주셔서 감사 드리며 조금만 도와 주시면 감사하겠습니다. 좋은 하루 되세요!

+0

CountDownTimer를 사용하면 도움이 될 수 있습니다. ANS를 게시 할 수 있는지 알려주세요. https://developer.android.com/reference/android/os/CountDownTimer.html – Hamza

+0

댓글을 주셔서 감사합니다. 내 사건에는 효과가 없을거야. 왜냐하면 카운트 다운 타이머에는 항상 정확한 알람이 필요해. –

답변

0

이 코드에는 문제가 있습니다. 먼저 여러 개의 알람을 설정한다고 가정 해 보겠습니다. 여러 개의 알람을 설정하려면 각 PendingIntent이 고유해야합니다. 이 작업을 수행하여 알람

Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    Calendar.getInstance().get(Calendar.MILLISECOND), intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 

모든 당신이 Calendar.MILLISECOND 필드를 사용하는을위한 requestId 매개 변수 (2 인자)를 제외하고 PendingIntent에 동일한 매개 변수를 사용합니다. 이것은 고유하지 않습니다입니다. Calendar.MILLISECOND밀리 초를 나타내는 0에서 999 사이의 숫자를 특정 타임 스탬프의 두 번째 숫자 인에 제공합니다. 고유 한 것이 보장되지는 않습니다. 그것은있을 수도 그렇지 않을 수도 있습니다.


PendingIntent을 저장하면 알람을 취소 할 수 있습니다. 실제로 PendingIntent을 저장할 필요가 없습니다. 알람을 취소하려면 PendingIntent을 다시 만들 수 있습니다. 처음에 알람을 설정할 때했던 것과 똑같이하십시오. 이처럼 :

Intent intent = new Intent(getApplicationContext(), NotificationService.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    Calendar.getInstance().get(Calendar.MILLISECOND), intent, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
// Cancel the alarm 
AlarmManager alarmManager = (AlarmManager)getApplicationContext() 
           .getSystemService(ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 
// Now cancel the PendingIntent also (just to be sure) 
pendingIntent.cancel(); 

여기에서의 트릭 PendingIntent.getBroadcast() 호출에 requestId (2 인자)를 사용하면 알람을 설정할 때 정확히 사용 RequestID가 일치해야한다는 것입니다. 그래서 당신은 그것을 저장해야합니다. 시간의 밀리 초 부분은 고유하지 않으므로 requestId으로 사용할 더 우수한 고유 번호를 찾아야합니다. 매일 알람을 하나만 설정하는 경우 과 같은 요일 번호 (예 : Calendar.DAY_OF_WEEK)를 사용하거나 다른 고유 한 ID를 사용할 수 있습니다. 알람을 설정하고 취소 할 때 같은 값을 사용하십시오.