AppWidget开发实例讲解(三)

来源:互联网 发布:大数据项目 编辑:程序博客网 时间:2024/06/05 20:10
public class TaskStopActivity extends Activity implements OnClickListener {private RefreshHandler handler;private List<ApplicationInfo> installApplicationList;//获取已经安装程序列表private RefreshThread thread;//开启一个线程用于停止private ProgressDialog mypDialog;//用一个ProgressDialog显示停止进程的进度private String[] threadFilterArray={"com.android.phone","com.process","system","com.android.launcher"};//在进行停止进程或者服务时我们可以过滤掉我们不希望停止的进程,此数组可以根据需要更改@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);mypDialog = new ProgressDialog(this);mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//进度条格式mypDialog.setTitle(getString(R.string.notify));//标题mypDialog.setMessage(getResources().getString(//内容R.string.progress_tips_content));mypDialog.setIcon(R.drawable.icon);//图标mypDialog.setButton(getString(R.string.cancel), this);//添加取消按钮可以打断停止操作mypDialog.setIndeterminate(false);mypDialog.setCancelable(true);mypDialog.show();handler = new RefreshHandler();thread = new RefreshThread();thread.start();}/** * 获取正在运行程序,并结束每一个用户级进程 */private void stopAllUserTask() {PackageManager pm = this.getApplicationContext().getPackageManager();installApplicationList = pm.getInstalledApplications(0);//通过参数0获取安装应用的列表包含进程名List<PackageInfo> installPackageList = pm.getInstalledPackages(0);//通过参数0获取安装应用包等信息包含package名ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);List<RunningAppProcessInfo> allTaskList = activityManager.getRunningAppProcesses();//获取正在运行的进程列表for (int j = 0; j < allTaskList.size(); j++) {for (int i = 0; i < installPackageList.size(); i++) {if (allTaskList.get(j).processName.equals(installApplicationList.get(i).processName)//获取对应位置想要获取进程的进程名) {for(int m=0;m<threadFilterArray.length;m++){if(installPackageList.get(i).packageName.contains(threadFilterArray[m]))//跳过停止过滤数组中对象break;else if(m==threadFilterArray.length-1)closeSpecifyTask(getApplicationInfo(allTaskList.get(j).processName).packageName);//通过进程名获取包名用以停止相应进程}}}}}/** * 通过一个程序名返回该程序的一个ApplicationInfo对象 *  * @param name *            程序名 * @return ApplicationInfo */public ApplicationInfo getApplicationInfo(String appName) {if (appName == null) {return null;}if (installApplicationList.size() != 0) {for (ApplicationInfo appinfo : installApplicationList) {if (appName.equals(appinfo.processName)) {return appinfo;}}}return null;}private class RefreshHandler extends Handler {public void handleMessage(Message msg) {// TODO : Update your UI// 取消进度框closeActivity();}}class RefreshThread extends Thread {public void run() {// TODO : Do your Stuff here.// procListAdapter = buildProcListAdapter();                    try {                         stopAllUserTask();                         Thread.sleep( 1000 );                        } catch ( InterruptedException e ) {                           System.out.println( "Thread interrupted..." );                        }// TODOAuto-generated catch block e.printStackTrace(); }Message msg = handler.obtainMessage();handler.sendMessage(msg);}}/** * 根据packagename结束任务 *  * @param packageName */private void closeSpecifyTask(String packageName) {Log.d("myDebug", packageName);ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);am.killBackgroundProcesses(packageName);//使用此操作工程的Manifest文件中必须添加android.permission.KILL_BACKGROUND_PROCESSES}//窗口取消按钮操作public void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub                thread.interrupt();//打断进程mypDialog.dismiss();finish();}public void closeActivity() {mypDialog.dismiss();finish();}}
由于是widget组件控制结束所有进程,在结束进程之前我们可以需要筛选一些不应该结束的程序,我们使用一个数组进行保存需要进行过滤的进程列表,而在界面提供给用户的接入的方式是进度条方式,和一个取消按钮打断正在进行终止进程的操作,下面是该activity在Mainifest中的配置:
.....               <activity android:name=".TaskStopActivity" android:theme="@android:style/Theme.Dialog" ></activity>               ......

同时结束进程需要权限,在Mainifest中必须添加权限,配置如下:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
如果想了解android在进程结束方面的知识建议看下以下这篇博文:
http://blog.csdn.net/Zengyangtech/article/details/5733631