Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
287 views
in Technique[技术] by (71.8m points)

java - how can i select and kill multiple application

I'm a newbie in android and my thesis is just like the "Battery Doctor Saver" in android. My number 1 problem is to select multiple application and kill it at once. Honestly I already have my no.1 problem but my problem is I can only kill one application at a time. So here is my code thank you for your immediate response to my question :).

package plm.thesis.taskkiller;


public class TaskKillerActivity extends ListActivity {

    private static final String TAG = "TaskKillerActivity";
    TaskListAdapter adapter;
    RefreshReceiver receiver;

    class RefreshReceiver extends BroadcastReceiver {
        private static final String TAG = "RefreshReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "refreshing");
            clearRunningProcessesList();
            loadRunningProcesses();

        }

    }

    public void clearRunningProcessesList() {
        adapter.clearTasks();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        adapter = new TaskListAdapter(this.getApplicationContext());
        setListAdapter(adapter);
        loadRunningProcesses();
        receiver = new RefreshReceiver();
        getApplicationContext().registerReceiver(receiver,
                new IntentFilter("plm.thesis.taskkiller.REFRESH_RECEIVER"));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getApplicationContext().unregisterReceiver(receiver);
    }

    public void loadRunningProcesses() {

        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> appinfolist = activityManager
                .getRunningAppProcesses();

        Log.d(TAG, "AppInfoList Size: " + appinfolist.size());

        for (RunningAppProcessInfo runningAppProcessInfo : appinfolist) {
            TaskObject runningtask = new TaskObject();
            runningtask.pid = runningAppProcessInfo.pid;
            runningtask.processName = runningAppProcessInfo.processName;
            adapter.addTask(runningtask);
        }
    }

    class TaskObject {
        int pid;
        String processName;
    }

    class TaskListAdapter extends BaseAdapter {

        private static final String TAG = "TaskListAdapter";

        ArrayList<TaskKillerActivity.TaskObject> list;
        Context context;

        public TaskListAdapter(Context context) {
            Log.d(TAG, "created new task list adapter");
            this.context = context;
            if (list == null) {
                list = new ArrayList<TaskKillerActivity.TaskObject>();
            }
        }

        public void addTask(TaskObject taskObject) {
            list.add(taskObject);
        }

        public void clearTasks() {
            list.clear();
            Log.d(TAG, "list size:" + list.size());
            this.notifyDataSetChanged();
        }

        public int getCount() {
            return list.size();
        }

        public TaskObject getItem(int position) {
            return list.get(position);
        }

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

        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(context);
            View view = inflater.inflate(R.layout.taskitem, null);
            TextView textPid = (TextView) view.findViewById(R.id.taskPid);
            textPid.setText(Integer.toString(getItem(position).pid));
            TextView textName = (TextView) view.findViewById(R.id.taskName);
            textName.setText(getItem(position).processName);
            Button buttonKill = (Button) view.findViewById(R.id.taskKill);
            buttonKill.setTag(getItem(position).processName);
            CheckBox chckKill = (CheckBox) view.findViewById(R.id.appSelected);
            chckKill.setTag(getItem(position).pid);

            view.findViewById(R.id.taskKill).setOnClickListener(
                    new OnClickListener() {
                        public void onClick(View v) {
                            ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                            Log.d(TAG, "killing process: " + v.getTag());
                            activityManager.killBackgroundProcesses((String) v
                                    .getTag());
                            context.sendBroadcast(new Intent(
                                    "plm.thesis.taskkiller.REFRESH_RECEIVER"));

                        }
                    });

            return view;
        }

    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Create onButton click on your kill button. Gather all selected buttons from your ListView with their position index then get the service names using these IDs and kill them. Guess it's easy as it is. I don't want to be a captain obvious though :)

I don't think you entirely understand how the stuff works in there so I had to ajust your code quite abit I removed the BroadcastReceiver not to lose time you can play with it later.

Add to your AndroidManifest following line:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

and the code:

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;

import java.util.ArrayList;
import java.util.List;

public class TaskKillerActivity extends Activity {

    private static final String TAG = "TaskKillerActivity";
    TaskListAdapter adapter;
    ListView lv;
 //   RefreshReceiver receiver;
//
//    class RefreshReceiver extends BroadcastReceiver {
//        private static final String TAG = "RefreshReceiver";
//
//        @Override
//        public void onReceive(Context context, Intent intent) {
//            Log.d(TAG, "refreshing");
//            clearRunningProcessesList();
//            loadRunningProcesses();
//
//        }
//
//    }

    public void clearRunningProcessesList() {
        adapter.clearTasks();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
       // adapter = new TaskListAdapter(this);
        LinearLayout ll = new LinearLayout(this);
       LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        ll.setLayoutParams(lp1);
        ll.setOrientation(1);
         lv = new ListView(this);
        adapter = new TaskListAdapter(this);
        loadRunningProcesses();

        lv.setAdapter(adapter);


        Button btnKill = new Button(this);
        btnKill.setText("kill task");

        btnKill.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                //listItem.setBackgroundColor(Color.BLACK);
                for(TaskObject to :getTasksToKill())
                {
                   activityManager.killBackgroundProcesses(to.getProcessName());

                }
           adapter.clearTasks();
           loadRunningProcesses();
           lv.setAdapter(adapter);
                // TODO Auto-generated method stub

            }
        });
        ll.addView(btnKill);
        ll.addView(lv);
        setContentView(ll);


    }

    private List<TaskObject> getTasksToKill()
    {
        List<TaskObject> tol = new ArrayList<TaskObject>();

        for(int i =0;i<adapter.getCount();i++)
        {
            //RelativeLayout rl = (RelativeLayout)lv.getChildAt(i);

            TaskObject to = adapter.getItem(i);
            //CheckBox  cb = (CheckBox)rl.getChildAt(0);
            if(to.isToKill())
            {
                tol.add(to);
            }
        }

        return tol;
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
       // getApplicationContext().unregisterReceiver(receiver);
    }

    public void loadRunningProcesses() {

        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appinfolist = activityManager
                .getRunningAppProcesses();

        Log.d(TAG, "AppInfoList Size: " + appinfolist.size());

        for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : appinfolist) {
            TaskObject runningtask = new TaskObject();
            runningtask.setPid(runningAppProcessInfo.pid);
            runningtask.setProcessName(runningAppProcessInfo.processName);
            adapter.addTask(runningtask);
        }
    }

    class TaskObject {
        private int pid;
        private String processName;
        private boolean toKill;

        public int getPid() {
            return pid;
        }

        public void setPid(int pid) {
            this.pid = pid;
        }

        public String getProcessName() {
            return processName;
        }

        public void setProcessName(String processName) {
            this.processName = processName;
        }

        public boolean isToKill() {
            return toKill;
        }

        public void setToKill(boolean toKill) {
            this.toKill = toKill;
        }
    }

    class TaskListAdapter extends BaseAdapter {

        private static final String TAG = "TaskListAdapter";

        ArrayList<TaskObject> list;
        Context context;

        public TaskListAdapter(Context context) {
            Log.d(TAG, "created new task list adapter");
            this.context = context;
            if (list == null) {
                list = new ArrayList<TaskKillerActivity.TaskObject>();
            }
        }

        public void addTask(TaskObject taskObject) {
            list.add(taskObject);
        }

        public void clearTasks() {
            list.clear();
            Log.d(TAG, "list size:" + list.size());
            this.notifyDataSetChanged();
        }

        public int getCount() {
            return list.size();
        }

        public TaskObject getItem(int position) {
            return list.get(position);
        }

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

        public View getView(final int position, View convertView, ViewGroup parent) {
           // LayoutInflater inflater = LayoutInflater.from(context);
           // View view = inflater.inflate(R.layout.taskitem, null);
            RelativeLayout rl = new RelativeLayout(context);
            TextView textPid = new TextView(context);
            textPid.setId(222222);
            textPid.setText(Integer.toString(getItem(position).getPid()));

            TextView textName = new TextView(context);
            textName.setId(333333);
            textName.setText(getItem(position).getProcessName());

            CheckBox chckKill = new CheckBox(context);
            chckKill.setOnClickListener(new View.OnClickListener() {

      public void onClick(View v) {
                //is chkIos checked?
        if (((CheckBox) v).isChecked()) {
            getItem(position).setToKill(true);
        }

      }
    });


            chckKill.setTag(getItem(position).getPid());
            chckKill.setId(11111111);

            RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);

             rl.addView(chckKill,lp2);


            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
            lp.addRule(RelativeLayout.RIGHT_OF, chckKill.getId());
            lp.setMargins(25,0,0,0);
            rl.addView(textName,lp);

            RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
            lp1.addRule(RelativeLayout.RIGHT_OF, chckKill.getId());
            lp1.setMargins(25,20,0,0);
            rl.addView(textPid,lp1);


            return rl;
        }

    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...