之前幾篇文章我們介紹瞭如何去獲取手機應用程序列表,已經實現對應用程序的一些操作:運行、卸載、分享。這個三個功能相對是比較簡單,對於如何實現對一個應用程序加鎖,這個相對複雜一點。在一些情況下,我們想對一個軟件加鎖,來保護我們的隱私或者增加安全,比如支付寶、銀行軟件,這些軟件加鎖都是有必要。前一段時間一直忙於項目,沒對博客進行跟進,今天我們將介紹一下如何實現軟件加鎖。大家先看看實現的效果圖(我們以加鎖UC爲例):
UC之前顯示沒有加鎖狀態 選擇加鎖UC 運行UC顯示驗證頁面
一、實現流程:
首先我們將要加鎖的應用程序放到數據庫中,然後開啓一個服務監聽棧頂應用程序,將當前棧頂應用程序與數據庫加密應用程序進行匹配,匹配成功,則彈出身份驗證頁面。
我們需要注意的是身份驗證通過之後,不能重複出現驗證密碼頁面,這個需要一些邏輯上的判斷。
將要加鎖的應用程序存放到數據庫中:
String itemPackageName = item.getPackageName();
String pwd = preferencesPwd.getString("pwd", "");
if(tv_app_lock.getText().equals("加鎖")){
if(TextUtils.isEmpty(pwd)){
setPassWord(itemPackageName);
}else{
handleDB.add(itemPackageName);
Toast.makeText(MainActivity.this, "加鎖成功", Toast.LENGTH_SHORT).show();
}
}else if(tv_app_lock.getText().equals("解鎖")){
unLock(itemPackageName);
}
adapter.notifyDataSetChanged();
開啓服務,用於監聽棧頂:
// 得到當前運行的任務棧,參數就是得到多少個任務棧,1就是隻拿一個任務棧
// 對應的也就是正在運行的任務棧啦 ,注意別忘了在清單文件中添加獲取的權限
List<RunningTaskInfo> 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);
}
}
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;
}
自定義軟件盤的實現這裏將不再細說,具體請參考先前文章http://blog.csdn.net/acrambler/article/details/13020057第一次進行加鎖,會要求先設置密碼:
//設置密碼
public void setPassWord(final String itemPackageName){
new AlertDialog.Builder(this).setTitle("設置安全鎖密鑰").setIcon(R.drawable.ic_setting_pwd)
.setView(viewSetPwd)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if((etPwd1.getText().toString()).equals(etPwd2.getText().toString())){
if(TextUtils.isEmpty(etPwd1.getText().toString()) | TextUtils.isEmpty(etPwd2.getText().toString())){
Toast.makeText(MainActivity.this, "密碼不能爲空", Toast.LENGTH_SHORT).show();
boolean isVisible = false;
dialogView(dialog,isVisible);
}else{
editor.putString("pwd", etPwd1.getText().toString());
editor.commit();
handleDB.add(itemPackageName);
Toast.makeText(MainActivity.this, "密碼設置成功", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "加鎖成功", Toast.LENGTH_SHORT).show();
boolean isVisible = true;
dialogView(dialog,isVisible);
}
}else{
etPwd1.setText("");
etPwd2.setText("");
Toast.makeText(MainActivity.this, "兩次密碼不相同", Toast.LENGTH_SHORT).show();
boolean isVisible = false;
dialogView(dialog,isVisible);
}
}
})
.setNeutralButton("重置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
etPwd1.setText("");
etPwd2.setText("");
boolean isVisible = false;
dialogView(dialog,isVisible);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
boolean isVisible = true;
dialogView(dialog,isVisible);
}
} )
.create().show();
}
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.ll_app_lock:
String stringPwd = preferencesPwd.getString("pwd", "");
if(TextUtils.isEmpty(stringPwd)){
//沒有首次設置密碼,長按無效
}else{
changePwd();
}
break;
default:
break;
}
return true;
}
<activity android:name="com.xh.ui.LockAppActivity"
android:excludeFromRecents="true"
android:theme="@style/AppThemeBlack">
</activity>
<!-- android:persistent="true" 將服務設置爲系統服務,防止被系統意外回收-->
<service
android:persistent="true"
android:name="com.xh.service.WatchAppService"/>
上面就是主要代碼,現在我們發現其實實現起來也是很簡單的。
由於這次代碼比較多,我就不全部貼出來了,我把鏈接發給大家,可以下載源碼。
總結:到此這個手機應用管理器就做完了,當然了還有很多bug存在,一些邏輯考慮的還不夠完整,這個大家可以運行看看,歡迎一起交流。對於附帶的資源下載,本人都是運行後沒有問題才上傳的,如果你無法運行,一般都是配置問題,有問題可以在評論中交流,在資源處評論,無法和大家進行交流。歡迎大家繼續關注……