Android 프로그램 잠 금 의 실현 및 논리
효 과 는 다음 과 같 습 니 다:
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
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" />
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.