Mega Code Archive

 
Categories / Android / Core Class
 

Example of various Intent flags to modify the activity stack

package com.example.android.apis.app; import com.example.android.apis.R; import android.app.Activity; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /**  * Example of various Intent flags to modify the activity stack.  */ public class IntentActivityFlags extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.intent_activity_flags);         // Watch for button clicks.         Button button = (Button)findViewById(R.id.flag_activity_clear_task);         button.setOnClickListener(mFlagActivityClearTaskListener);         button = (Button)findViewById(R.id.flag_activity_clear_task_pi);         button.setOnClickListener(mFlagActivityClearTaskPIListener);     }     /**      * This creates an array of Intent objects representing the back stack      * for a user going into the Views/Lists API demos.      */     private Intent[] buildIntentsToViewsLists() {         // We are going to rebuild our task with a new back stack.  This will         // be done by launching an array of Intents, representing the new         // back stack to be created, with the first entry holding the root         // and requesting to reset the back stack.         Intent[] intents = new Intent[3];         // First: root activity of ApiDemos.         // This is a convenient way to make the proper Intent to launch and         // reset an application's task.         intents[0] = Intent.makeRestartActivityTask(new ComponentName(this,                 com.example.android.apis.ApiDemos.class));         Intent intent = new Intent(Intent.ACTION_MAIN);         intent.setClass(IntentActivityFlags.this, com.example.android.apis.ApiDemos.class);         intent.putExtra("com.example.android.apis.Path", "Views");         intents[1] = intent;         intent = new Intent(Intent.ACTION_MAIN);         intent.setClass(IntentActivityFlags.this, com.example.android.apis.ApiDemos.class);         intent.putExtra("com.example.android.apis.Path", "Views/Lists");         intents[2] = intent;         return intents;     }     private OnClickListener mFlagActivityClearTaskListener = new OnClickListener() {         public void onClick(View v) {             startActivities(buildIntentsToViewsLists());         }     };     private OnClickListener mFlagActivityClearTaskPIListener = new OnClickListener() {         public void onClick(View v) {             Context context = IntentActivityFlags.this;             PendingIntent pi = PendingIntent.getActivities(context, 0,                     buildIntentsToViewsLists(), PendingIntent.FLAG_UPDATE_CURRENT);             try {                 pi.send();             } catch (CanceledException e) {                 Log.w("IntentActivityFlags", "Failed sending PendingIntent", e);             }         }     }; } /*  * Copyright (C) 2007 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package com.example.android.apis; import android.app.ListActivity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; public class ApiDemos extends ListActivity {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);                  Intent intent = getIntent();         String path = intent.getStringExtra("com.example.android.apis.Path");                  if (path == null) {             path = "";         }         setListAdapter(new SimpleAdapter(this, getData(path),                 android.R.layout.simple_list_item_1, new String[] { "title" },                 new int[] { android.R.id.text1 }));         getListView().setTextFilterEnabled(true);     }     protected List<Map<String, Object>> getData(String prefix) {         List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();         Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);         mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE);         PackageManager pm = getPackageManager();         List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);         if (null == list)             return myData;         String[] prefixPath;         String prefixWithSlash = prefix;                  if (prefix.equals("")) {             prefixPath = null;         } else {             prefixPath = prefix.split("/");             prefixWithSlash = prefix + "/";         }                  int len = list.size();                  Map<String, Boolean> entries = new HashMap<String, Boolean>();         for (int i = 0; i < len; i++) {             ResolveInfo info = list.get(i);             CharSequence labelSeq = info.loadLabel(pm);             String label = labelSeq != null                     ? labelSeq.toString()                     : info.activityInfo.name;                          if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) {                                  String[] labelPath = label.split("/");                 String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length];                 if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {                     addItem(myData, nextLabel, activityIntent(                             info.activityInfo.applicationInfo.packageName,                             info.activityInfo.name));                 } else {                     if (entries.get(nextLabel) == null) {                         addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));                         entries.put(nextLabel, true);                     }                 }             }         }         Collections.sort(myData, sDisplayNameComparator);                  return myData;     }     private final static Comparator<Map<String, Object>> sDisplayNameComparator =         new Comparator<Map<String, Object>>() {         private final Collator   collator = Collator.getInstance();         public int compare(Map<String, Object> map1, Map<String, Object> map2) {             return collator.compare(map1.get("title"), map2.get("title"));         }     };     protected Intent activityIntent(String pkg, String componentName) {         Intent result = new Intent();         result.setClassName(pkg, componentName);         return result;     }          protected Intent browseIntent(String path) {         Intent result = new Intent();         result.setClass(this, ApiDemos.class);         result.putExtra("com.example.android.apis.Path", path);         return result;     }     protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {         Map<String, Object> temp = new HashMap<String, Object>();         temp.put("title", name);         temp.put("intent", intent);         data.add(temp);     }     @Override     @SuppressWarnings("unchecked")     protected void onListItemClick(ListView l, View v, int position, long id) {         Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);         Intent intent = (Intent) map.get("intent");         startActivity(intent);     } } //layout/intent_activity_flags.xml <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2010 The Android Open Source Project      Licensed under the Apache License, Version 2.0 (the "License");      you may not use this file except in compliance with the License.      You may obtain a copy of the License at           http://www.apache.org/licenses/LICENSE-2.0      Unless required by applicable law or agreed to in writing, software      distributed under the License is distributed on an "AS IS" BASIS,      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.      See the License for the specific language governing permissions and      limitations under the License. --> <!-- Demonstrates the user of various intent activity flags.      See corresponding Java code com.android.sdk.app.IntentActivityFlags.java. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"         android:orientation="vertical" android:padding="4dip"         android:gravity="center_horizontal"         android:layout_width="match_parent" android:layout_height="match_parent">     <TextView         android:layout_width="match_parent" android:layout_height="wrap_content"         android:layout_weight="0"         android:paddingBottom="4dip"         android:text="intent_activity_flags"/>     <Button android:id="@+id/flag_activity_clear_task"         android:layout_width="wrap_content" android:layout_height="wrap_content"         android:text="flag_activity_clear_task">         <requestFocus />     </Button>     <Button android:id="@+id/flag_activity_clear_task_pi"         android:layout_width="wrap_content" android:layout_height="wrap_content"         android:text="flag_activity_clear_task_pi">         <requestFocus />     </Button> </LinearLayout>