2017-12-26 10 views
1

ich dieses seltsame Problem habe, wo die intent.getParcelableExtra() funktioniert gut auf API 23 aber nicht auf API 25, es kehrt NULL.intent.getParcelableExtra() auf API arbeiten 23 aber nicht auf API 25

Hier ist, wie ich das Problem mit weniger Code reproduziert:

User-Klasse als Beispiel:

public class User implements Parcelable { 
    private String name; 
    private int age; 

    public User(String name, int age) { 
     this.name = name; 
     this.age =age; 
    } 

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

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeString(name); 
     out.writeInt(age); 
    } 

    public User(Parcel in) { 
     this.name = in.readString(); 
     this.age = in.readInt(); 
    } 

    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 
     @Override 
     public User createFromParcel(Parcel source) { 
      return new User(source); 
     } 

     @Override 
     public User[] newArray(int size) { 
      return new User[size]; 
     } 
    }; 
} 

MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     /*setting view*/ 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(this, AlarmReceiver.class); 
     User user = new User("test", 25); 
     intent.putExtra("user", user); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3000, pendingIntent); 

    } 
} 

Und der Empfänger:

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     android.os.Debug.waitForDebugger(); 
     User user = intent.getParcelableExtra("user"); 
    } 
} 

Ich bin Verwenden des Debuggers zum Stoppen der Ausführung und Auswerten des Objekts des Benutzers im Empfänger.

Wenn der Emulator Android 6.0 API-Ebene 23 mit: der Benutzer korrekt übergeben wird, aber wenn mein Handy Android 7.1.2 API-Ebene 25 mit: der Benutzer NULL

Jede Hilfe sehr geschätzt wird.

+1

https://commonsware.com/blog/2016/07/22/be-careful-where-you-use-custom-parcelables.html – CommonsWare

Antwort

0

Dank CommonsWare konnte ich das Problem verstehen. Es scheint mit Android zu tun zu haben und wir können nichts dagegen tun, außer Workarounds zu verwenden.

Für diejenigen, die noch verwenden Parcel wollen, verwenden: How to marshall and unmarshall a Parcelable to a byte array with help of Parcel?

Für mich ich das Objekt gespeichert Ich in eine Datei übergeben möchten (mit json), dann legte ich den Namen der Datei als ein String an die AlarmManager, dann lesen Sie die Datei im Empfänger.

+0

Bitte akzeptieren Sie diese Antwort. Es wird anderen helfen und diese Frage aus der Liste der unbeantworteten Fragen entfernen. –

Verwandte Themen