Sei que minha resposta está atrasada e provavelmente você ja resolveu o problema, mas deixo para quem pesquisar sobre o problema e cair aqui:
na MainActivity:
em vez de
Cliente[] clientes = new Cliente[15];
utilize:
ArrayList<Cliente> clientes = new ArrayList<>();
considerando que a substituição acima foi feita:
em vez de
if (clientes[0] == null)
utilize:
if clientes.isEmpty(); // => Se clientes estiver vazio
caso PRECISE que seja no máximo 15:
em vez de:
else if (clientes[14] != null)
utilize:
if(clientes.size == 15) // => se a quantidade de itens em clientes for igual a 15
para enviar o ArrayList:
Intent intent = new Intent(MainActivity.this, Activity1.class);
//considerando que estas variáveis do 2º parâmetro existem na sua MainActivity
intent.putExtra("nome", name;
intent.putExtra("age", age);
intent.putExtra("arrayClientes", clientes); //este é o ArrayList criado
startActivity(intent);
na Activity1:
crie o mesmo tipo de objeto:
ArrayList<Cliente> clientes = new ArrayList<>();
dentro do método onCreate() adicione:
Intent intent = getIntent();
// Em vez de getStringExtra ou getIntExtra, utilize: (casting) getSerializableExtra
name = (String) intent.getSerializableExta("nome");
age = (int) intent.getSerializableExtra("age");
clientes = (ArrayList<Cliente>) intent.getSerializableExtra("arrayClientes");
Veja mais sobre ArrayList<>:
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
Veja mais sobre Intent:
https://developer.android.com/reference/android/content/Intent
Veja mais sobre Casting:
https://www.w3schools.com/java/java_type_casting.asp