RunningTaskInfo
范例说明
Android操作系统并没有提供任务管理器程序,无从得知后台有哪些程序正在运行。本范例是通过ActivityManager.getRunningTasks方法来取得正在运行中的工作程序,并使用ListView将之罗列出来。
这里说的"正在运行"是指单击"按钮"时所获取到的信息,如果放在ListView里的工作已经结束,或者被操作系统回收(Garbage Collection,GC),此时是不会更新运行列表的,而由于没有其他运行中工作的访问权限,因此也不能通过本程序关闭。
在以下范例的Layout里,设计一个TextView、一个ListView以及一个按钮,通过按钮单击的事件,同时向系统ActivityManager取出正在运行的Activity Tasks。
运行结果(见图5-23)
![]() |
图5-23 任务管理器正在运行的程序,包含了正在运行的Activity |
范例程序
- src/irdc.ex05_21/EX05_21.java
在访问系统Activity的运行工作时,必须指定要取得的工作数量,因为资源有限,所以在类成员中设置了最多取出30笔的Activity运行工作。
单击按钮之后,便会使得私有类成员mActivityManager重新向系统取得ACTIVITY_SERVICE服务(getSystemService(ACTIVITY_SERVICE);),接着创建List<ActivityManager.RunningTaskInfo>对象,并在构建时,使用getRunningTasks()方法获取正在后台运行中的Activity。
由于取出的对象为List对象,因此程序通过for循环的方式,取出其ActivityManager. RunningTaskInfo里的属性,如Activity的名称(baseActivity.getClassName())及ID(Activity- Manager.RunningTaskInfo.id)。
/* import程序略 */ import android.app.ActivityManager; import android.widget.ListView; public class EX05_21 extends Activity { private Button mButton01; private ListView mListView01; private ArrayAdapter<String> aryAdapter1; private ArrayList<String> arylistTask; /* 类成员设置取回最多几笔的Task数量 */ private int intGetTastCounter = 30; /* 类成员ActivityManager对象 */ private ActivityManager mActivityManager; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton01 = (Button) findViewById(R.id.myButton1); mListView01 = (ListView) findViewById(R.id.myListView1); /* 单击按钮取得正在后台运行的任务程序 */ mButton01.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { /* ActivityManager对象向系统取得ACTIVITY_SERVICE */ mActivityManager = (ActivityManager) EX05_21.this .getSystemService(ACTIVITY_SERVICE); arylistTask = new ArrayList<String>(); /* 以getRunningTasks方法取回正在运行中的程序TaskInfo */ List<ActivityManager.RunningTaskInfo> mRunningTasks = mActivityManager .getRunningTasks(intGetTastCounter); int i = 1; /* 以循环及baseActivity方式取得任务名称与ID */ for (ActivityManager.RunningTaskInfo amTask : mRunningTasks) { /* baseActivity.getClassName取出运行任务名称 */ arylistTask.add("" + (i++) + ": " + amTask.baseActivity.getClassName() + "(ID=" + amTask.id + ")"); } aryAdapter1 = new ArrayAdapter<String>(EX05_21.this, R.layout.simple_list_item_1, arylistTask); if (aryAdapter1.getCount() == 0) { /* 当没有任何运行的任务,则提示信息 */ mMakeTextToast(getResources().getText( R.string.str_err_no_running_task).toString(), true); } else { /* 发现后台运行的任务程序,以ListView Widget条列呈现 */ mListView01.setAdapter(aryAdapter1); } } catch (SecurityException e) { /* 当无GET_TASKS权限时(SecurityException异常)提示信息 */ mMakeTextToast(getResources().getText( R.string.str_err_permission).toString(), true); } } }); /* 当User在运行任务选择时的事件处理 */ mListView01 .setOnItemSelectedListener(new ListView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v, int id, long arg3) { // TODO Auto-generated method stub /* 由于将运行任务以数组存放,故以id取出数组元素名称 */ mMakeTextToast(arylistTask.get(id).toString(), false); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); /* 当User在运行任务上单击时的事件处理 */ mListView01.setOnItemClickListener(new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int id, long arg3) { // TODO Auto-generated method stub /* 由于将运行任务以数组存放,故以id取出数组元素名称 */ mMakeTextToast(arylistTask.get(id).toString(), false); } }); } public void mMakeTextToast(String str, boolean isLong) { if (isLong == true) { Toast.makeText(EX05_21.this, str, Toast.LENGTH_LONG).show(); } else { Toast.makeText(EX05_21.this, str, Toast.LENGTH_SHORT).show(); } } }