2013-10-07 3 views
0

Я новичок в Java, не говоря уже о разработке Android. У меня нет кодирования, но я подумал, что начну с чего-то «простого», как будильник. Итак, теперь я пишу будильник, и я хочу обновить аварийные сигналы, чтобы они неактивны, если они не повторяются после их выхода. Когда я передаю подробный AlarmClass (мой объект тревоги) на экран набора предупреждений с намерением, он проходит отлично. Когда я передаю тот же AlarmClass с намерением и поместил его в PendingIntent в диспетчере аварийных сигналов, а затем попытаюсь получить его с экрана, где вы можете отключить будильник, объект AlarmClass, который я вызываю и заполняю точно так же путь всегда равен нулю.getParcelableExtra всегда null в ожидании намерения, но не намерение

Вот мой класс тревоги:

package com.example.wakeme; 

import java.util.Calendar; 

import android.os.Parcel; 
import android.os.Parcelable; 

public class AlarmClass implements Parcelable{ 
    Calendar cal = Calendar.getInstance(); 
    private long id = 1; 
    private int active = 1; 
    private long time = cal.getTimeInMillis(); 
    private int repeating = 0; 
    private int skipweekends = 0; 
    private int skipweekdays = 0; 
    private int alarmnumber = -1; 


    public long getId(){ 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public int getActive(){ 
     return active; 
    } 

    public void setActive(int active) { 
     this.active = active; 
    } 

    public int getRepeating(){ 
     return repeating; 
    } 

    public void setRepeating(int repeating){ 
     this.repeating = repeating; 
    } 

    public void setTime(long time){ 
     this.time = time; 
    } 

    public long getTime(){ 
     return time; 
    } 

    public int getSkipWeekends(){ 
     return skipweekends; 
    } 

    public void setSkipWeekends(int skipweekends){ 
     this.skipweekends = skipweekends; 
    } 

    public int getSkipWeekdays(){ 
     return skipweekdays; 
    } 

    public void setSkipWeekdays(int skipweekdays){ 
     this.skipweekdays = skipweekdays; 
    } 

    public void setAlarmNumber(int alarmnumber){ 
     this.alarmnumber = alarmnumber; 
    } 

    public int getAlarmNumber(){ 
     return alarmnumber; 
    } 

    @Override 
    public int describeContents(){ 
     return 0; 
    } 

    private AlarmClass(Parcel in){ 
     this.id = in.readLong(); 
     this.active = in.readInt(); 
     this.repeating = in.readInt(); 
     this.skipweekdays = in.readInt(); 
     this.skipweekends = in.readInt(); 
     this.time = in.readLong(); 
     this.alarmnumber = in.readInt(); 
    } 

    AlarmClass() { 
     return; 
    } 

    public void writeToParcel(Parcel out, int flags) { 
     out.writeLong(this.id); 
     out.writeInt(this.active); 
     out.writeInt(this.repeating); 
     out.writeInt(this.skipweekdays); 
     out.writeInt(this.skipweekends); 
     out.writeLong(this.time); 
     out.writeInt(this.alarmnumber); 
    } 

    public static final Parcelable.Creator<AlarmClass> CREATOR = new Parcelable.Creator<AlarmClass>(){ 
     public AlarmClass createFromParcel(Parcel in){ 
      return new AlarmClass(in); 
     } 
     public AlarmClass[] newArray(int size) { 
      return new AlarmClass[size]; 
     } 
    }; 

Отсюда, я могу передать свой объект в инкубатор сигнализации, чтобы обновить его просто отлично:

public void startSet(View view){ 
     Intent set = new Intent(this, SetAlarm.class); 
     set.putExtra("alarm", new AlarmClass()); 
     startActivity(set); 
    } 

И я получаю на мое время инкубационного права здесь просто отлично. Это ненулевым:

public class SetAlarm extends MainActivity { 
    AlarmClass passAlarm = new AlarmClass(); 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.alarm_set); 
     setAlarmSetListener(); 
     setDeleteListener(); 
     passAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm"); 
     if(passAlarm.getAlarmNumber() != -1){ 
      TimePicker picker = (TimePicker) findViewById(R.id.timePicker1); 
      Calendar passedTime = Calendar.getInstance(); 
      passedTime.setTimeInMillis(passAlarm.getTime()); 
      picker.setCurrentHour(passedTime.get(Calendar.HOUR_OF_DAY)); 
      picker.setCurrentMinute(passedTime.get(Calendar.MINUTE)); 
      String ampm = (passedTime.get(Calendar.HOUR_OF_DAY) > 12 ? "pm" : "am"); 
      String message = "Passed Time is: " + (passedTime.get((Calendar.HOUR_OF_DAY)%12)!=0?(passedTime.get(Calendar.HOUR_OF_DAY)%12):12) + ":" + passedTime.get(Calendar.MINUTE) + " " + ampm; 
      Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
     // Do Nothing 
     } 

    } 

Но при отправке через PendingIntent, как так:

private void newAlarm(AlarmClass alarmclass){ 
     Intent intent = new Intent(getBaseContext(), Alarm.class); 
     intent.putExtra("alarm", alarmclass); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(alarmclass.getTime()); 
     AlarmsDataSource alarm = new AlarmsDataSource(this); 
     alarm.open(); 
     AlarmClass alarmObject = new AlarmClass(); 
     alarmObject = alarm.createAlarm(true, cal.getTimeInMillis(), false, false, false); 
     PendingIntent torpedo = PendingIntent.getBroadcast(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager goOff = (AlarmManager) getSystemService(ALARM_SERVICE); 
     goOff.set(AlarmManager.RTC_WAKEUP, alarmObject.getTime() ,torpedo); 
     Toast.makeText(getApplicationContext(), "Alarm Number " + alarmObject.getAlarmNumber(), Toast.LENGTH_LONG).show(); 
     alarm.close(); 
    } 

И получил таким же образом на активность тревоги, как так:

public class Boom extends MainActivity{ 
AlarmClass boomAlarm = new AlarmClass(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      final Window wake = getWindow(); 
      wake.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
      setContentView(R.layout.boom); 
      setTheme(R.style.AlarmStyle); 
      overridePendingTransition(android.R.anim.fade_in,5000); 
      boomAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm"); 
    //  Vibrator buzz = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
    //  buzz.vibrate(1000); 
      snoozeListener(); 
      dismissListener(); 
     } 

Переданный parcelable объект, который я перехожу в boomAlarm, всегда равен нулю.

Кто-нибудь знает, почему разумный объект будет работать в полном порядке с намерением, но выйти с нуля на другой стороне PendingIntent?

ответ

1

Оказывается, что ParcelableExtra получал упал на вещательном приемнике! Я действительно передавал его, НО, когда вещательный приемник уволил деятельность, он не повторно прикреплял дополнения; в результате чего в действии, когда он пытался получитьParcelableExtras.

+0

есть ли решение для этого – 5er

+0

, что это за решение ??? – CodeCody

0

EDIT: Я думаю, ваша проблема в этой строке:

PendingIntent torpedo = PendingIntent.getBroadcast(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT); 

Вы не начинать деятельность здесь, но Broadcast попытаться изменить его следующим образом:

PendingIntent torpedo = PendingIntent.getActivity(this,alarmObject.getAlarmNumber(),intent,PendingIntent.FLAG_UPDATE_CURRENT); 

Изменение PendingIntent.getBroadcast() к PendingIntent.getActivity();

И попробуйте изменить следующее:

Intent intent = new Intent(getBaseContext(), Alarm.class); 

в

Intent intent = new Intent(this , Alarm.class); 

или

Intent intent = new Intent(getApplicationContext(), Alarm.class); 
+0

Просто попробовал это. Он по-прежнему пропускает объект как null. – Velogiraptor

+0

@ Velogiraptor, см. Мое редактирование! –

+0

Хорошо, я попробую, когда вернусь. Итак, вместе с вызовом getActivity мне нужно использовать «setActivity» с уникальным именем? В последний раз, когда я это делал, я не смог отменить ожидающие намерения с добавлением «.cancel()». Я очень ценю помощь. Я учусь, но хитрости все еще избегают чаще, чем хотелось бы. – Velogiraptor

3

Похоже, вы столкнулись с проблемой, аналогичной ClassNotFoundException when using custom Parcelable

Существует обходной путь описан в https://code.google.com/p/android/issues/detail?id=6822 и в ответ ClassNotFoundException when using custom Parcelable

+0

Я обязательно попробую взломать пакет, чтобы узнать, работает ли это. Для нуба, подобного мне, кажется немного более простым, чем пытаться маршировать и разоблачать себя. Благодаря! – Velogiraptor

+0

Это правильный ответ –

0

попробовать

boomAlarm = (AlarmClass) getIntent().getExtras().get("alarm"); 

вместо

boomAlarm = (AlarmClass) getIntent().getParcelableExtra("alarm"); 

, если он не работает

сделать AlarmClass расширяет Сериализуемый, а не Parceable.