手机安全卫士09

 1.程序锁的ui界面

(1)ListView长点击事件
 setOnItemLongClickListener();
(2)用数据库保存,加锁包名,

2.程序锁工作的原理

(1)覆盖
(2)获取系统堆栈信息,需要权限
GET_Task
(3)新建服务,获取任务栈最顶部的activity,即用户操作的activity。
a.看门狗
private void startWatDog() {
		
		new Thread(){
			public void run() {
				falg = true;
				while (falg) {
					//由于这个狗一直在后台运行。为了避免程序阻塞。
					//获取到当前正在运行的任务栈
					List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
					//获取到最上面的进程
					RunningTaskInfo taskInfo = tasks.get(0);
					//获取到最顶端应用程序的包名
					String packageName = taskInfo.topActivity.getPackageName();
					
					System.out.println(packageName);
					//让狗休息一会
					SystemClock.sleep(30);
					//直接从数据库里面查找当前的数据
					//这个可以优化。改成从内存当中寻找
					if(appLockInfos.contains(packageName)){  
//					if(dao.find(packageName)){
//						System.out.println("在程序锁数据库里面");
						
						//说明需要临时取消保护
						//是因为用户输入了正确的密码
						if(packageName.equals(tempStopProtectPackageName)){
							
						}else{
							Intent intent = new Intent(WatchDogService.this,EnterPwdActivity.class);
							/**
							 * 需要注意:如果是在服务里面往activity界面跳的话。需要设置flag
							 */
							intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
							//停止保护的对象
							intent.putExtra("packageName", packageName);
							
							startActivity(intent);
						}
						
						
						
					}
					
					
					
				}
				
				
			};
		}.start();
	}
不停的判断用户使用哪个程序,如果是加锁程序,就立刻跳入输入密码的Activity

b.开启代码


3.程序锁的主体功能完成

(1)关闭输入密码的对话框
finish();
(2)通过广播在activity向服务发消息
(3)输入密码的Activity
public class EnterPwdActivity extends Activity implements OnClickListener {

	private EditText et_pwd;
	private Button bt_0;
	private Button bt_1;
	private Button bt_2;
	private Button bt_3;
	private Button bt_4;
	private Button bt_5;
	private Button bt_6;
	private Button bt_7;
	private Button bt_8;
	private Button bt_9;
	private Button bt_clean_all;
	private Button bt_delete;
	private Button bt_ok;
	private String packageName;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_set_pwd);
		initUI();
	}

	private void initUI() {

		Intent intent = getIntent();

		if (intent != null) {
			packageName = intent.getStringExtra("packageName");
		}

		et_pwd = (EditText) findViewById(R.id.et_pwd);

		// 隐藏当前的键盘
		et_pwd.setInputType(InputType.TYPE_NULL);

		bt_0 = (Button) findViewById(R.id.bt_0);
		bt_1 = (Button) findViewById(R.id.bt_1);
		bt_2 = (Button) findViewById(R.id.bt_2);
		bt_3 = (Button) findViewById(R.id.bt_3);
		bt_4 = (Button) findViewById(R.id.bt_4);
		bt_5 = (Button) findViewById(R.id.bt_5);
		bt_6 = (Button) findViewById(R.id.bt_6);
		bt_7 = (Button) findViewById(R.id.bt_7);
		bt_8 = (Button) findViewById(R.id.bt_8);
		bt_9 = (Button) findViewById(R.id.bt_9);

		bt_ok = (Button) findViewById(R.id.bt_ok);

		bt_ok.setOnClickListener(this);

		bt_clean_all = (Button) findViewById(R.id.bt_clean_all);

		bt_delete = (Button) findViewById(R.id.bt_delete);
		// 清空
		bt_clean_all.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				et_pwd.setText("");
			}
		});
		// 删除
		bt_delete.setOnClickListener(new OnClickListener() {

			private String str;

			@Override
			public void onClick(View v) {

				str = et_pwd.getText().toString();

				if (str.length() == 0) {
					return;
				}

				et_pwd.setText(str.substring(0, str.length() - 1));

			}
		});

		bt_0.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_0.getText().toString());
			}
		});
		bt_1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_1.getText().toString());
			}
		});
		bt_2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_2.getText().toString());
			}
		});
		bt_3.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_3.getText().toString());
			}
		});
		bt_4.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_4.getText().toString());
			}
		});
		bt_5.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_5.getText().toString());
			}
		});
		bt_6.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_6.getText().toString());
			}
		});
		bt_7.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_7.getText().toString());
			}
		});
		bt_8.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_8.getText().toString());
			}
		});
		bt_9.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String str = et_pwd.getText().toString();
				et_pwd.setText(str + bt_9.getText().toString());
			}
		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_ok:
			String result = et_pwd.getText().toString();
			if ("123".equals(result)) {
				// 如果密码正确。说明是自己人
				/**
				 * 是自己家人。不要拦截他
				 */
				System.out.println("密码输入正确");

				Intent intent = new Intent();
				// 发送广播。停止保护
				intent.setAction("com.itheima.mobileguard.stopprotect");
				// 跟狗说。现在停止保护短信
				intent.putExtra("packageName", packageName);

				sendBroadcast(intent);

				finish();

			} else {
				UIUtils.showToast(EnterPwdActivity.this, "密码错误");
			}

			break;

		}

	}

	// 监听当前页面的后退健
	// <intent-filter>
	// <action android:name="android.intent.action.MAIN" />
	// <category android:name="android.intent.category.HOME" />
	// <category android:name="android.intent.category.DEFAULT" />
	// <category android:name="android.intent.category.MONKEY"/>
	// </intent-filter>
	@Override
	public void onBackPressed() {
		// 当用户输入后退健 的时候。我们进入到桌面
		Intent intent = new Intent();
		intent.setAction("android.intent.action.MAIN");
		intent.addCategory("android.intent.category.HOME");
		intent.addCategory("android.intent.category.DEFAULT");
		intent.addCategory("android.intent.category.MONKEY");
		startActivity(intent);
	}

}

(4)服务完整代码
public class WatchDogService extends Service {

	private ActivityManager activityManager;
	private AppLockDao dao;   //操作数据库

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	//临时停止保护的包名
	private String tempStopProtectPackageName;
	
	private class WatchDogReceiver extends BroadcastReceiver{

		

		@Override
		public void onReceive(Context context, Intent intent) {
			
			if(intent.getAction().equals("com.itheima.mobileguard.stopprotect")){
				//获取到停止保护的对象
				
				tempStopProtectPackageName = intent.getStringExtra("packageName");
			}else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
				tempStopProtectPackageName = null;
				// 让狗休息
				falg = false;
			}else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
				//让狗继续干活
				if(falg == false){
					startWatDog();
				}
			}
			
			
		}
		
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		
		
		dao = new AppLockDao(this);
		
		appLockInfos = dao.findAll();
		
		//注册广播接受者
		
		
		receiver = new WatchDogReceiver();
		
		IntentFilter filter = new IntentFilter();
		//停止保护
		filter.addAction("com.itheima.mobileguard.stopprotect");
		
		//注册一个锁屏的广播
		/**
		 * 当屏幕锁住的时候。狗就休息
		 * 屏幕解锁的时候。让狗活过来
		 */
		filter.addAction(Intent.ACTION_SCREEN_OFF);
		
		filter.addAction(Intent.ACTION_SCREEN_ON);
		
		
		registerReceiver(receiver, filter);
		
		
		
		//获取到进程管理器
		
		activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
		
		
		
		//1 首先需要获取到当前的任务栈
		
		//2取任务栈最上面的任务
		
		startWatDog();
	}
	//标记当前的看萌狗是否停下来
	private boolean falg = false;
	private List<String> appLockInfos;
	private WatchDogReceiver receiver;
	
	private void startWatDog() {
		
		new Thread(){
			public void run() {
				falg = true;
				while (falg) {
					//由于这个狗一直在后台运行。为了避免程序阻塞。
					//获取到当前正在运行的任务栈
					List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
					//获取到最上面的进程
					RunningTaskInfo taskInfo = tasks.get(0);
					//获取到最顶端应用程序的包名
					String packageName = taskInfo.topActivity.getPackageName();
					
					System.out.println(packageName);
					//让狗休息一会
					SystemClock.sleep(30);
					//直接从数据库里面查找当前的数据
					//这个可以优化。改成从内存当中寻找
					if(appLockInfos.contains(packageName)){  
//					if(dao.find(packageName)){
//						System.out.println("在程序锁数据库里面");
						
						//说明需要临时取消保护
						//是因为用户输入了正确的密码
						if(packageName.equals(tempStopProtectPackageName)){
							
						}else{
							Intent intent = new Intent(WatchDogService.this,EnterPwdActivity.class);
							/**
							 * 需要注意:如果是在服务里面往activity界面跳的话。需要设置flag
							 */
							intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
							//停止保护的对象
							intent.putExtra("packageName", packageName);
							
							startActivity(intent);
						}
						
						
						
					}
					
					
					
				}
				
				
			};
		}.start();
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		falg = false;
		unregisterReceiver(receiver);
		receiver = null;
	}

}

4.利用activity的启动模式修复bug

(1)任务栈问题


5.最近任务列表移除

(1)在Activity配置中加入
android:exclideFormRecents="true"

6.程序锁的完成


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值