I'm new to Android programming....Please anyone explain me in detail...

I don't know some code i'll explain list of things....

1. what is this "spin.setOnItemSelectedListener(this); " ? (I understood that this line will call the AdapterView.OnItemSelectedListener when selecting any country from country strings ) is this right ?
2. What is ArrayAdapter and AdapterView ?
3.AdapterView<?> arg0, View arg1, int position,long id ( please explain it one by one... what is AdapterView<?> arg0 ? , what is View arg1 ? and position,id ? why should i construct onItemSelectedListener with these things) ?
4. what is this <?> ?
5.Shall i change parent instead of arg0 and view instead of arg1 ?

package com.example.spinner;  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ArrayAdapter;  
import android.widget.Spinner;  
import android.widget.TextView;  
import android.widget.Toast;  
public class MainActivity extends Activity implements  
AdapterView.OnItemSelectedListener {  
    String[] country = { "India", "USA", "China", "Japan", "Other",  };  
    protected void onCreate(Bundle savedInstanceState) {  
        //Getting the instance of Spinner and applying OnItemSelectedListener on it  
        Spinner spin = (Spinner) findViewById(R.id.spinner1);  
        //Creating the ArrayAdapter instance having the country list  
        ArrayAdapter aa = new ArrayAdapter(this,android.R.layout.simple_spinner_item,country);  
        //Setting the ArrayAdapter data on the Spinner  
    //Performing action onItemSelected and onNothing selected  
    public void onItemSelected(AdapterView arg0, View arg1, int position,long id) {  
        Toast.makeText(getApplicationContext(),country[position] ,Toast.LENGTH_LONG).show();  
    public void onNothingSelected(AdapterView arg0) {  
        // TODO Auto-generated method stub  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.activity_main, menu);  
        return true;  

Please anyone explain this program in detailed