Android:实现隐藏应用功能(续)

主要布局文件:

mian.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<GridView android:id="@+id/myGrid"    
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    /> 
</LinearLayout>

gird_item.xmlbu布局文件如下
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/GridItem"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:gravity="center_horizontal"
   android:background="#000080">
   <imageview android:id="@+id/grid_item_image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content">
   </imageview>
   <textview android:id="@+id/grid_item_text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="TextView"
      android:gravity="center_horizontal"
      android:textColor="#000000">
   </textview>
</linearlayout>

与数据库相关的操作

AppsDB.java

package gridview_3.com;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class AppsDB extends SQLiteOpenHelper {
    private final static String DATABASE_NAME = "Apps.db";
    private final static int DATABASE_VERSION = 1;
    private final static String TABLE_NAME = "apps_table";
    public final static String APP_ID = "app_id";
    public final static String APP_PACKAGENAME = "app_packagename";
    public final static String APP_FLAG = "app_flag";

    public AppsDB(Context context) {
        // TODO Auto-generated constructor stub
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // 创建table
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + " (" + APP_ID
                + " INTEGER primary key autoincrement, " + APP_PACKAGENAME
                + " text, " + APP_FLAG + " text);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(sql);
        onCreate(db);
    }

    public Cursor select() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db
                .query(TABLE_NAME, null, null, null, null, null, null);
        return cursor;
    }

    // 增加操作
    public long insert(String packagename, String flag) {
        SQLiteDatabase db = this.getWritableDatabase();
        /* ContentValues */
        ContentValues cv = new ContentValues();
        cv.put(APP_PACKAGENAME, packagename);
        cv.put(APP_FLAG, flag);
        long row = db.insert(TABLE_NAME, null, cv);
        return row;
    }

    // 删除操作
    public void delete(String packagename) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = APP_PACKAGENAME + " = ?";
        String[] whereValue = { packagename };
        db.delete(TABLE_NAME, where, whereValue);
    }

    // 修改操作
    public int update(String packagename, String flag) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = APP_PACKAGENAME + " = ?";
        String[] whereValue = { packagename };

        ContentValues cv = new ContentValues();
        // cv.put(APP_PACKAGENAME, packagename);
        cv.put(APP_FLAG, flag);
        int mLine = db.update(TABLE_NAME, cv, where, whereValue);
        return mLine;
    }
}

GridViewTest.java

package gridview_3.com;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class GridViewTest extends Activity {
    private GridView myGrid;
    private List<ResolveInfo> mApps;
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private List<ResolveInfo> mDisApps = new ArrayList();
    private IconsAdapter iconsAdapter = new IconsAdapter(mDisApps);
    private AppsDB mAppsDB;
    private Cursor mCursor;

    @SuppressWarnings("rawtypes")
    HashMap hm = new HashMap();

    @SuppressWarnings("unchecked")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        mAppsDB = new AppsDB(this);
        mCursor = mAppsDB.select();

        loadApps();
        getDisApps();
        setContentView(R.layout.main);

        // mAppsDB = new AppsDB(this);
        // mCursor = mAppsDB.select();

        myGrid = (GridView) findViewById(R.id.myGrid);
        // iconsAdapter = new IconsAdapter(mDisApps);
        myGrid.setAdapter(iconsAdapter);

        myGrid.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int index,
                    long arg3) {
                try {
                    Intent it = new Intent(Intent.ACTION_VIEW);
                    ComponentName componentName = new ComponentName(mDisApps
                            .get(index).activityInfo.packageName, mDisApps
                            .get(index).activityInfo.name);
                    it.setComponent(componentName);
                    startActivity(it);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                /*
                 * mApps.remove(index);
                 * iconsAdapter.notifyDataSetChanged();
                 */
            }
        });

        /** 长按改变图标的透明度和标志位 */
        myGrid.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int index, long arg3) {
                Object mPackageName = arg1.getTag();
                boolean mFlag = Boolean.parseBoolean(hm.get(mPackageName).toString());
                if (mFlag) {
                    // mDisApps.get(index).activityInfo.loadIcon(
                    // getPackageManager()).setAlpha(100);
                    arg1.setBackgroundColor(Color.RED);
                    hm.put(mPackageName, false);
                    Log.v("长按", "隐藏");
                    Log.v("Flag", hm.get(mPackageName).toString());
                } else {
                    // mDisApps.get(index).activityInfo.loadIcon(
                    // getPackageManager()).setAlpha(255);
                    arg1.setBackgroundColor(Color.BLACK);
                    hm.put(mPackageName, true);
                    Log.v("长按", "显示");
                    Log.v("Flag", hm.get(mPackageName).toString());
                }
                return true;
            }
        });
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.v("onStop()", "~~~onStop");
        @SuppressWarnings("rawtypes")
        Set mset = hm.keySet();
        /* 保存用户当前的设置 */
        for (Object mPackageName : mset) {
            /* 果然更新的行数为0,表示用新装载的应用,这要调用insert()方法 */
            int mLineNum = mAppsDB.update(mPackageName.toString(),
                    hm.get(mPackageName).toString());
            mCursor.requery();
            if (0 == mLineNum) {
                mAppsDB.insert(mPackageName.toString(), hm.get(mPackageName)
                        .toString());
                mCursor.requery();
            }
        }
        Log.v("onStop()", "~~~onStop~~~~");
    }

    /** 设置两个按钮,“显示所有”和“显示/隐藏” */
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 0, 0, R.string.all);
        menu.add(0, 1, 1, R.string.display_hide);

        return super.onCreateOptionsMenu(menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch (item.getItemId()) {
        case 0:
            iconsAdapter = new IconsAdapter(mApps);
            myGrid.setAdapter(iconsAdapter);

            break;
        case 1:
            getDisApps();
            iconsAdapter = new IconsAdapter(mDisApps);
            myGrid.setAdapter(iconsAdapter);

            break;
        }

        return true;
    }

    @SuppressWarnings("unchecked")
    public void loadApps() {
        Intent i = new Intent(Intent.ACTION_MAIN, null);
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        if (mApps != null) {
            mApps.clear();
        }
        mApps = getPackageManager().queryIntentActivities(i, 0);
        /* 重构HashMap,为每个应用程序设置是否显示的标志:true 为显示,false为隐藏 */
        if (hm != null) {
            hm.clear();
        }
        for (int i1 = 0; i1 < mApps.size(); i1++) {
            hm.put(mApps.get(i1).activityInfo.packageName, true);
        }

        /* 读取用户之前的设置信息 */
        @SuppressWarnings("rawtypes")
        Set ms = hm.keySet();
        // if ( !mCursor.isNull(1)) {
        for (mCursor.moveToFirst(); !(mCursor.isAfterLast()); mCursor
                .moveToNext()) {
            if (ms.contains(mCursor.getString(1))) {
                /* 在hm中存在,这从SQLite中读取并更新hm */
                hm.put(mCursor.getString(1), mCursor.getString(2));
            } else {
                /* 不在hm中,说明用户卸载了应用,应该从SQLite中删除该记录 */
                mAppsDB.delete(mCursor.getString(1));
                mCursor.requery();
            }
        }
        // }
    }

    /** 构建显示图标的程序的List */
    public void getDisApps() {
        if (!mDisApps.isEmpty()) {
            mDisApps.clear();
        }
        for (int i = 0; i < hm.size(); ++i) {
            boolean mFlag = Boolean.parseBoolean(hm.get(
                    mApps.get(i).activityInfo.packageName).toString());
            if (mFlag) {
                mDisApps.add(mApps.get(i));
            }
        }

        Log.v("getDisApps()", "msg");
    }

    public class IconsAdapter extends BaseAdapter {

        private List<ResolveInfo> list;

        public IconsAdapter(List<ResolveInfo> list) {
            super();
            this.list = list;
        }

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

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

        // // 通过这个api来动态通知adapter需要更新界面
        // @Override
        // public void notifyDataSetChanged() {
        // super.notifyDataSetChanged();
        // }

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

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

            if (null == convertView) {
                mImageView = new ImageView(GridViewTest.this);
                mImageView.setScaleType(ScaleType.FIT_CENTER);
                mImageView.setLayoutParams(new GridView.LayoutParams(50, 50));
            } else {
                mImageView = (ImageView) convertView;

            }
            ResolveInfo info = list.get(position);
            mImageView.setImageDrawable(info.activityInfo
                    .loadIcon(getPackageManager()));
            Object mPackageName = info.activityInfo.packageName;
            boolean Flag = Boolean.parseBoolean(hm.get(mPackageName).toString());
            /* 区别隐藏的图标在显示所用中的不同状态 */
            if (Flag) {
                mImageView.setBackgroundColor(Color.BLACK);
            } else {
                mImageView.setBackgroundColor(Color.RED);
            }
            /* 给在GridView中的显示的每个View调用一个 setTag()方法,用来确定一个应用程序 */
            mImageView.setTag(mPackageName);
            return mImageView;
        }

    }
}



你可能感兴趣的:(android,String,HashMap,layout,table,null)