I know how to pass object using Parcelable or Serializable but I found other approach on the internet to do it - using Application class like this:
class ComplexObject {
    // contain String, int, List<String>, other objects ...
}
class App extends Application {
    Map<String, Object> map = new HashMap<>();
    public void put(String key, Object value) {
        map.put(key, value);
    }
    public <T> T get(String key, Class<T> cls) {
        return cls.cast(map.get(key));
    }
    public void remove(String key) {
        map.remove(key);
    }
}
class ActivityA extends AppCompatActivity {
    void start(ComplexObject obj) {
        Intent intent = new Intent(this, ActivityB.class);
        ((App) getApplicationContext()).put("obj", obj);
        startActivity(intent);
    }
}
class ActivityB extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        App app = ((App) getApplicationContext());
        ComplexObject obj = app.get("obj", ComplexObject.class);
        app.remove("obj");
    }
}
Is this impact performance of app?
 
     
    