打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
程序锁的实现
使用数据库存储上锁的包名。在服务中开启一个计时器定时检测最近开启的应用包名是否在数据库中。是就跳转到拦截Activity中,然后需要输入密码,若密码匹配就发送一个广播给在服务中注册的广播接收者,设定跳过包名,若跳过包名与栈顶包名一致就跳过跳转Activity操作。然而在此之前需要判断最近打开的应用是否还在运行,否则重置跳过包名,这样做是为了避免一次输入密码,多次使用。
返回与home键的处理,home键设定拦截Activity的某项属性为false,就可以避免被用户看到。
返回键重写返回处理函数。隐式Intent跳转到桌面。
代码如下
程序锁服务
public class LockAppService extends Service {
private boolean isWatch = true;
private AppLockDB mAppLockDB;
private ArrayList<String> mPackageNames;
private String mSkipPackageName;
private InnerReceiver innerReceiver;
private MyObserver myObserver;
private ActivityManager activityManager;

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
mAppLockDB = AppLockDB.getInstance(this);
mPackageNames = mAppLockDB.queryAll();
//注册广播接收者,来接收可以跳过的packagename(即输入密码后可以进入)
innerReceiver = new InnerReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.SKIP");
registerReceiver(innerReceiver, intentFilter);
//使用内容观察者监听数据库改变,实时更新被锁的包名列表
myObserver = new MyObserver(new Handler());
getContentResolver().registerContentObserver(Uri.parse("content://applock/change"), false, myObserver);
//获取活动管理者对象
//获取活动管理者对象
activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
watch();
}

class InnerReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
mSkipPackageName = intent.getStringExtra("packagename");
}
}

private void watch() {
new Thread(new Runnable() {
@Override
public void run() {

while (isWatch) {

//获得最近打开的任务栈信息
ActivityManager.RunningTaskInfo taskInfo = activityManager.getRunningTasks(1).get(0);
//获取栈顶的Activity包名。
String packageName = taskInfo.topActivity.getPackageName();
if(!packageName.equals(mSkipPackageName)) {
if (mPackageNames.contains(packageName)) {

Intent intent = new Intent(getApplicationContext(), InterceptActivity.class);
//在服务中开启Activity,要开启新栈,要添加开栈权限
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("packagename", packageName);
startActivity(intent);
}
}
//每500毫秒运行一次
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}

@Override
public void onDestroy() {
if (innerReceiver != null)
unregisterReceiver(innerReceiver);
if (myObserver != null)
getContentResolver().unregisterContentObserver(myObserver);
super.onDestroy();
}

class MyObserver extends ContentObserver {

/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public MyObserver(Handler handler) {
super(handler);
}

//当程序锁包名数据库改变时要重新获取数据库中的数据。
@Override
public void onChange(boolean selfChange) {
new Thread(new Runnable() {
@Override
public void run() {
mPackageNames = mAppLockDB.queryAll();
}
}).start();
super.onChange(selfChange);
}
}
拦截Activity
public class InterceptActivity  extends AppCompatActivity{
private String mPackageName;
private TextView mTvName;
private ImageView mIvIcon;
private Button mBtn;
private EditText mEdit;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intercept);
mPackageName = getIntent().getStringExtra("packagename");

initUI();
initData();
}

private void initData() {
try {
PackageManager pm =getPackageManager();
ApplicationInfo mAppInfo = pm.getApplicationInfo(mPackageName,0);

Drawable icon = mAppInfo.loadIcon(pm);

mIvIcon.setBackgroundDrawable(icon);
mTvName.setText(mAppInfo.loadLabel(pm).toString());
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String edit = mEdit.getText().toString();
if(TextUtils.isEmpty(edit))
{
Toast.makeText(getApplicationContext(),"密码不能为空",Toast.LENGTH_SHORT).show();
}
else
{
if(edit.equals("123"))
{
//发送一个广播通知服务不要拦截该应用,将该包名跳过
Intent intent = new Intent("android.intent.action.SKIP");
intent.putExtra("packagename",mPackageName);
sendBroadcast(intent);
finish();
}
else
{
Toast.makeText(getApplicationContext(),"密码输入错误",Toast.LENGTH_SHORT).show();
}
}
}
});
}

private void initUI() {
mTvName = (TextView) findViewById(R.id.intercept_appname);
mIvIcon = (ImageView) findViewById(R.id.intercept_appicon);
mBtn = (Button) findViewById(R.id.intercept_btn);
mEdit = (EditText) findViewById(R.id.intercept_edit);
}

@Override
public void onBackPressed() {
//返回开启桌面Activity
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
}
程序锁数据库
public class AppLockDB {
private AppLockDBHelper mBNDBH;
private static AppLockDB mBNDB;
private String mDataTable = "applock";
private static Context mContext;
private AppLockDB(Context context) {
mBNDBH = new AppLockDBHelper(context);
mContext=context;
}

public static AppLockDB getInstance(Context context) {
if (mBNDB == null) {
mBNDB = new AppLockDB(context);
}
return mBNDB;
}

public void insert(String packagename) {
SQLiteDatabase sd = mBNDBH.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("packagename", packagename);
sd.insert(mDataTable, null, cv);
sd.close();
//通知内容观察者数据库改变了
mContext.getContentResolver().notifyChange(Uri.parse("content://applock/change"),null);
}

public void Delete(String packagename) {
SQLiteDatabase sd = mBNDBH.getWritableDatabase();
int result =sd.delete(mDataTable, "packagename = ?", new String[]{packagename});
sd.close();
//通知内容观察者数据库改变了
mContext.getContentResolver().notifyChange(Uri.parse("content://applock/change"),null);
}
public void deleteAll()
{
SQLiteDatabase sd = mBNDBH.getWritableDatabase();
sd.delete(mDataTable,null,null);
}
public void Update(String phone, String mode) {
SQLiteDatabase sd = mBNDBH.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("mode", mode);
sd.update(mDataTable, cv, "phone=?", new String[]{phone});
sd.close();
}

public ArrayList<String> queryAll() {
SQLiteDatabase sd = mBNDBH.getWritableDatabase();
Cursor cursor = sd.query(mDataTable, new String[]{"packagename"}, null, null, null, null, "_id desc");
ArrayList<String> listBean = new ArrayList<String>();
while (cursor.moveToNext()) {
listBean.add(cursor.getString(0));
}
sd.close();
return listBean;
}
}
public class AppLockDBHelper extends SQLiteOpenHelper {
public AppLockDBHelper(Context context) {
super(context, "applock.db", null,1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table applock (_id integer primary key autoincrement ,packagename varchar(30));");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}
程序锁设置界面
public class AppLockActivity extends AppCompatActivity implements View.OnClickListener{

private Button mLockBtn;
private Button mUnLockBtn;
private LinearLayout mUnLockLL;
private LinearLayout mLockLL;
private TextView mLockTv;
private TextView mUnLockTv;
private ListView mUnLockListView;
private ListView mLockListView;
private Context mContext;
private LinearLayout mParent;
private ArrayList<AppInfoBean> mAppList;
private ArrayList<AppInfoBean> mUnLockList;
private ArrayList<AppInfoBean> mLockList;
private AppLockDB mAppLockDB;
private LockAdapter mLockAdapter;
private LockAdapter mUnLockAdapter;
private Handler mHandler = new Handler(new Handler.Callback() {



@Override
public boolean handleMessage(Message msg) {
mLockAdapter = new LockAdapter(true);
mLockListView.setAdapter(mLockAdapter);
mUnLockAdapter = new LockAdapter(false);
mUnLockListView.setAdapter(mUnLockAdapter);
WaitUtil.closeWait(mParent);
return false;
}
});
private TranslateAnimation mTranslateAnimation;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_applock);
mContext = this;
initUI();
initData();
}

private void initUI() {
mLockBtn = (Button) findViewById(R.id.applock_lockbtn);
mUnLockBtn = (Button) findViewById(R.id.applock_unlockbtn);
mUnLockLL = (LinearLayout) findViewById(R.id.applock_unlockLl);
mLockLL = (LinearLayout) findViewById(R.id.applock_lockLl);
mLockTv = (TextView) findViewById(R.id.applock_tvlock);
mUnLockTv = (TextView) findViewById(R.id.applock_tvunlock);
mUnLockListView = (ListView) findViewById(R.id.applock_unlocklist);
mLockListView = (ListView) findViewById(R.id.applock_locklist);
mParent = (LinearLayout) findViewById(R.id.applock_ll);
mLockBtn.setOnClickListener(this);
mUnLockBtn.setOnClickListener(this);
}

private void initData() {
WaitUtil.showWait(mContext, mParent);
new Thread(new Runnable() {
@Override
public void run() {
mAppList = AppInfoUtil.getAppInfoList(mContext);
mLockList = new ArrayList<AppInfoBean>();
mUnLockList = new ArrayList<AppInfoBean>();
mAppLockDB = AppLockDB.getInstance(mContext);
ArrayList<String> packageNameList = mAppLockDB.queryAll();
for (AppInfoBean bean : mAppList) {
if (packageNameList.contains(bean.packageName)) {
mLockList.add(bean);
} else {
mUnLockList.add(bean);
}
}
mHandler.sendEmptyMessage(0);
}
}).start();
mLockBtn.setBackgroundColor(Color.GRAY);
mUnLockBtn.setBackgroundColor(Color.GREEN);
mLockLL.setVisibility(View.GONE);
mUnLockLL.setVisibility(View.VISIBLE);
initTranslateAnimation();
}

@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.applock_unlockbtn:
mLockLL.setVisibility(View.GONE);
mUnLockLL.setVisibility(View.VISIBLE);
mLockBtn.setBackgroundColor(Color.GRAY);
mUnLockBtn.setBackgroundColor(Color.GREEN);
break;
case R.id.applock_lockbtn:
mUnLockLL.setVisibility(View.GONE);
mLockLL.setVisibility(View.VISIBLE);
mUnLockBtn.setBackgroundColor(Color.GRAY);
mLockBtn.setBackgroundColor(Color.GREEN);
break;

}
}
private void initTranslateAnimation()
{
mTranslateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1,Animation.RELATIVE_TO_SELF,0,
Animation.RELATIVE_TO_SELF,0
);
mTranslateAnimation.setDuration(500);

}
class LockAdapter extends BaseAdapter{
private boolean mIsLock;

public LockAdapter(boolean isLock) {
mIsLock = isLock;
}

@Override
public int getCount() {

if (mIsLock) {
mLockTv.setText("加锁应用总数:"+mLockList.size());
return mLockList.size();
}
else {
mUnLockTv.setText("未加锁应用总数:"+mUnLockList.size());
return mUnLockList.size();
}
}

@Override
public Object getItem(int position) {
if (mIsLock)
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 viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(mContext, R.layout.locklist_item, null);
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.lock_tv);
viewHolder.iv_lock = (ImageView) convertView.findViewById(R.id.lock_ivlock);
viewHolder.iv_name = (ImageView) convertView.findViewById(R.id.lock_ivapp);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final AppInfoBean appInfoBean = (AppInfoBean) getItem(position);
viewHolder.tv_name.setText(appInfoBean.name);
if (mIsLock)
viewHolder.iv_lock.setBackgroundResource(R.mipmap.lock);
else
viewHolder.iv_lock.setBackgroundResource(R.mipmap.unlock);
viewHolder.iv_name.setBackgroundDrawable(appInfoBean.icon);
final View animationView = convertView;
viewHolder.iv_lock.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTranslateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
if(mIsLock)
{
mLockList.remove(appInfoBean);
mUnLockList.add(appInfoBean);
mAppLockDB.Delete(appInfoBean.packageName);
mLockAdapter.notifyDataSetChanged();
}
else
{
mLockList.add(appInfoBean);
mUnLockList.remove(appInfoBean);
mAppLockDB.insert(appInfoBean.packageName);
mUnLockAdapter.notifyDataSetChanged();
}
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});
animationView.startAnimation(mTranslateAnimation);

}
});
return convertView;
}
拦截Activity清单文件配置
<!--拦截Activity单独占一个栈,exclude为false不显示图标-->
<activity android:name=".activity.InterceptActivity" android:launchMode="singleInstance"
android:excludeFromRecents="true">
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
探讨一种新型的双进程守护应用保活方法
aidl 中通过RemoteCallbackList 运用到的回调机制: service回调activity的方法
“翻转静音”的Android实现
Android拍照,上传,预览综合【修改】
Android Service服务(三) bindService与remoteServic...
Android BLE4.0通信之计步、体重、血压
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服