Autore Topic: AlarmManager.cancel non funziona....  (Letto 712 volte)

Offline theKuston

  • Nuovo arrivato
  • *
  • Post: 48
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Play Store ID:
    K-soft
  • Sistema operativo:
    windows 8.1, Ubuntu 14
AlarmManager.cancel non funziona....
« il: 06 Settembre 2014, 21:47:33 CEST »
0
weeee!!
allora io sto creato un'app sveglia... una volta impostata un'alarm, so che per eliminarlo devo fare cancel... ma non funziona... l'alarm suona comunque...
ecco la mia Activity:
Codice (Java): [Seleziona]
public class AlarmsActivity extends ActionBarActivity {
    AlarmManager alarmManager;
    Intent intent;
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        setContentView(R.layout.activity_alarms);
        setImmersive();
        ImageView newAlarm = (ImageView) findViewById(R.id.imageView);
        getActionBar().hide();
        newAlarm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createDialog();
            }
        });
        Button cancel = (Button) findViewById(R.id.button);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deleteDialog();
            }
        });
    }
    private void createDialog(){
        final AlertDialog.Builder customDialog = new AlertDialog.Builder(this);
        View customView = getLayoutInflater().inflate(R.layout.custom_dialog,null);
        final TimePicker tp = (TimePicker) customView.findViewById(R.id.timePicker);
        final DatePicker dp = (DatePicker) customView.findViewById(R.id.datePicker);
        customDialog.setPositiveButton("ok", new DialogInterface.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Calendar calset = Calendar.getInstance();
                calset.set(Calendar.YEAR, dp.getYear());
                Log.d("month", dp.getMonth() + "");
                switch (dp.getMonth()) {
                    case 0:
                        calset.set(Calendar.MONTH, Calendar.JANUARY);
                        break;
                    case 1:
                        calset.set(Calendar.MONTH, Calendar.FEBRUARY);
                        break;
                    case 2:
                        calset.set(Calendar.MONTH, Calendar.MARCH);
                        break;
                    case 3:
                        calset.set(Calendar.MONTH, Calendar.APRIL);
                        break;
                    case 4:
                        calset.set(Calendar.MONTH, Calendar.MAY);
                        break;
                    case 5:
                        calset.set(Calendar.MONTH, Calendar.JUNE);
                        break;
                    case 6:
                        calset.set(Calendar.MONTH, Calendar.JULY);
                        break;
                    case 7:
                        calset.set(Calendar.MONTH, Calendar.AUGUST);
                        break;
                    case 8:
                        calset.set(Calendar.MONTH, Calendar.SEPTEMBER);
                        break;
                    case 9:
                        calset.set(Calendar.MONTH, Calendar.OCTOBER);
                        break;
                    case 10:
                        calset.set(Calendar.MONTH, Calendar.NOVEMBER);
                        break;
                    case 11:
                        calset.set(Calendar.MONTH, Calendar.DECEMBER);
                        break;
                }
                calset.set(Calendar.DAY_OF_MONTH, dp.getDayOfMonth());
                calset.set(Calendar.HOUR_OF_DAY, tp.getCurrentHour());
                calset.set(Calendar.MINUTE, tp.getCurrentMinute());
                calset.set(Calendar.SECOND, 0);
                calset.set(Calendar.MILLISECOND, 0);
                setAlarm(calset);
                setImmersive();
            }

        });
        customDialog.setView(customView);
        customDialog.show();
        }
    private void deleteDialog(){
        final AlertDialog.Builder customDialog = new AlertDialog.Builder(this);
        View customView = getLayoutInflater().inflate(R.layout.custom_dialog,null);
        final TimePicker tp = (TimePicker) customView.findViewById(R.id.timePicker);
        final DatePicker dp = (DatePicker) customView.findViewById(R.id.datePicker);
        customDialog.setPositiveButton("ok",new DialogInterface.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Calendar calset = Calendar.getInstance();
                calset.set(Calendar.YEAR,dp.getYear());
                Log.d("month",dp.getMonth()+"");
                switch (dp.getMonth()){
                    case 0:
                        calset.set(Calendar.MONTH,Calendar.JANUARY);
                        break;
                    case 1:
                        calset.set(Calendar.MONTH,Calendar.FEBRUARY);
                        break;
                    case 2:
                        calset.set(Calendar.MONTH,Calendar.MARCH);
                        break;
                    case 3:
                        calset.set(Calendar.MONTH,Calendar.APRIL);
                        break;
                    case 4:
                        calset.set(Calendar.MONTH,Calendar.MAY);
                        break;
                    case 5:
                        calset.set(Calendar.MONTH,Calendar.JUNE);
                        break;
                    case 6:
                        calset.set(Calendar.MONTH,Calendar.JULY);
                        break;
                    case 7:
                        calset.set(Calendar.MONTH,Calendar.AUGUST);
                        break;
                    case 8:
                        calset.set(Calendar.MONTH,Calendar.SEPTEMBER);
                        break;
                    case 9:
                        calset.set(Calendar.MONTH,Calendar.OCTOBER);
                        break;
                    case 10:
                        calset.set(Calendar.MONTH,Calendar.NOVEMBER);
                        break;
                    case 11:
                        calset.set(Calendar.MONTH,Calendar.DECEMBER);
                        break;
                }
                calset.set(Calendar.DAY_OF_MONTH,dp.getDayOfMonth());
                calset.set(Calendar.HOUR_OF_DAY,tp.getCurrentHour());
                calset.set(Calendar.MINUTE,tp.getCurrentMinute());
                calset.set(Calendar.SECOND,0);
                calset.set(Calendar.MILLISECOND,0);
                deleteAlarm(calset);
                setImmersive();
            }

        });
        customDialog.setView(customView);
        customDialog.show();
    }
    private void setAlarm(Calendar targetCal){
        intent = new Intent(getBaseContext(), BroadcastReceiver.class);
        SharedPreferences indexOfAlarm = getSharedPreferences("indexOfAlarm",0);
        int i = indexOfAlarm.getInt("i",0);
        PendingIntent pendingIntent =  PendingIntent.getBroadcast(getBaseContext(),i,intent,0);

        alarmManager.set(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(),pendingIntent);
        i++;
        SharedPreferences.Editor editor = indexOfAlarm.edit();
        editor.putInt("i",i);
        editor.putInt(targetCal.getTimeInMillis()+"",i);
        editor.putString("targetCal",targetCal.getTimeInMillis()+"");
        Log.d("i",i+"");
        editor.commit();
        makeCustomToast("alarm setted !");
        }
    private void makeCustomToast(String text){
        Toast toast = new Toast(this);
        View toastView = getLayoutInflater().inflate(R.layout.custom_toast,null);
        toast.setView(toastView);
        TextView textView = (TextView) toastView.findViewById(R.id.textView);
        ImageView imageView = (ImageView) toastView.findViewById(R.id.imageView);
        imageView.setImageResource(R.drawable.ic_alarm_setted);
        textView.setText(text);
        toast.show();
    }
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void setImmersive(){
        if (Build.VERSION.SDK_INT <16){
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);

        }else if(Build.VERSION.SDK_INT >16 && Build.VERSION.SDK_INT <19) {
            View v = getWindow().getDecorView();
            v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN);
        }else{
            View v = getWindow().getDecorView();
            v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY );
        }
    }
    private void deleteAlarm(Calendar targetCal){
        SharedPreferences indexOfAlarm = getSharedPreferences("indexOfAlarm",0);
        int alarmToDelete = indexOfAlarm.getInt(targetCal.getTimeInMillis()+"",0);
        Log.d("alarmToDelete",alarmToDelete+"");
        //PendingIntent pendingIntent =
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(),alarmToDelete,intent,0);
        alarmManager.cancel( pendingIntent );

    }
}
In pratica:
io creo una variabile nelle SharedPreferences(i) che serve per poter avere piu allarmi contemporaneamente...
poi alla pressione del tasto cancel si richiama il metodo deleteAlarm() che prende la variabile i precedentemente creata appartire dall'orario... cioe l'utente seleziona l'orario della sveglia che vuole eliminare e tramite questo si risale alla variabile i, e si procede a fare l'alarmManager.cancel()... ma non funziona... non capisco... ho anche fatto un log per vedere se la i del setAlarm() e il alarmToDelete(l'equivalente nel metodo deleteAlarm()) sono uguali... ed effettivamente lo sono...
Tutte le mie applicazioni sul play store:
https://play.google.com/store/apps/developer?id=K-soft

Offline tonno16

  • Utente storico
  • *****
  • Post: 1232
  • Respect: +60
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:AlarmManager.cancel non funziona....
« Risposta #1 il: 07 Settembre 2014, 01:17:02 CEST »
0
Quando hai tutto quel casino ti consiglio di mettere due button e creare un alarmmanager temporanea di 10 secondi e poi stopparla con uno dei due pulsanti. Quando effettivamente hai visto che funziona integri nel tuo programma.