Android程序锁的实现以及逻辑

Android程序锁的实现以及逻辑,第1张

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

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

效果如下:

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.程序锁必须在服务中去维护

①基本思路

判断当前开启的应用(现在手机可见任务栈) 如果开启的应用在已加锁的列表中,d出拦截界面 看门狗服务,一直(死循环(子线程,可控))对开启的应用做监听
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.拿此包名在已加锁的包名集合中去做比对,如果包含次包名,则需要d出拦截界面   if(mPacknameList.contains(packagename)){   //如果现在检测的程序,以及解锁了,则不需要去d出拦截界面   if(!packagename.equals(mSkipPackagename)){    //7,d出拦截界面    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" />

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

总结

以上是内存溢出为你收集整理的Android程序锁的实现以及逻辑全部内容,希望文章能够帮你解决Android程序锁的实现以及逻辑所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存