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.프로그램 잠 금 은 서비스 에서 유지 해 야 합 니 다.

① 기본 적 인 사고
4
  • 현재 열 린 응용(현재 핸드폰 에서 볼 수 있 는 퀘 스 트 스 택)을 판단 합 니 다
  • 열 린 응용 프로그램 이 잠 긴 목록 에 있 으 면 팝 업 차단 인터페이스
  • 4.567917.문 지 키 는 개 서 비 스 는 계속(순환(서브 스 레 드,제어 가능)열 린 응용 에 대해 감청 을 한다.
    
    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" />
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기