I have an android app with three activities A, B, and C. B starts with a necessary intent form A and from B I can startActivity C. But when I use the back button on the action bar to go back from C to B, the app crashes because B received no intent. How to solve this.
Code for Activity B, getting intent from Activity A. It is important to have this intent for the activity B to function.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parking_spot);
getSupportActionBar().hide();
spot = getIntent().getParcelableExtra("spot");
init();
}
private void init() {
days = findViewById(R.id.spot_days);
rate = findViewById(R.id.spot_rate);
timing = findViewById(R.id.spot_timing);
name = findViewById(R.id.spot_name);
address = findViewById(R.id.spot_address);
spots = findViewById(R.id.spot_spots);
// This is where null pointer exception is thrown on accessing spot variable
name.setText(spot.getName());
address.setText(spot.getAddress());
timing.setText(spot.getTiming());
String temp = getResources().getString(R.string.rs) + " " + spot.getRate() + "/HR";
rate.setText(temp);
temp = spot.getDays();
for (int i = 0; i < temp.length(); i++) {
if (temp.charAt(i) == 'T') {
setDay(i);
}
}
FirebaseDatabase.getInstance().getReference(spot.getPath()).child("spots").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
long total = dataSnapshot.getChildrenCount(), free = 0;
for (DataSnapshot shot : dataSnapshot.getChildren()) {
Log.v("Spot", shot.child("status").getValue(Integer.class) + "");
if (shot.child("status").getValue(Integer.class) == 0) {
free++;
}
}
String temp = free + "/" + total;
spots.setText(temp);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
findViewById(R.id.navigate_spot).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri gmmIntentUri = Uri.parse("google.navigation:q=" + spot);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
startActivity(mapIntent);
}
}
});
findViewById(R.id.book_now).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ParkingSpotActivity.this, BookingActivity.class);
intent.putExtra("spot", spot);
startActivity(intent);
}
});
setupSlider();
}
Going to C from B
confirm.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), CheckoutActivity.class);
intent.putExtra("spot", parkingSpot);
intent.putExtra("pos", pos);
startActivity(intent);
});
Now app has opened activity C. Clicking on the back arrow icon in Activity B to C leads to an error as B loses its intent data
Erro from debugger when i press back button
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mobile.solutions.parking, PID: 26598
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobile.solutions.parking/com.mobile.solutions.parking.activity.ParkingSpotActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.mobile.solutions.parking.model.ParkingSpot.getName()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3374)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3513)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2109)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.mobile.solutions.parking.model.ParkingSpot.getName()' on a null object reference
at com.mobile.solutions.parking.activity.ParkingSpotActivity.init(ParkingSpotActivity.java:59)
at com.mobile.solutions.parking.activity.ParkingSpotActivity.onCreate(ParkingSpotActivity.java:47)
at android.app.Activity.performCreate(Activity.java:7815)
at android.app.Activity.performCreate(Activity.java:7804)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3349)
The only point is that B to C works fine but not vice versa. This I think is because B doesn't retain its intent data