当前位置: 代码迷 >> Android >> android 中在运行的任务和服务
  详细解决方案

android 中在运行的任务和服务

热度:34   发布时间:2016-05-01 13:58:44.0
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,则表示服务已经在启用运行中

  相关解决方案