Q: How is the information passed here using intents From my Sudoku.java I make call to Game.java and pass the difficulty level along with.
private void startGame(int i) {
 Log.d(TAG, "clicked on " + i);
 Intent intent = new Intent(Sudoku.this, Game.class);
 intent.putExtra(Game.KEY_DIFFICULTY, i);
 startActivity(intent);
}

Here's part of my Game.java
public class Game extends Activity {
 private static final String TAG = "Sudoku" ;
 public static final String KEY_DIFFICULTY = "org.example.sudoku.difficulty" ;//What is this?
 public static final int DIFFICULTY_EASY = 0;
 public static final int DIFFICULTY_MEDIUM = 1;
 public static final int DIFFICULTY_HARD = 2;
 private int puzzle[] = new int[9 * 9];
 private PuzzleView puzzleView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.d(TAG, "onCreate" );
  int diff = getIntent().getIntExtra(KEY_DIFFICULTY,DIFFICULTY_EASY); //What is this?
  puzzle = getPuzzle(diff);
  calculateUsedTiles();
  puzzleView = new PuzzleView(this);
  setContentView(puzzleView);
  puzzleView.requestFocus();
 }
}

My question is what is happening in line 
public static final String KEY_DIFFICULTY = "org.example.sudoku.difficulty" ;

KEY_DIFFICULTY is final, how will i ever change it.
Also, while fetching the extra data info from intent, how is it storing it?

A: the value of this public static final String KEY_DIFFICULTY = "org.example.sudoku.difficulty" ; is not changing but imagine intent has a bucket(a hashmap) and  KEY_DIFFICULTY is a key in it
You are storing a value against that key and getting it back via intent. You never change the key it self as it is final. 
Even if you remove final it will work but you must retrieve the value with the same key you set it with.
So  KEY_DIFFICULTY never changes but the value against it in extras bundle is set and retrieved.  

A: 
public static final String KEY_DIFFICULTY =
  "org.example.sudoku.difficulty" ;//What is this?

=> First of all, Intent stores data in a key-value pairs, same like HashMap. So whatever data you would want to store/fetch into/from it, you have to have KEY name.
Now as you have already made KEY_DIFFICULTY as static final, you won't be able to change it as it becomes constant.

A: Key is used to get the extra data so it should not be changed. And an intent can contain or storing datas via a Bundle. And for more clarification please look at Android Intents.
Cheers
