Проблема: В разделе «Покупки» при запуске службы MyHostApduService вы не добавляете никаких дополнительных средств к цели, поэтому всегда получаете исключение NullPointerException.
Решение: Полагаю, из вашего кода вы хотите сначала запустить службу, когда пользователь изменяется в действии, а затем отправить пользователя в службу для обработки.
Шаг 1: Измените класс User для реализации интерфейса Parcelable.
public class User implements Parcelable {
private String userName;
private String creditCard;
private String mail;
public User() {
}
protected User(Parcel in) {
userName = in.readString();
creditCard = in.readString();
mail = in.readString();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getCreditCard() {
return creditCard;
}
public void setCreditCard(String creditCard) {
this.creditCard = creditCard;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(userName);
dest.writeString(creditCard);
dest.writeString(mail);
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
Шаг 2: Измените код в операции
user.observe(Purchase.this, new Observer<User>() {
@Override
public void onChanged(@Nullable User user) {
i.putExtra("user", user);
Purchase.this.startService(i);
}
});
Шаг 3: Измените код в сервисе.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
user = intent.getParcelableExtra("user");
if (user == null) {
// The first time this service is started, user is not change yet.
} else {
// The next time this service is started, user is changed.
Log.i("TAG", user.getCreditCard() + "");
}
return START_STICKY;
}