android 中在运行的任务和服务

android 中正在运行的任务和服务范例说明Android操作系统并没有提供任务管理器程序,无从得知后台有哪些程

android 中正在运行的任务和服务
范例说明
Android操作系统并没有提供任务管理器程序,无从得知后台有哪些程序正在运行。本范例是通过ActivityManager.getRunningTasks方法来取得正在运行中的工作程序,并使用ListView将之罗列出来。

这里说的“正在运行”是指单击“按钮”时所获取到的信息,如果放在ListView里的工作已经结束,或者被操作系统回收(Garbage Collection,GC),此时是不会更新运行列表的,而由于没有其他运行中工作的访问权限,因此也不能通过本程序关闭。

在以下范例的Layout里,设计一个TextView、一个ListView以及一个按钮,通过按钮单击的事件,同时向系统ActivityManager取出正在运行的Activity Tasks。

范例程序
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();

    }

  }

}



AndroidManifest.xml
必须在AndroidManifest.xml添加Android.permission.GET_TASKS的权限,才能访问系统正在运行中的Activity。



  <uses-permission android:name="android.permission.GET_TASKS">



扩展学习

访问系统后台服务(Service)与Activity的写法不同,使用方法不同,其在于所需读取的不再是ActivityManager.RunningTaskInfo,而是ActivityManager.RunningServiceInfo,而在RunningTas-kInfo属性里,则需访问process以及pid来取得服务的名称及ID值,如以下程序,需在单击按钮的try{}语句中,替换原有的写法即可取出正在运行的系统服务(System Service)。


/* ActivityManager对象向系统取得ACTIVITY_SERVICE */

mActivityManager =

(ActivityManager)EX05_21.this.getSystemService(ACTIVITY_SERVICE);



arylistTask = new ArrayList<String>();



/* 以getRunningTasks方法取回正在运行中的程序TaskInfo */

List<ActivityManager.RunningServiceInfo> mRunningTasks =

mActivityManager.getRunningServices(intGetTastCounter);



int i = 1;

/* 以循环及baseActivity方式取得任务名称与ID */

for (ActivityManager.RunningServiceInfo amTask : mRunningTasks)

{

  /* baseActivity.getClassName取出运行任务名称 */

  arylistTask.add("" + (i++) + ": "+

  amTask.process + "(ID=" + amTask.pid +")");

}

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_service).toString(),

    true

  );

}

else

{

  /* 发现后台运行的任务程序,以ListView Widget条列呈现 */

  mListView01.setAdapter(aryAdapter1);

}



ActivityManager.RunningTaskInfo及ActivityManager.RunningServiceInfo可访问的属性                           Android.app.ActivityManager.RunningTaskInfo

数 据 类 型               属 性 名 称                 描    述

ComponentName       baseActivity       该任务作第一个运行中Activity组件名称

CharSequence         description         该任务现在的状况描述

Int                       id                   该任务的ID

Int                  numActivities   该任务所运行的Activity数量,包含已停止的

Int                   numRunning    该任务正在运行Activity数量,不包含已停止或不延续运行的

Bitmap                thumbnail             以缩图显示该任务目前的状态

ComponentName          topActivity      该任务自运行以来最优先运行的组件名称




                         Android.app.ActivityManager.RunningServiceInfo

数 据 类 型               属 性 名 称                 描    述
long                activeSince          该服务自启动至今的时间

int                clientCount           连接至此服务的client数量

int                 crashCount           该服务在运行时共死机的次数

boolean             foreground          若为true,则该服务在后台运行

long             lastActivityTime    最后一个Activity与该服务绑定的时间

int                  pid             若此值不为0,则表示正在运行服务的ID

String             Process                   该服务的名称

long             restarting      若此值不为0,则表示该服务不在运行中,但也许是在指定的时间才会运行

ComponentName       service                     服务的组件名称

boolean             started          若此值为true,则表示服务已经在启用运行中