Android程序锁的实现以及逻辑

本项目是一个比较有趣的项目源码,可以给其他项目加锁,程序锁的原理是一个“看门狗”的服务定时监视顶层activity,如果activity对应的包名是之前上锁的应用程序的,则弹出一个页面要求输入解锁密码。

效果如下:

1.基本思路

①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中

②.已加锁+未加锁 == 手机中所有应用(AppInfoProvider)

2.已加锁和未加锁的数据适配器

class MyAdapter extends BaseAdapter{ private boolean isLock; /** * @param isLock 用于区分已加锁和未加锁应用的标示 true已加锁数据适配器 false未加锁数据适配器 */ public MyAdapter(boolean isLock) { this.isLock = isLock; } @Override public int getCount() { if(isLock){ tv_lock.setText("已加锁应用:"+mLockList.size()); return mLockList.size(); }else{ tv_unlock.setText("未加锁应用:"+mUnLockList.size()); return mUnLockList.size(); } } @Override public AppInfo getItem(int position) { if(isLock){ return mLockList.get(position); }else{ return mUnLockList.get(position); } } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView == null){ convertView = View.inflate(getApplicationContext(), R.layout.listview_islock_item, null); holder = new ViewHolder(); holder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon); holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); holder.iv_lock = (ImageView) convertView.findViewById(R.id.iv_lock); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } final AppInfo appInfo = getItem(position); final View animationView = convertView; holder.iv_icon.setBackgroundDrawable(appInfo.icon); holder.tv_name.setText(appInfo.name); if(isLock){ holder.iv_lock.setBackgroundResource(R.drawable.lock); }else{ holder.iv_lock.setBackgroundResource(R.drawable.unlock); } holder.iv_lock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //添加动画效果,动画默认是非阻塞的,所以执行动画的同时,动画以下的代码也会执行 animationView.startAnimation(mTranslateAnimation);//500毫秒 //对动画执行过程做事件监听,监听到动画执行完成后,再去移除集合中的数据,操作数据库,刷新界面 mTranslateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { //动画开始的是调用方法 } @Override public void onAnimationRepeat(Animation animation) { //动画重复时候调用方法 } //动画执行结束后调用方法 @Override public void onAnimationEnd(Animation animation) { if(isLock){ //已加锁------>未加锁过程 //1.已加锁集合删除一个,未加锁集合添加一个,对象就是getItem方法获取的对象 mLockList.remove(appInfo); mUnLockList.add(appInfo); //2.从已加锁的数据库中删除一条数据 mDao.delete(appInfo.packageName); //3.刷新数据适配器 mLockAdapter.notifyDataSetChanged(); }else{ //未加锁------>已加锁过程 //1.已加锁集合添加一个,未加锁集合移除一个,对象就是getItem方法获取的对象 mLockList.add(appInfo); mUnLockList.remove(appInfo); //2.从已加锁的数据库中插入一条数据 mDao.insert(appInfo.packageName); //3.刷新数据适配器 mUnLockAdapter.notifyDataSetChanged(); } } }); } }); return convertView; } } mLockAdapter = new MyAdapter(true); lv_lock.setAdapter(mLockAdapter); mUnLockAdapter = new MyAdapter(false); lv_unlock.setAdapter(mUnLockAdapter);

3.已加锁和未加锁条目点击事件处理

holder.iv_lock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //添加动画效果,动画默认是非阻塞的,所以执行动画的同时,动画以下的代码也会执行 animationView.startAnimation(mTranslateAnimation);//500毫秒 //对动画执行过程做事件监听,监听到动画执行完成后,再去移除集合中的数据,操作数据库,刷新界面 mTranslateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { //动画开始的是调用方法 } @Override public void onAnimationRepeat(Animation animation) { //动画重复时候调用方法 } //动画执行结束后调用方法 @Override public void onAnimationEnd(Animation animation) { if(isLock){ //已加锁------>未加锁过程 //1.已加锁集合删除一个,未加锁集合添加一个,对象就是getItem方法获取的对象 mLockList.remove(appInfo); mUnLockList.add(appInfo); //2.从已加锁的数据库中删除一条数据 mDao.delete(appInfo.packageName); //3.刷新数据适配器 mLockAdapter.notifyDataSetChanged(); }else{ //未加锁------>已加锁过程 //1.已加锁集合添加一个,未加锁集合移除一个,对象就是getItem方法获取的对象 mLockList.add(appInfo); mUnLockList.remove(appInfo); //2.从已加锁的数据库中插入一条数据 mDao.insert(appInfo.packageName); //3.刷新数据适配器 mUnLockAdapter.notifyDataSetChanged(); } } }); } });

4.程序锁必须在服务中去维护

①基本思路

判断当前开启的应用(现在手机可见任务栈) 如果开启的应用在已加锁的列表中,弹出拦截界面 看门狗服务,一直(死循环(子线程,可控))对开启的应用做监听

public class WatchDogService extends Service { private boolean isWatch; private AppLockDao mDao; private List<String> mPacknameList; private InnerReceiver mInnerReceiver; private String mSkipPackagename; private MyContentObserver mContentObserver; @Override public void onCreate() { //维护一个看门狗的死循环,让其时刻监测现在开启的应用,是否为程序锁中要去拦截的应用 mDao = AppLockDao.getInstance(this); isWatch = true; watch(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.SKIP"); mInnerReceiver = new InnerReceiver(); registerReceiver(mInnerReceiver, intentFilter); //注册一个内容观察者,观察数据库的变化,一旦数据有删除或者添加,则需要让mPacknameList重新获取一次数据 mContentObserver = new MyContentObserver(new Handler()); getContentResolver().registerContentObserver( Uri.parse("content://applock/change"), true, mContentObserver); super.onCreate(); } class MyContentObserver extends ContentObserver{ public MyContentObserver(Handler handler) { super(handler); } //一旦数据库发生改变时候调用方法,重新获取包名所在集合的数据 @Override public void onChange(boolean selfChange) { new Thread(){ public void run() { mPacknameList = mDao.findAll(); }; }.start(); super.onChange(selfChange); } } class InnerReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //获取发送广播过程中传递过来的包名,跳过次包名检测过程 mSkipPackagename = intent.getStringExtra("packagename"); } } private void watch() { //1,子线程中,开启一个可控死循环 new Thread(){ public void run() { mPacknameList = mDao.findAll(); while(isWatch){ //2.监测现在正在开启的应用,任务栈 //3.获取activity管理者对象 ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); //4.获取正在开启应用的任务栈 List<RunningTaskInfo> runningTasks = am.getRunningTasks(1); RunningTaskInfo runningTaskInfo = runningTasks.get(0); //5.获取栈顶的activity,然后在获取此activity所在应用的包名 String packagename = runningTaskInfo.topActivity.getPackageName(); //如果任务栈指向应用有切换,将mSkipPackagename空字符串 //6.拿此包名在已加锁的包名集合中去做比对,如果包含次包名,则需要弹出拦截界面 if(mPacknameList.contains(packagename)){ //如果现在检测的程序,以及解锁了,则不需要去弹出拦截界面 if(!packagename.equals(mSkipPackagename)){ //7,弹出拦截界面 Intent intent = new Intent(getApplicationContext(),EnterPsdActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packagename", packagename); startActivity(intent); } } //睡眠一下,时间片轮转 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onDestroy() { //停止看门狗循环 isWatch = false; //注销广播接受者 if(mInnerReceiver!=null){ unregisterReceiver(mInnerReceiver); } //注销内容观察者 if(mContentObserver!=null){ getContentResolver().unregisterContentObserver(mContentObserver); } super.onDestroy(); } } public class EnterPsdActivity extends Activity { private String packagename; private TextView tv_app_name; private ImageView iv_app_icon; private EditText et_psd; private Button bt_submit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取包名 packagename = getIntent().getStringExtra("packagename"); setContentView(R.layout.activity_enter_psd); initUI(); initData(); } private void initData() { //通过传递过来的包名获取拦截应用的图标以及名称 PackageManager pm = getPackageManager(); try { ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename,0); Drawable icon = applicationInfo.loadIcon(pm); iv_app_icon.setBackgroundDrawable(icon); tv_app_name.setText(applicationInfo.loadLabel(pm).toString()); } catch (NameNotFoundException e) { e.printStackTrace(); } bt_submit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String psd = et_psd.getText().toString(); if(!TextUtils.isEmpty(psd)){ if(psd.equals("123")){ //解锁,进入应用,告知看门口不要再去监听以及解锁的应用,发送广播 Intent intent = new Intent("android.intent.action.SKIP"); intent.putExtra("packagename",packagename); sendBroadcast(intent); finish(); }else{ ToastUtil.show(getApplicationContext(), "密码错误"); } }else{ ToastUtil.show(getApplicationContext(), "请输入密码"); } } }); } private void initUI() { tv_app_name = (TextView) findViewById(R.id.tv_app_name); iv_app_icon = (ImageView) findViewById(R.id.iv_app_icon); et_psd = (EditText) findViewById(R.id.et_psd); bt_submit = (Button) findViewById(R.id.bt_submit); } @Override public void onBackPressed() { //通过隐式意图,跳转到桌面 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); super.onBackPressed(); } }

5.隐藏最近打开的activity

<activity android:excludeFromRecents="true" android:name="com.itheima.mobilesafe.EnterPwdActivity" android:launchMode="singleInstance" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-08 23:59:30

Android程序锁的实现以及逻辑的相关文章

Android程序锁的实现以及逻辑_Android

本项目是一个比较有趣的项目源码,可以给其他项目加锁,程序锁的原理是一个"看门狗"的服务定时监视顶层activity,如果activity对应的包名是之前上锁的应用程序的,则弹出一个页面要求输入解锁密码. 效果如下: 1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvider) 2.已加锁和未加锁的数据适配器 class MyAdapter ex

android安全问题(二) 程序锁

某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让 别人知道这是个什么软件,起码不想让别人打开浏览.而这款软件又没有锁,任何人都可以打开,肿么办呢? 如果打开它的时候需要输入密码,那该多好阿!于是,程序锁这种应用就产生了 程序锁不是最近才有 的,很久之前android就有这种apk了 这一期我们来苛刻如何实现程序加锁功能 首先,我们先明 确一下我们要做的程序具有什么功能 1可以选择需要加锁的程序 2可以设置密码 3可以关 闭程序锁 这里作为演示,我们就尽

Android开发之开门狗在程序锁中的应用实例_Android

本文实例讲述了Android开发之开门狗在程序锁中的应用方法.分享给大家供大家参考,具体如下: protected static final String TAG = "WatchDogService"; private AppLockDao dao; private List<String> lockApps; private ActivityManager am; private Intent lockappintent; @Override public IBinde

android手机程序锁如何重复广播重复解锁

问题描述 android手机程序锁如何重复广播重复解锁 求助,现在实现了在我写的应用中给手机中的软件加锁,应用接收到广播之后,打开程序进入程序锁页面后输入密码进入应用,我想问一下,怎么实现解锁后,不停止service的情况下,下次进入这个程序还继续输入密码,重复输入过程,只要我的应用中不给他解锁,他就一直有输入密码页面,我试了一下,输入密码正确后,加锁页面就finish掉后,进入应用,但是他又弹出来了.

Android 开发程序锁应用简单实例_Android

1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvider) 2.已加锁和未加锁的数据适配器 class MyAdapter extends BaseAdapter{ private boolean isLock; /** * @param isLock 用于区分已加锁和未加锁应用的标示 true已加锁数据适配器 false未加锁数据适配器 */ pub

Android程序开发仿新版QQ锁屏下弹窗功能_Android

新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是View QQ的弹窗一开始我以为是悬浮View,用WindowManager去添加,但是无论如何就是不显示,后来在朋友提示下换成Activity来实现,在锁屏状态下就能弹窗了. 2.Activity的设置 Activity需要进行以下设置,才可以在锁屏状态下弹窗. 首先是onCreate方法,需要添加

Android一键锁屏开发全过程

一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 ------------------------ 二.项目流程:   001 三.项目代码 002 1.主程序代码: 003 Java代码  004 private DevicePolicyManager policyManager;  005 private ComponentName componentName;  006     007 @Override  008 protected void onC

!请关注,一个程序锁的小应用

问题描述 看到网上好多应用,有一个比较喜欢,就是程序锁,所以自己也想做一个,现在做了个初始版本,但是好多功能都不靠谱,其中一个最重要的就是当加锁的应用启动或者重新打开的时候弹出提示框,输入密码,现在的做法是定时器监听进程,当监听到加锁应用是弹出提示,成功了,但是输入正确的密码后,由于是进程,所以又弹出提示了,现在考虑正确的做法应该是当应用启动的时候或者重新打开的时候才去弹出提示,在后台运行的时候不弹提示.由于是新手,很多技术都不懂,请帮忙~~~帮忙看用什么方法来监听应用的启动或重启,又或者应用在

android-解决程序锁重复解锁的问题?

问题描述 解决程序锁重复解锁的问题? 我写了一个程序锁,但输入密码,点击确定后,仍然出现解锁界面,请问如何解决?(最好有代码) 解决方案 你的程序判断密码的逻辑有没有问题.你自己没有提供代码,怎么能要求别人提供代码.提供了代码也和你的不配啊. 解决方案二: 判断逻辑有问题,既然成功了,最简单的办法,设置一个变量,表明是否成功 解决方案三: 那肯定有一句比较的代码,把比较的2个数据(我不知道你是用什么存储的)打印出来看就知道哪里错了 解决方案四: 初步估计是判断逻辑出错,导致跳转到另一个activ