android开发——手机应用管理器的实现

Home / Android MrLee 2015-9-3 3837

为了保护自己的隐私或者是手机权限管理,有时候是需要对程序启动作一个保护。那么下面代码就可以实现对其它的程序进行管理,加锁(需要密码启动)


package com.xinhui.service;
import java.util.ArrayList;
import java.util.List;
import com.xinhui.data.HandleDB;
import com.xinhui.ui.LockAppActivity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
 * 类名称:WatchAppService 
 * 类描述:监听应用程序的后台服务,并对启动的应用程序进行操作
 * 创建人:LXH 
 * 创建时间:2013-10-21 上午10:30:00 
 */
public class WatchAppService extends Service {
	private HandleDB handleDB;
	private boolean flag = true;
	private Intent intentLockAppActivity;
	private ActivityManager activityManager;
	public static String runningApp = null;
	public static String lastRunningApp = null;
	//public static boolean isLock = false;
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.e("info", "service已经启动");
		handleDB = new HandleDB(this);
		intentLockAppActivity = new Intent(this,LockAppActivity.class);
		// 服务里面是没有任务栈的,所以要指定一个新的任务栈,不然是无法在服务里面启动activity的  
		//intentLockAppActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
		activityManager = (ActivityManager) getSystemService(Service.ACTIVITY_SERVICE);
		new ArrayList(); 
		
		new Thread(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				super.run();
				while(flag){
					try{
						 // 得到当前运行的任务栈,参数就是得到多少个任务栈,1就是只拿一个任务栈  
	                    // 对应的也就是正在运行的任务栈啦 ,注意别忘了在清单文件中添加获取的权限
						List runTaskInfos = 
								activityManager.getRunningTasks(1);
						//拿到当前运行的任务栈 
						RunningTaskInfo runningTaskInfo = runTaskInfos.get(0);
						//拿到要运行的Activity的包名
						String runningpackageName = runningTaskInfo.topActivity.getPackageName();
						//判断监听的运行包是否加锁
						if(handleDB.find(runningpackageName)){
							runningApp = runningpackageName;
							//解决反复出现验证页面BUG:
							//如果runningApp.equals(lastRunningApp)=true
							//则说明当前栈顶运行的程序已经解锁了
							if((runningApp.equals(lastRunningApp)) == false){
								intentLockAppActivity.putExtra("packageName", runningpackageName);
								intentLockAppActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
								startActivity(intentLockAppActivity);
							}
						}else{
							
						}
						//让线程每半秒执行一次
						sleep(500);
					}catch(InterruptedException e){
						e.printStackTrace(); 
					}
					
				}
			}
		}.start();
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		//flag = false;
	}
}

 
package com.xinhui.ui;
import android.graphics.drawable.Drawable;
/**
 * 类名称:AppInfo 
 * 类描述:应用程序类,包括了程序相关属性
 * 创建人:LXH 
 * 创建时间:2013-10-21 上午10:30:00 
 */
public class AppInfo {
	private Drawable icon;
	private String appName;
	private String packageName;
	private boolean isSystemApp;
	private long codesize;
	public long getCodesize() {
		return codesize;
	}
	public void setCodesize(long codesize) {
		this.codesize = codesize;
	}
	public Drawable getIcon() {
		return icon;
	}
	public void setIcon(Drawable icon) {
		this.icon = icon;
	}
	public String getAppName() {
		return appName;
	}
	public void setAppName(String appName) {
		this.appName = appName;
	}
	public String getPackageName() {
		return packageName;
	}
	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}
	public boolean isSystemApp() {
		return isSystemApp;
	}
	public void setSystemApp(boolean isSystemApp) {
		this.isSystemApp = isSystemApp;
	}
	
}

 
package com.xinhui.ui;
import com.xinhui.appsystem.R;
import com.xinhui.service.WatchAppService;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
 * 类名称:LockAppActivity 
 * 类描述:系统锁页面
 * 创建人:LXH 
 * 创建时间:2013-10-21 上午10:30:00 
 */
public class LockAppActivity extends Activity implements OnClickListener,OnTouchListener{
	
	private ImageView ivLockAppIcon;
	private TextView tvLockAppName;
	private EditText etInputPwd;
	private Button btnConfirm;
	private String packageName;
	private String passWord;
	private SharedPreferences preferences;
	//public static boolean isLock;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.input_pwd);
		//WatchAppService.isLock = false;
		Log.e("test", "onCreate--->");
		ivLockAppIcon = (ImageView) findViewById(R.id.iv_lock_app_icon);  
		tvLockAppName = (TextView) findViewById(R.id.tv_lock_app_name);  
		etInputPwd = (EditText) findViewById(R.id.et_lock_pwd);
		etInputPwd.setOnTouchListener(this);
		btnConfirm = (Button) findViewById(R.id.btn_confirm);
		btnConfirm.setOnClickListener(this);
		packageName = getIntent().getStringExtra("packageName");
		
		try {
			//通过包名拿到applicationInfo
			ApplicationInfo appInfo = getPackageManager().getPackageInfo(packageName, 0).applicationInfo;
			//应用图标  
            Drawable app_icon = appInfo.loadIcon(getPackageManager());  
            //应用的名字  
            String app_name = appInfo.loadLabel(getPackageManager()).toString();
            ivLockAppIcon.setImageDrawable(app_icon);  
            tvLockAppName.setText(app_name);  
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			 e.printStackTrace();
		}
		
	}
	//不让用户按后退键  
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		//屏蔽后退键  
        if(KeyEvent.KEYCODE_BACK == event.getKeyCode())  
        {  
            return true;//阻止事件继续向下分发  
        }  
        return super.onKeyDown(keyCode, event); 
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		String input = etInputPwd.getText().toString().trim();
		preferences = getSharedPreferences("passWord", MODE_PRIVATE);
		passWord = preferences.getString("pwd", "");
        if(TextUtils.isEmpty(input))  
        {  
            Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();  
        }  
        else if(passWord.equals(input))  
        { 
        	WatchAppService.lastRunningApp = WatchAppService.runningApp;//这里赋值,终于解决了反复弹出验证页面的BUG
            finish();  
        }  
        else  
        {  
            Toast.makeText(this, "密码错误", Toast.LENGTH_SHORT).show();
            etInputPwd.setText("");//置空
        }  
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		//这样是在触摸到控件时,软键盘才会显示出来
		int inputback = etInputPwd.getInputType();  
		etInputPwd.setInputType(InputType.TYPE_NULL);  
        new KeyboardUtil(this, this, etInputPwd).showKeyboard();  
        etInputPwd.setInputType(inputback); 
		return false;
	}
	
}

项目源码:  AppSystem

本文链接:https://www.it72.com/5475.htm

推荐阅读
最新回复 (1)
  • kubopw 2015-9-3
    引用 2
    android5.1.1经测试应用锁无效,可能是有地方没处理好。4.4.4之前都正常使用!
返回