Androidパッケージの一括削除を実現
11084 ワード
携帯電話のメモリが限られているため、一度に複数のパケットを削除する必要がある場合があります.この場合、Androidパケットの一括削除を実現するアプリケーションが必要です.
まず、レイアウトファイル:
レイアウトファイルは比較的簡単で、最も重要なのはリストです.
次にクラスファイル:
全部で3つのクラスを実現しました:apk、list_apk、item_apk.ApkはActivity全体のクラス、list_apkはリストのアダプタクラス、item_apkはリストの1行のクラスです.list_apkのlist_dataは重要な変数であり、パケット名、システムアプリケーションであるかどうか、選択されているかどうかなど、各パケットの情報を記録する.
[アンインストール]ボタンをクリックすると、list_を巡回します.dataのすべての要素は、選択されているかどうかを判断し、選択されている場合は削除します.
実行効果は次のとおりです.
選択した2つのパッケージが削除されていることがわかります.
まず、レイアウトファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="5" >
<TextView
android:id="@+id/textView1"
style="@style/my_style"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="4" />
<TextView
android:id="@+id/textView2"
style="@style/my_style"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"
android:gravity="center_vertical|center_horizontal"
android:text=" " />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="4"
android:gravity="center_vertical|center_horizontal"
android:text=" " />
</LinearLayout>
<ListView
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1" >
</ListView>
<Button
android:id="@+id/btn_apk"
style="@style/my_style"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="5"
android:text=" " />
</LinearLayout>
レイアウトファイルは比較的簡単で、最も重要なのはリストです.
次にクラスファイル:
package com.hzhi.sysinfor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class apk<PackageDeleteObserver> extends ListActivity{
Button btn_unload;
PackageManager pkg_man;
PackageDeleteObserver pkg_obs;
list_apk list_ada;
//
public void get_app(){
list_ada = new list_apk(this);
//
PackageManager pm = getPackageManager();
//
List<PackageInfo> pi = pm.getInstalledPackages(0);
for (int i=0; i<pi.size(); i++){
PackageInfo pii = (PackageInfo) pi.get(i);
String is_sys;
Drawable icon;
//
if ((pii.applicationInfo.flags & pii.applicationInfo.FLAG_SYSTEM) <= 0)
is_sys = " ";
else
is_sys = " ";
if (pii.applicationInfo.loadIcon(pm) != null)
icon = (Drawable)pii.applicationInfo.loadIcon(pm);
else
icon = (Drawable) getResources().getDrawable(R.drawable.ic_launcher);
list_ada.addItem(String.valueOf(pii.applicationInfo.loadLabel(pm)),
is_sys,
icon,
pii.applicationInfo.packageName,
false);
}
setListAdapter(list_ada);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_apk);
get_app();
btn_unload = (Button) findViewById(R.id.btn_apk);
btn_unload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int j=0; j<list_ada.list_data.size(); j++){
//
if (list_ada.list_data.get(j).is_chk){
String name = (String)
list_ada.list_data.get(j).
txt_name.getText();
final String pak = list_ada.list_data.get(j).item_pak;
new AlertDialog.Builder(apk.this)
.setTitle(" ")
.setMessage(" " + name + " ?")
.setPositiveButton(" ",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1)
{
unload(pak);
get_app();
}
})
.setNegativeButton(" ", null)
.show();
}
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public boolean unload (String n){
boolean res = true;
try{
// URI
Uri pu = Uri.parse("package:" + n);
// Intent
Intent i = new Intent(Intent.ACTION_DELETE, pu);
//
startActivity(i);
res = true;
}
catch(Exception e){
res = false;
}
finally{
return res;
}
}
}
//apk
class list_apk extends BaseAdapter implements OnClickListener{
public Context ctx;
public List<item_apk> list_data;
public list_apk(Context context){
ctx = context;
list_data = new ArrayList<item_apk>();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list_data.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list_data.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return list_data.indexOf(arg0);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
item_apk my_item;
Integer i = 0;
if (convertView == null)
{
my_item = new item_apk(ctx,
(String)list_data.get(position).txt_name.getText(),
(String)list_data.get(position).txt_flag.getText(),
list_data.get(position).img_apk.getDrawable(),
list_data.get(position).item_pak,
list_data.get(position).is_chk);
}
else
{
my_item = (item_apk)convertView;
my_item.txt_name.setText(list_data.get(position).txt_name.getText());
my_item.txt_flag.setText(list_data.get(position).txt_flag.getText());
my_item.img_apk.setImageDrawable(list_data.get(position).img_apk.getDrawable());
}
CheckBox chk_item = (CheckBox) my_item.chk_apk;
chk_item.setOnClickListener(this);
if (list_data.get(position).is_chk)
Log.i(String.valueOf(position) + ".is_chk=", "true");
else
Log.i(String.valueOf(position) + ".is_chk=", "false");
chk_item.setChecked(list_data.get(position).is_chk);
chk_item.setTag(position);
return my_item;
}
public void addItem(String txt_name, String txt_flag, Drawable ico_apk,
String str_name, Boolean bol_chk)
{
list_data.add(new item_apk(ctx,txt_name,txt_flag,ico_apk,str_name,bol_chk));
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
CheckBox c = (CheckBox) v;
int pos = Integer.parseInt(v.getTag().toString());
list_data.get(pos).is_chk = c.isChecked();
}
}
//apk
class item_apk extends LinearLayout{
public CheckBox chk_apk;
public TextView txt_name;
public TextView txt_flag;
public ImageView img_apk;
public String item_pak;
public boolean is_chk;
public item_apk(Context ctx, String item_name, String item_flag,
Drawable item_draw, String str_name, Boolean bol_chk)
{
super(ctx);
this.setOrientation(HORIZONTAL);
int hei = 60;
chk_apk = new CheckBox(ctx);
addView(chk_apk,
new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei));
img_apk = new ImageView(ctx);
img_apk.setImageDrawable(item_draw);
addView(img_apk,
new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei));
txt_name = new TextView(ctx);
txt_name.setText(item_name);
addView(txt_name,
new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.4),hei));
txt_flag = new TextView(ctx);
txt_flag.setText(item_flag);
addView(txt_flag,
new LinearLayout.LayoutParams((int)(MainActivity.wid_scr*0.2),hei));
item_pak = str_name;
is_chk = bol_chk;
}
}
全部で3つのクラスを実現しました:apk、list_apk、item_apk.ApkはActivity全体のクラス、list_apkはリストのアダプタクラス、item_apkはリストの1行のクラスです.list_apkのlist_dataは重要な変数であり、パケット名、システムアプリケーションであるかどうか、選択されているかどうかなど、各パケットの情報を記録する.
[アンインストール]ボタンをクリックすると、list_を巡回します.dataのすべての要素は、選択されているかどうかを判断し、選択されている場合は削除します.
実行効果は次のとおりです.
選択した2つのパッケージが削除されていることがわかります.