// ******************************************************************* //
// ** Chapter 5 Code Listings ** //
// ** Professional Android 2 Application Development ** //
// ** Reto Meier ** //
// ** (c)2010 Wrox ** //
// ******************************************************************* //
// ** Intents ***************************************************** //
// *******************************************************************
// ** Listing 5-1: Explicitly Starting an Activity
Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
startActivity(intent);
// *******************************************************************
// ** Listing 5-2: Implicitly Starting an Activity
if (somethingWeird && itDontLookGood) {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-2368"));
startActivity(intent);
}
// *******************************************************************
// ** Listing 5-3: Starting an Activity for a Result
private static final int SHOW_SUBACTIVITY = 1;
Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);
// *******************************************************************
// ** Listing 5-4: Implicitly Starting an Activity for a Result
private static final int PICK_CONTACT_SUBACTIVITY = 2;
Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
// *******************************************************************
// ** Listing 5-5: Returning results
Button okButton = (Button) findViewById(R.id.ok_button);
okButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Uri data = Uri.parse("content://horses/" + selected_horse_id);
Intent result = new Intent(null, data);
result.putExtra(IS_INPUT_CORRECT, inputCorrect);
result.putExtra(SELECTED_PISTOL, selectedPistol);
setResult(RESULT_OK, result);
finish();
}
});
Button cancelButton = (Button) findViewById(R.id.cancel_button);
cancelButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
setResult(RESULT_CANCELED, null);
finish();
}
});
// *******************************************************************
// ** Listing 5-6: Implementing an On Activity Result Handler
private static final int SHOW_SUB_ACTIVITY_ONE = 1;
private static final int SHOW_SUB_ACTIVITY_TWO = 2;
@Override
public void onActivityResult(int requestCode,
int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case (SHOW_SUB_ACTIVITY_ONE) : {
if (resultCode == Activity.RESULT_OK) {
Uri horse = data.getData();
boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
}
break;
}
case (SHOW_SUB_ACTIVITY_TWO) : {
if (resultCode == Activity.RESULT_OK) {
// TODO: Handle OK click.
}
break;
}
}
}
// *******************************************************************
// ** Listing 5-7: Registering an Activity as an Intent Receiver
// *******************************************************************
// ** Listing 5-8: Finding the Launch Intent in a Sub-Activity
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Intent intent = getIntent();
}
// *******************************************************************
// ** Listing 5-9: Passing on Intent Receiver Handling
Intent intent = getIntent();
if (isDuringBreak)
startNextMatchingActivity(intent);
// *******************************************************************
// ** Listing 5-10: Advertising Supported Activity Actions
// *******************************************************************
// ** Listing 5-11: Dynamic Menu Population from Advertised Actions
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Create the intent used to resolve which actions
// should appear in the menu.
Intent intent = new Intent();
intent.setData(MoonBaseProvider.CONTENT_URI);
intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);
// Normal menu options to let you set a group and ID
// values for the menu items you're adding.
int menuGroup = 0;
int menuItemId = 0;
int menuItemOrder = Menu.NONE;
// Provide the name of the component that's calling
// the action -- generally the current Activity.
ComponentName caller = getComponentName();
// Define intents that should be added first.
Intent[] specificIntents = null;
// The menu items created from the previous Intents
// will populate this array.
MenuItem[] outSpecificItems = null;
// Set any optional flags.
int flags = Menu.FLAG_APPEND_TO_GROUP;
// Populate the menu
menu.addIntentOptions(menuGroup,
menuItemId,
menuItemOrder,
caller,
specificIntents,
intent,
flags,
outSpecificItems);
return true;
}
// ** Linkify ***************************************************** //
// *******************************************************************
// ** Listing 5-12: Using Linkify in Code
TextView textView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
// *******************************************************************
// ** Listing 5-13: Using Linkify in XML
// *******************************************************************
// ** Listing 5-14: Creating Custom Link Strings in Linkify
int flags = Pattern.CASE_INSENSITIVE;
Pattern p = Pattern.compile("\\bquake[0-9]*\\b", flags);
Linkify.addLinks(myTextView, p,
"content://com.paad.earthquake/earthquakes/");
// *******************************************************************
// ** Listing 5-15: Using a Linkify Match Filter
class MyMatchFilter implements MatchFilter {
public boolean acceptMatch(CharSequence s, int start, int end) {
return (start == 0 || s.charAt(start-1) != '!');
}
}
// *******************************************************************
// ** Listing 5-16: Using a Linkify Transform Filter
class MyTransformFilter implements TransformFilter {
public String transformUrl(Matcher match, String url) {
return url.toLowerCase();
}
}
// ** Broadcast Intents ******************************************* //
// *******************************************************************
// ** Listing 5-17: Broadcasting an Intent
Intent intent = new Intent(NEW_LIFEFORM_DETECTED);
intent.putExtra("lifeformName", lifeformType);
intent.putExtra("longitude", currentLongitude);
intent.putExtra("latitude", currentLatitude);
sendBroadcast(intent);
// *******************************************************************
// ** Listing 5-18: Broadcast Receiver Skeleton Implementation
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO: React to the Intent received.
}
}
// *******************************************************************
// ** Listing 5-19: Implementing a Broadcast Receiver
public class LifeformDetectedBroadcastReceiver extends BroadcastReceiver {
public static final String BURN = "com.paad.alien.action.BURN_IT_WITH_FIRE";
@Override
public void onReceive(Context context, Intent intent) {
// Get the lifeform details from the intent.
Uri data = intent.getData();
String type = intent.getStringExtra("type");
double lat = intent.getDoubleExtra("latitude", 0);
double lng = intent.getDoubleExtra("longitude", 0);
Location loc = new Location("gps");
loc.setLatitude(lat);
loc.setLongitude(lng);
if (type.equals("alien")) {
Intent startIntent = new Intent(BURN, data);
startIntent.putExtra("latitude", lat);
startIntent.putExtra("longitude", lng);
context.startActivity(startIntent);
}
}
}
// *******************************************************************
// ** Listing 5-20: Registering a Broadcast Reveiver in XML
// *******************************************************************
// ** Listing 5-21: Registering a Broadcast Receiver in Code
// Create and register the broadcast receiver.
IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED);
LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();
registerReceiver(r, filter);
// *******************************************************************
// ** Listing 5-22: Creating New Pending Intents
// Start an Activity
Intent startActivityIntent = new Intent(this, MyOtherActivity.class);
PendingIntent.getActivity(this, 0, startActivityIntent, 0);
// Broadcast an Intent
Intent broadcastIntent = new Intent(NEW_LIFEFORM_DETECTED);
PendingIntent.getBroadcast(this, 0, broadcastIntent, 0);
// ** Array Adapters*********************************************** //
// *******************************************************************
// ** Listing 5-23: Customizing the Array Adapter
public class MyArrayAdapter extends ArrayAdapter {
int resource;
public ToDoItemAdapter(Context context,
int resource,
List items) {
super(context, resource, items);
resource = _resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout newView;
MyClass classInstance = getItem(position);
// TODO Retrieve values to display from the
// classInstance variable.
// Inflate a new view if this is not an update.
if (convertView == null) {
newView = new LinearLayout(getContext());
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);
vi.inflate(resource, newView, true);
} else {
newView = (LinearLayout)convertView;
}
// TODO Retrieve the Views to populate
// TODO Populate the Views with object property values.
return todoView;
}
}
// *******************************************************************
// ** Listing 5-24: Creating and applying an Adapter
ArrayList myStringArray = new ArrayList();
ArrayAdapter myAdapterInstance;
int layoutID = android.R.layout.simple_list_item_1;
myAdapterInstance = new ArrayAdapter(this, layoutID , myStringArray);
myListView.setAdapter(myAdapterInstance);
// *******************************************************************
// ** Listing 5-25: Creating a Simple Cursor Adapter
String uriString = "content://contacts/people/";
Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null);
String[] fromColumns = new String[] {People.NUMBER, People.NAME};
int[] toLayoutIDs = new int[] { R.id.nameTextView, R.id.numberTextView};
SimpleCursorAdapter myAdapter;
myAdapter = new SimpleCursorAdapter(this,
R.layout.simplecursorlayout,
myCursor,
fromColumns,
toLayoutIDs);
myListView.setAdapter(myAdapter);
// ** Internet ***************************************************** //
// *******************************************************************
// ** Listing 5-26: Opening a data stream
String myFeed = getString(R.string.my_feed);
try {
URL url = new URL(myFeed);
URLConnection connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection)connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream in = httpConnection.getInputStream();
[ ... Process the input stream as required ... ]
}
}
catch (MalformedURLException e) { }
catch (IOException e) { }
// ** Dialog Boxes************************************************* //
// *******************************************************************
// ** Listing 5-27: Creating a new dialog using the Dialog class
Dialog d = new Dialog(MyActivity.this);
// Have the new window tint and blur the window it
// obscures.
Window window = d.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
// Set the title
d.setTitle("Dialog Title");
// Inflate the layout
d.setContentView(R.layout.dialog_view);
// Find the TextView used in the layout
// and set its text value
TextView text = (TextView)d.findViewById(R.id.dialogTextView);
text.setText("This is the text in my dialog");
// *******************************************************************
// ** Listing 5-28: Configuring an Alert Dialog
Context context = MyActivity.this;
String title = "It is Pitch Black";
String message = "You are likely to be eaten by a grue.";
String button1String = "Go Back";
String button2String = "Move Forward";
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle(title);
ad.setMessage(message);
ad.setPositiveButton(button1String,
new OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
eatenByGrue();
}
});
ad.setNegativeButton(button2String,
new OnClickListener(){
public void onClick(DialogInterface dialog, int arg1) {
// do nothing
}
});
ad.setCancelable(true);
ad.setOnCancelListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
eatenByGrue();
}
});
// To display an Alert Dialog that you’ve created call show.
ad.show();
// *******************************************************************
// ** Listing 5-29: Using the On Create Dialog Event Handler
static final private int TIME_DIALOG = 1;
@Override
public Dialog onCreateDialog(int id) {
switch(id) {
case (TIME_DIALOG) :
AlertDialog.Builder timeDialog = new AlertDialog.Builder(this);
timeDialog.setTitle("The Current Time Is...");
timeDialog.setMessage("Now");
return timeDialog.create();
}
return null;
}
// *******************************************************************
// ** Listing 5-30: Using the On Prepare Dialog Event Handler
@Override
public void onPrepareDialog(int id, Dialog dialog) {
switch(id) {
case (TIME_DIALOG) :
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date currentTime = new Date(java.lang.System.currentTimeMillis());
String dateString = sdf.format(currentTime);
AlertDialog timeDialog = (AlertDialog)dialog;
timeDialog.setMessage(dateString);
break;
}
}
// ******************************************************************* //