MonoDroid学习笔记(十三)—— 自制任务管理器,获取正在运行的程序与服务

Android操作系统并没有提供任务管理程序,无从得知后台有哪些程序正在运行,但提供了正在运行的服务列表。这次我们来用MonoDroid来获取手机中正在运行的程序及服务,用ListView列出来,点击ListView的项可以实现关闭程序或服务。

这里我没有实现实时获取,而是通过点击两个按钮时才进行获取,布局文件如下:

[xhtml]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.                 android:layout_width="fill_parent"  
  4.                 android:layout_height="fill_parent">  
  5.   <Button android:id="@+id/btnGetTask"  
  6.           android:text="正在运行的程序"  
  7.           android:layout_width="wrap_content"  
  8.           android:layout_height="wrap_content"/>  
  9.   <Button android:id="@+id/btnGetService"  
  10.           android:text="正在运行的服务"  
  11.           android:layout_width="wrap_content"  
  12.           android:layout_height="wrap_content"  
  13.           android:layout_toRightOf="@id/btnGetTask"/>  
  14.   <ListView android:id="@+id/lvTasks"  
  15.             android:layout_width="fill_parent"  
  16.             android:layout_height="fill_parent"  
  17.             android:layout_below="@id/btnGetTask"></ListView>  
  18. </RelativeLayout>  
 

要获取正在运行的程序,需使用ActivityManager类的GetRunningTasks方法,它的参数指定需要取出的任务数,由于资源有限,所以我们这里设置了最多取出30条任务:

[c-sharp]  view plain copy print ?
  1. public class Activity1 : Activity  
  2. {  
  3.     List<string> list = new List<string>();  
  4.     IList<ActivityManager.RunningTaskInfo> listRunningTasks;  
  5.     ActivityManager am;  
  6.     protected override void OnCreate(Bundle bundle)  
  7.     {  
  8.         base.OnCreate(bundle);  
  9.         SetContentView(Resource.Layout.Main);  
  10.         Button btnGetTask = FindViewById<Button>(Resource.Id.btnGetTask);  
  11.         Button btnGetService = FindViewById<Button>(Resource.Id.btnGetService);  
  12.         ListView lvTasks = FindViewById<ListView>(Resource.Id.lvTasks);  
  13.         am = this.GetSystemService(ActivityService) as ActivityManager;  
  14.         btnGetTask.Click += (sender, e) =>   
  15.         {  
  16.             contentShown = 1;  
  17.             try  
  18.             {  
  19.                 list.Clear();  
  20.                 lvTasks.Adapter = null;  
  21.                 listRunningTasks = am.GetRunningTasks(30);  
  22.                 int index = 1;  
  23.                 foreach (ActivityManager.RunningTaskInfo task in listRunningTasks)  
  24.                 {  
  25.                     list.Add(string.Format("{0}:{1}(ID={2})", index++, task.BaseActivity.ClassName, task.Id));  
  26.                 }  
  27.                 ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, list);  
  28.                 if (adapter.Count == 0)  
  29.                 {  
  30.                     Toast.MakeText(this"当前没有任何程序运行", ToastLength.Long).Show();  
  31.                 }  
  32.                 else  
  33.                 {  
  34.                     lvTasks.Adapter = adapter;  
  35.                 }  
  36.             }  
  37.             catch (SecurityException)  
  38.             {  
  39.                 Toast.MakeText(this"没有获取运行程序的权限", ToastLength.Long).Show();  
  40.             }  
  41.             catch (System.Exception ex)  
  42.             {  
  43.                 MessageBox.ShowErrorMessage(this, ex);  
  44.             }  
  45.         };  
  46.         lvTasks.ItemClick += (sender, e) =>   
  47.         {  
  48.                 MessageBox.Confirm(this"提示""确定关闭此程序吗?", (s2, e2) =>  
  49.                 {  
  50.                     am.RestartPackage(listRunningTasks[e.Position].BaseActivity.PackageName);  
  51.                     btnGetTask.PerformClick();  
  52.                 }, (s3, e3) => { });  
  53.         };  
  54.     }  
  55. }  
 

注意要获取任务,必需要在AndroidManifest.xml中添加GET_Tasks权限,而要关闭程序,我们这里使用的是ActivityManager类的RestartPackage方法,根据程序的包名称来关闭,所以要添加RESTART_PACKAGES权限:

[xhtml]  view plain copy print ?
  1. <uses-permission android:name="android.permission.GET_TASKS" />  
  2. <uses-permission android:name="android.permission.RESTART_PACKAGES" />  
 

效果图:

MonoDroid学习笔记(十三)—— 自制任务管理器,获取正在运行的程序与服务

 

下面我们来实现获取运行中服务的效果。获取服务与获取程序差不多,只要把GetRunningTasks改为GetRunningServices即可,同样我们还是取出30条。由于是在同一个ListView中显示,在单击列表项时需要区分单击的是程序还是服务,所以我们增加一个字段contentShown加以区分,contentShown=1时表示程序,contentShown=2时表示服务,完整的代码如下:

[c-sharp]  view plain copy print ?
  1. public class Activity1 : Activity  
  2. {  
  3.     List<string> list = new List<string>();  
  4.     IList<ActivityManager.RunningTaskInfo> listRunningTasks;  
  5.     IList<ActivityManager.RunningServiceInfo> listRunningServices;  
  6.     ActivityManager am;  
  7.     int contentShown = 0;  
  8.     protected override void OnCreate(Bundle bundle)  
  9.     {  
  10.         base.OnCreate(bundle);  
  11.         SetContentView(Resource.Layout.Main);  
  12.         Button btnGetTask = FindViewById<Button>(Resource.Id.btnGetTask);  
  13.         Button btnGetService = FindViewById<Button>(Resource.Id.btnGetService);  
  14.         ListView lvTasks = FindViewById<ListView>(Resource.Id.lvTasks);  
  15.         am = this.GetSystemService(ActivityService) as ActivityManager;  
  16.         btnGetTask.Click += (sender, e) =>   
  17.         {  
  18.             contentShown = 1;  
  19.             try  
  20.             {  
  21.                 list.Clear();  
  22.                 lvTasks.Adapter = null;  
  23.                 listRunningTasks = am.GetRunningTasks(30);  
  24.                 int index = 1;  
  25.                 foreach (ActivityManager.RunningTaskInfo task in listRunningTasks)  
  26.                 {  
  27.                     list.Add(string.Format("{0}:{1}(ID={2})", index++, task.BaseActivity.ClassName, task.Id));  
  28.                 }  
  29.                 ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, list);  
  30.                 if (adapter.Count == 0)  
  31.                 {  
  32.                     Toast.MakeText(this"当前没有任何程序运行", ToastLength.Long).Show();  
  33.                 }  
  34.                 else  
  35.                 {  
  36.                     lvTasks.Adapter = adapter;  
  37.                 }  
  38.             }  
  39.             catch (SecurityException)  
  40.             {  
  41.                 Toast.MakeText(this"没有获取运行程序的权限", ToastLength.Long).Show();  
  42.             }  
  43.             catch (System.Exception ex)  
  44.             {  
  45.                 MessageBox.ShowErrorMessage(this, ex);  
  46.             }  
  47.         };  
  48.         btnGetService.Click += (sender, e) =>   
  49.         {  
  50.             contentShown = 2;  
  51.             try  
  52.             {  
  53.                 lvTasks.Adapter = null;  
  54.                 listRunningServices = am.GetRunningServices(30);  
  55.                 int index = 1;  
  56.                 list.Clear();  
  57.                 foreach (ActivityManager.RunningServiceInfo service in listRunningServices)  
  58.                 {  
  59.                     list.Add(string.Format("{0}:{1}(ID={2})", index++, service.Process, service.Pid));  
  60.                 }  
  61.                 ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, list);  
  62.                 if (adapter.Count == 0)  
  63.                 {  
  64.                     Toast.MakeText(this"当前没有任何服务运行", ToastLength.Long).Show();  
  65.                 }  
  66.                 else  
  67.                 {  
  68.                     lvTasks.Adapter = adapter;  
  69.                 }  
  70.             }  
  71.             catch (SecurityException)  
  72.             {  
  73.                 Toast.MakeText(this"没有获取运行服务的权限", ToastLength.Long).Show();  
  74.             }  
  75.             catch (System.Exception ex)  
  76.             {  
  77.                 MessageBox.ShowErrorMessage(this, ex);  
  78.             }  
  79.         };  
  80.         lvTasks.ItemClick += (sender, e) =>   
  81.         {  
  82.             if (contentShown == 1)  
  83.             {  
  84.                 MessageBox.Confirm(this"提示""确定关闭此程序吗?", (s2, e2) =>  
  85.                 {  
  86.                     am.RestartPackage(listRunningTasks[e.Position].BaseActivity.PackageName);  
  87.                     btnGetTask.PerformClick();  
  88.                 }, (s3, e3) => { });  
  89.             }  
  90.             else if (contentShown == 2)  
  91.             {  
  92.                 MessageBox.Confirm(this"提示""确定关闭此服务吗?", (s2, e2) =>  
  93.                 {  
  94.                     am.RestartPackage(listRunningServices[e.Position].Service.PackageName);  
  95.                     btnGetService.PerformClick();  
  96.                 }, (s3, e3) => { });  
  97.             }  
  98.         };  
  99.     }  
  100. }  
 

MonoDroid学习笔记(十三)—— 自制任务管理器,获取正在运行的程序与服务

你可能感兴趣的:(学习笔记)