昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦。其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出现了,数据库里面的应用,那么就提示用户要输入密码才能打开,就是这样一个简单的流程。

按照这个流程,那样我们肯定是先建一张表的啦,那样肯定是继承Android的SQLiteOpenHelper,然后在它的onCreate方法里面写建表语句这些的啦,如果是单独的应用,那肯定没错的,但是现在在我们的这个项目里面,那就不行了,因为我们的项目里面已经有一个数据库了,那么我们在新增表,这些操作的时候,就要特别小心啦。

当时我们写我们的黑名单的数据库的时候,是看到这样一个方法的onUpgrade,这个方法就是在当数据库版本不同的时候执行的操作,那么在那里控制那个版本呢,那就是在构造方法里面的最后一个参数啦,那个就是控制数据库的版本的了,那么现在,我们就有一个解决办法了,我们只在把表的创建语句写在onUpgrade里面,然后修改一下数据库的版本号就可以啦!

好,那我们就来写一下

com.xiaobin.security.utils.DBHelper

package com.xiaobin.security.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper
{ public DBHelper(Context context)
{
super(context, "security.db", null, 2);
} @Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create table blacknumber (_id integer primary key autoincrement, number varchar(20))");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("create table applock (_id integer primary key autoincrement, packagename varchar(30))");
} }

就这样,我们就可以把程序锁的表给创建出来的啦。那么我们现在肯定就要写一些这个表的增删改查操作的啦

com.xiaobin.security.dao.AppLockDao

package com.xiaobin.security.dao;

import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import com.xiaobin.security.utils.DBHelper; public class AppLockDao
{
private DBHelper dbHelper; public AppLockDao(Context context)
{
dbHelper = new DBHelper(context);
} public boolean find(String packageName)
{
boolean result = false;
SQLiteDatabase db = dbHelper.getReadableDatabase();
if(db.isOpen())
{
Cursor cursor = db.rawQuery("select packagename from applock where packagename = ? ", new String[] {packageName});
if(cursor.moveToNext())
{
result = true;
}
cursor.close();
db.close();
}
return result;
} public void add(String packageName)
{
if(find(packageName))
{
return ;
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
if(db.isOpen())
{
db.execSQL("insert into applock (packagename) values (?)", new Object[] {packageName});
db.close();
}
} public void delete(String packageName)
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
if(db.isOpen())
{
db.execSQL("delete from applock where packagename = ? ", new Object[] {packageName});
}
} public List<String> getAllPackageName()
{
SQLiteDatabase db = dbHelper.getReadableDatabase();
List<String> packageNames = new ArrayList<String>();
if(db.isOpen())
{
Cursor cursor = db.rawQuery("select packagename from applock", null);
while(cursor.moveToNext())
{
String packageName = cursor.getString(0);
packageNames.add(packageName);
}
cursor.close();
db.close();
}
return packageNames;
} }

都是一些很简单的增删改查操作了,所以我就不多说啦

好啦,写完这些之后,我们就要回到我的们界面里面写一些逻辑啦,首先,我们先给它加一个进度条,因为这个读取所有的应用是会花费挺长时间的,免得用户以为我们的应用挂掉了,所以我们就加一个进度条显示。这个进度条和我们之前说的程序管理那里的是差不多的,布局文件也差不多,所以我就不多说了,主要就是在线程加载完应用信息之后,发送一个消息给Handler,然后Handler就处理一下界面上的东西。

那么我们现在主要就是完成锁的功能了,也就是说,当我一点击应用的条目的时候,那我就要把这个条目的包名给加入到我们的数据库里面啦,还要在界面上显示一个加锁的图标啦!当我再次点击的时候,我就要把这个锁给打开啦,也就是把这个条目从数据库里面删除啦,还要在界面上显示解锁的图标啦。

那好,我们就来给我们上一次写好的listview加一个事件啦

		lv_app_lock.setOnItemClickListener(new OnItemClickListener()
{ @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
//添加动画效果,动画结束后,就把锁的图片改变
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translateAnimation.setDuration(300);
view.startAnimation(translateAnimation); AppInfo info = list.get(position);
String packageName = info.getPackageName();
ImageView iv_lock = (ImageView) view.findViewById(R.id.iv_app_lock);
if(dao.find(packageName))
{
dao.delete(packageName);
lockApps.remove(packageName);
iv_lock.setImageResource(R.drawable.unlock);
}
else
{
dao.add(info.getPackageName());
lockApps.add(packageName);
iv_lock.setImageResource(R.drawable.lock);
}
} });

大家可以看到,我们还给它加了一个动画,看起来就更动感一些了。

写完上面的一些,我们还有一个问题要处理的,就是adapter里面,我们下拉的时候,我们还要知道那些条目的锁定情况呢,以拿做出界面上相应的变化嘛。但是问题来了,

难道我们每生成一个条目,我们都要去用dao.find来判断一下嘛,这样子岂不是每一次都要打开关闭数据库,那样的开销是非常的大的,是严重影响性能的,所以我们绝对是不能这样做的,那么我们就可以新建一个List啦,用来存放那些已经加锁了的应用,那么我们只要在每一次生成条目的时候,我们就可以判断它是不是在list里面,而知道加锁的情况了

		@Override
public View getView(int position, View convertView, ViewGroup parent)
{
AppInfo info = list.get(position);
if(convertView == null)
{
View view = View.inflate(AppLockActivity.this, R.layout.app_lock_item, null);
AppManagerViews views = new AppManagerViews();
views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_lock_icon);
views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_lock_name);
views.iv_app_lock = (ImageView) view.findViewById(R.id.iv_app_lock);
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
if(lockApps.contains(info.getPackageName()))
{
views.iv_app_lock.setImageResource(R.drawable.lock);
}
else
{
views.iv_app_lock.setImageResource(R.drawable.unlock);
}
view.setTag(views);
return view;
}
else
{
AppManagerViews views = (AppManagerViews) convertView.getTag();
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
if(lockApps.contains(info.getPackageName()))
{
views.iv_app_lock.setImageResource(R.drawable.lock);
}
else
{
views.iv_app_lock.setImageResource(R.drawable.unlock);
}
return convertView;
}
} }

而我们的list的更新也在条目点击的时候做了处理啦,所以写到这里,我们就可以把这个加锁的完成的啦,剩下的就是监听任务栈里面的运行情况啦,这个我们明天再说啦

下面把完整的activity粘出来

com.xiaobin.security.ui.AppLockActivity

package com.xiaobin.security.ui;

import java.util.ArrayList;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView; import com.xiaobin.security.R;
import com.xiaobin.security.dao.AppLockDao;
import com.xiaobin.security.domain.AppInfo;
import com.xiaobin.security.engine.AppInfoProvider; public class AppLockActivity extends Activity
{
private ListView lv_app_lock;
private LinearLayout ll_load;
private AppLockAdapter adapter;
private List<AppInfo> list;
private AppInfoProvider provider;
private AppLockDao dao;
private List<String> lockApps; @SuppressLint("HandlerLeak")
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
ll_load.setVisibility(View.GONE);
adapter = new AppLockAdapter();
lv_app_lock.setAdapter(adapter);
}
}; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.app_lock); ll_load = (LinearLayout) findViewById(R.id.ll_app_lock_progress);
dao = new AppLockDao(this);
lockApps = new ArrayList<String>();
lv_app_lock = (ListView) findViewById(R.id.lv_app_lock);
lv_app_lock.setOnItemClickListener(new OnItemClickListener()
{ @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
//添加动画效果,动画结束后,就把锁的图片改变
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, 0.0f);
translateAnimation.setDuration(300);
view.startAnimation(translateAnimation); AppInfo info = list.get(position);
String packageName = info.getPackageName();
ImageView iv_lock = (ImageView) view.findViewById(R.id.iv_app_lock);
if(dao.find(packageName))
{
dao.delete(packageName);
lockApps.remove(packageName);
iv_lock.setImageResource(R.drawable.unlock);
}
else
{
dao.add(info.getPackageName());
lockApps.add(packageName);
iv_lock.setImageResource(R.drawable.lock);
}
} }); provider = new AppInfoProvider(this); initAppInfos();
} private void initAppInfos()
{
ll_load.setVisibility(View.VISIBLE);
new Thread()
{
@Override
public void run()
{
list = provider.getAllApps();
handler.sendEmptyMessage(0);
}
}.start();
} //=========================================================================== private class AppLockAdapter extends BaseAdapter
{ @Override
public int getCount()
{
return list.size();
} @Override
public Object getItem(int position)
{
return list.get(position);
} @Override
public long getItemId(int position)
{
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent)
{
AppInfo info = list.get(position);
if(convertView == null)
{
View view = View.inflate(AppLockActivity.this, R.layout.app_lock_item, null);
AppManagerViews views = new AppManagerViews();
views.iv_app_icon = (ImageView) view.findViewById(R.id.iv_app_lock_icon);
views.tv_app_name = (TextView) view.findViewById(R.id.tv_app_lock_name);
views.iv_app_lock = (ImageView) view.findViewById(R.id.iv_app_lock);
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
if(lockApps.contains(info.getPackageName()))
{
views.iv_app_lock.setImageResource(R.drawable.lock);
}
else
{
views.iv_app_lock.setImageResource(R.drawable.unlock);
}
view.setTag(views);
return view;
}
else
{
AppManagerViews views = (AppManagerViews) convertView.getTag();
views.iv_app_icon.setImageDrawable(info.getIcon());
views.tv_app_name.setText(info.getAppName());
if(lockApps.contains(info.getPackageName()))
{
views.iv_app_lock.setImageResource(R.drawable.lock);
}
else
{
views.iv_app_lock.setImageResource(R.drawable.unlock);
}
return convertView;
}
} } //用来优化listview的类
private class AppManagerViews
{
ImageView iv_app_icon;
TextView tv_app_name;
ImageView iv_app_lock;
} }

好啦,今天我们就讲到这里,我们明天就会讲程序锁里面最重要的一总分,监听任务栈

最后,和大家说一下

为了方便大家的交流,我创建了一个群,这样子大家有什么疑问也可以在群上交流

群号是298440981

今天源码下载

Android项目实战--手机卫士24--程序锁的实现以及逻辑的更多相关文章

  1. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

  2. Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面

    好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...

  3. Android 项目实战--手机卫士(实现splash)

    从今天开始根据之前学习的android的基础知识,实战一下,实现一个简单功能的android手机卫士 本文地址:http://www.cnblogs.com/wuyudong/p/5899283.ht ...

  4. Android项目实战--手机卫士18--读取用户的短信内容以及短信备份

    我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面, 但我们这里的是读取到xml里面的. 首先我 ...

  5. Android项目实战手机安全卫士(02)

    目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01.  SplashActivity.java package com.coderdream.mobilesafe.acti ...

  6. Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  7. Android项目实战(三十二):圆角对话框Dialog

    前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话框的"确定"按钮 难点:1.对话框边框圆角 ...

  8. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  9. Android项目实战(二十九):酒店预定日期选择

    先看需求效果图: 几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果&qu ...

随机推荐

  1. java:比较对象

    对象内容相等条件:1.对象类型相同(可用instanceof操作符比较)2.对象的成员变量的值完全相同 instanceof 判断对象类型 //a是否为Child对象类型 boolean b = a ...

  2. POJ1159——Palindrome(最长公共子序列+滚动数组)

    Palindrome DescriptionA palindrome is a symmetrical string, that is, a string read identically from ...

  3. Django QuerySet API文档

    在查询时发生了什么(When QuerySets are evaluated) QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据 ...

  4. MapReduce编程系列 — 2:计算平均分

    1.项目名称: 2.程序代码: package com.averagescorecount; import java.io.IOException; import java.util.Iterator ...

  5. python调试 设置断点

    1在所需要调试的地方加入如下代码: import pdb    pdb.set_trace() 2调试代码常用命令: 实例请见参考文献: 1http://www.cnblogs.com/qi09/ar ...

  6. 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法"

    先讲三个事例: 一.近日,浙江金华一个17月大的小贝边玩边吃花生,被噎住.10多分钟后,奶奶发现小贝大口喘气,以为他玩累了就抱他回家,等父母赶到送医已晚.小贝大脑受损严重-父母含泪同意放弃治疗,孩子走 ...

  7. Android开发之错误:elicpse运行时弹出Running Android Lint has encountered a problem failed, nullpointerexception

    昨天安装了下Android Studio,把SDK路径指向了ADT目录下的SDK目录.同时FQ出去更新了下SDK.然后今天运行eclipse的时候,弹出错误,同时在工程的名称处有错误提醒,但是代码中没 ...

  8. Java中Scanner类

    java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序

  9. ngui 脚本绘制sprite

    public GameObject _background; public UIAtlas atlas; private Dictionary<int, UISprite> _allCar ...

  10. UVa 11082 (网络流建模) Matrix Decompressing

    网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...