android - killBackgroundProcesses 不工作

标签 android android-activity android-package-managers

我试图在我的项目 (android Api 2.2) 中使用 killBackgroundProcesses() 方法终止正在运行的应用程序 killBackgroundProcesses() 不会终止正在运行的应用程序。我在应用程序的 list 文件中声明了终止应用程序所需的所有权限。

打击代码仅从正在运行的应用程序列表中删除列表项。无法终止应用程序。

Before killing running application After killing running application "launcher" refreshing list view it again show "launcher" still running

代码:

 public class RunningAppActivity extends Activity implements OnItemClickListener {

       /* whether or not to include system apps */
       private ListView mAppsList;
       private RunningAppListAdapter mAdapter;
       private List<RunningAppEntity> mApps;
       private Context mContext;
       /** Called when the activity is first created. */
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.appmanager);
          mContext = this;
       }

       @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
              mAppsList = (ListView) findViewById(R.id.appslist);
              mAppsList.setOnItemClickListener(this);
              mApps = loadRunningApps();
              mAdapter = new RunningAppListAdapter(getApplicationContext());
              mAdapter.setListItems(mApps);
              mAppsList.setAdapter(mAdapter);
              new LoadIconsTask().execute(mApps.toArray(new RunningAppEntity[]{}));


        }
       @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

          final RunningAppEntity app = (RunningAppEntity) parent.getItemAtPosition(position);
          final int appPosition = position;
          ActivityManager am = (ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE);
          am.killBackgroundProcesses(app.getPackageName());
          am.restartPackage(app.getPackageName());
          Log.d("","Kill : "+app.getPackageName());
          mApps.remove(appPosition);
          mAdapter.notifyDataSetChanged();

       }

       private List<RunningAppEntity> loadRunningApps() {
          List<RunningAppEntity> apps = new ArrayList<RunningAppEntity>();
          ActivityManager am = (ActivityManager) mContext.getSystemService(Activity.ACTIVITY_SERVICE);
          List<RunningTaskInfo> rt =am.getRunningTasks(Integer.MAX_VALUE);
          PackageManager pack = this.getPackageManager();
          for(int i=0;i<rt.size();i++){
             RunningAppEntity rapp = new RunningAppEntity();
              String packageName = rt.get(i).baseActivity.getPackageName();
           // Drawable d=null;
              String appName = null;
              try {
                //  d = pack.getApplicationIcon(packageName);
                  appName = ((String)pack.getApplicationLabel(pack.getApplicationInfo(packageName,PackageManager.GET_META_DATA)));

              } catch (NameNotFoundException e) {
                  e.printStackTrace();
              }
              rapp.setPackageName(packageName);
              rapp.setAppName(appName);
              apps.add(rapp);
       }
          return apps;
       }



       /**
        * An asynchronous task to load the icons of the installed applications.
        */
       private class LoadIconsTask extends AsyncTask<RunningAppEntity, Void, Void> {

          @Override
          protected void onPostExecute(Void result) {
             mAdapter.notifyDataSetChanged();
          }

        @Override
        protected Void doInBackground(RunningAppEntity... params) {
            // TODO Auto-generated method stub

              Map<String, Drawable> icons = new HashMap<String, Drawable>();
                 PackageManager manager = getApplicationContext().getPackageManager();

                 for (RunningAppEntity app : params) {
                    String pkgName = app.getPackageName();
                    Drawable ico = null;
                    try {
                       Intent i = manager.getLaunchIntentForPackage(pkgName);
                       if (i != null) {
                          ico = manager.getActivityIcon(i);
                       }
                    } catch (NameNotFoundException e) {
                       Log.e("ERROR", "Unable to find icon for package '" + pkgName + "': " + e.getMessage());
                    }
                    icons.put(app.getPackageName(), ico);
                 }
                 mAdapter.setIcons(icons);
            return null;
        }
      }

    }

ListView 适配器:

    public class RunningAppListAdapter extends BaseAdapter {

   private LayoutInflater mInflater;

   private List<RunningAppEntity> mApps;
   private Map<String, Drawable> mIcons;
   private Drawable mStdImg;


   public RunningAppListAdapter(Context context) {
      mInflater = LayoutInflater.from(context);
      mStdImg = context.getResources().getDrawable(R.drawable.icon);
   }

   @Override
   public int getCount() {
      return mApps.size();
   }

   @Override
   public Object getItem(int position) {
      return mApps.get(position);
   }

   @Override
   public long getItemId(int position) {
      return position;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {

      AppViewHolder holder;
      if(convertView == null) {
         convertView = mInflater.inflate(R.layout.row, null);
         holder = new AppViewHolder();
         holder.mTitle = (TextView) convertView.findViewById(R.id.apptitle);
         holder.mIcon = (ImageView) convertView.findViewById(R.id.appicon);
         convertView.setTag(holder);
      } else {
         holder = (AppViewHolder) convertView.getTag();
      }

      RunningAppEntity app = mApps.get(position);
      holder.setTitle(app.getAppName());
      if (mIcons == null || mIcons.get(app.getPackageName()) == null) {
         holder.setIcon(mStdImg);
      } else {
         holder.setIcon(mIcons.get(app.getPackageName()));
      }

      return convertView;
   }


   public void setListItems(List<RunningAppEntity> list) {
      mApps = list;
   }


   public void setIcons(Map<String, Drawable> icons) {
      this.mIcons = icons;
   }


   public Map<String, Drawable> getIcons() {
      return mIcons;
   }

   public class AppViewHolder {

      private TextView mTitle;
      private ImageView mIcon;


      public void setTitle(String title) {
         mTitle.setText(title);
      }


      public void setIcon(Drawable img) {
         if (img != null) {
            mIcon.setImageDrawable(img);
         }
      }
   }
}

最佳答案

使用 ActivityManager 终止进程

首先,添加权限(AndroidManifest.xml):

android.permission.KILL_BACKGROUND_PROCESSES

二、使用这个方法:

public void amKillProcess(String process)
{
    ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();

    for(RunningAppProcessInfo runningProcess : runningProcesses) 
    {
        if(runningProcess.processName.equals(process)) 
        {               
            android.os.Process.sendSignal(runningProcess.pid, android.os.Process.SIGNAL_KILL);   
        }
    }
}

用法:

amKillProcess("com.example.myapp");

关于android - killBackgroundProcesses 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886525/

相关文章:

android - 整个android应用程序的触摸事件

java - 抽屉列表阵列适配器使应用程序崩溃

Android:如何通知其他 Activity 完成的 Activity ()

java - Wicket 中是否有 Activity 指示器?

android - `packageManager.getInstalledPackages(0)` 没有返回所有应用

Android 包管理器因 TransactionTooLargeException 而死

android - 完全更改包名称,包括公司域

java - Android libgdx... Sprite 水平来回移动

java - 选项菜单无法覆盖?

android - 在 Android 中与 Map 一起旋转 onTouch 事件