Mehrere alarmmanager canceln und setzten!

  • 2 Antworten
  • Letztes Antwortdatum
N

newperson

Neues Mitglied
1
Hallo :)
Auf der MainActivity befindet sich eine ListView und eine Button(Set_Alarm).
Mit dem Button(Set_Alarm) komme ich zu der zweiten Activity(DetailsActivty). Auf dieser Activity wird der Alarm gesetzt und danach komme ich wieder auf die MainActivity zurück.
Mit dem setOnItemClickListener komme ich zu der dritten Activity(DeleteActivty). Auf dieser Activity soll der Alarm wieder gelöscht werden, aber nur der eine und nicht die ganze ListView.
Leider kann ich nur bis jetzt die Alarme setzten, aber das Löschen will einfach nicht funktionieren. Ich habe schon beim
PendingIntent.getBroadcast die ID gesetzt, aber es funktioniert einfach nicht. Ich habe keine Ahnung was ich hier falsch mache. Ich hoffe IHR könnt mir HELFEN. :)

der Code:

AlarmReceiver:
Code:
public class AlarmReceiver extends BroadcastReceiver{
    
    static AlarmManager alarmManager;
    PendingIntent pendingIntent;
    Model model = new Model();
    final int _id = (int) System.currentTimeMillis();
    int rowId;

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

        model.id = _id;

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Alarm!!!!!")
                .setTicker(null).setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

        Intent notificationIntent = new Intent(context, MainActivity.class);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT
                        | PendingIntent.FLAG_ONE_SHOT);

        mBuilder.setContentIntent(contentIntent);
        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder.build());
    }

    //setAlarm
    public void SetAlarm(Context context, String sDate, String sTime)
    {
        Intent myIntent = new Intent(context, AlarmReceiver.class);
        myIntent.putExtra("row_id", rowId);
       
        pendingIntent = PendingIntent.getBroadcast(context, _id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        model.id = _id;
        model.date = sDate;
        model.time = sTime;

        String noticeDate = sDate;
        String noticeTime = sTime;

        Calendar calendar = Calendar.getInstance();
        calendar.set(Integer.parseInt(noticeDate.split("-")[0]),
                Integer.parseInt(model.date.split("-")[1]) - 1,
                Integer.parseInt(model.date.split("-")[2]),
                Integer.parseInt(model.time.split(":")[0]),
                Integer.parseInt(model.time.split(":")[1]));

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

    // CancelAlarm
    public void CancelAlarm(Context context) {
        Intent myIntent = new Intent(context, AlarmReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(context, _id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();
    }
}


DetailsActivity nur ein Teil davon:
Code:
private AlarmReceiver alarm;

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

        alarm = new AlarmReceiver();
}

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnSave:
                Model model = new Model();
                Context context = this.getApplicationContext();


                    if(!TextUtils.isEmpty(btnDate.getText().toString()) || !TextUtils.isEmpty(btnTime.getText().toString())){
                        model.date = btnDate.getText().toString();
                        model.time = btnTime.getText().toString();
                        myAdapter.insertRow(model.date, model.time);
                    }

                //Alarm setzten!!!!!
                alarm.SetAlarm(context, btnDate.getText().toString(), btnTime.getText().toString());

                Intent intent = new Intent(this, MainActivity.class);
                startActivity(intent);
                finish();
                break;
            case  R.id.btnDatum:
                showDialog(DATE_DIALOG_ID);
                break;
            case  R.id.btnUhrzeit:
                showDialog(TIME_DIALOG_ID);
                break;
        }
    }


DeleteAcitvity auch nur ein Teil davon:
Code:
private AlarmReceiver alarm;

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

        alarm = new AlarmReceiver();
}

@Override
    public void onClick(View v) {
        switch (v.getId()) {       
            case R.id.btnDelete_modify:
                Context context = this.getApplicationContext();
                alarm.CancelAlarm(context);
                myDbAdapter.deleteOneRecord(rowId);       
                Log.v(TAG, "gelöscht");
                Intent intent1 = new Intent(this, MainActivity.class);
                startActivity(intent1);
                finish();
                break;
        }

    }
 
Soweit ich weiß müssen die ids übereinstimmen, wenn du einen Alarm canceln willst.
Da du aber in jeder Activity eine eigene Instanz der AlarmReceiver Klasse erzeugst sind auch die ids verschieden.
Eine Möglichkeit wäre es, die Position in der ListView an die Activities zu übergeben und diese als id zu verwenden.

MfG Niko
 
ok danke :)
aber wie setzte ich das bitte um? Ich hab auf der MainActivity einen Set_Alarm-Button der die DetaislAcitivity öffnet. Wie bekomme ich dann genau diese Id dann auf die DeleteAcivity.
Bei der ListView hab ich beim onItemClick :
Bundle data = new Bundle();
Cursor listCursor = (Cursor) arg0.getItemAtPosition(position);
int nameId = listCursor.getInt(listCursor
.getColumnIndex(myDbHelper.KEY_ROWID));
data.putInt("keyid", nameId);
Intent dIntent = new Intent(MainActivity.this,
DeleteActivity.class);
dIntent.putExtras(data);
startActivity(dIntent);

auf der DeleteAcivity habe ich dann bei onCreate:
Bundle showData = getIntent().getExtras();
rowId = showData.getInt("keyid");
myDbAdapter = new DBAdapter(this);
c = myDbAdapter.queryAll(rowId);

das habe ich für die Datenbank gemacht. Kann ich irgendwie diese auch direkt auch für den AlarmManager verwendet?
 
Zurück
Oben Unten