现在通用的应用锁实现 都是启动一个service一直在后台,判断启动的应用在我们的锁内,就启动我们的锁屏界面。
public class HookService extends Service {
public final static String TAG = "TestService";
private ActivityManager mActivityManager;
private String mLastPackageName = "";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mActivityManager = (ActivityManager) getSystemService("activity");
checkWindow();
}
Handler mHandlertoast = new Handler() {
@Override
public void handleMessage(Message msg) {
LockHelper.getInstance().unLock(HookService.this, null, mLastPackageName);
}
};
private void checkWindow() {
new Thread() {
@Override
public void run() {
while (true) {
fun();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}.start();
}
private void fun() {
String[] activePackages;
if (Build.VERSION.SDK_INT > 20) {
activePackages = getActivePackages();
} else {
activePackages = getActivePackagesCompat();
}
if (activePackages != null) {
for (String activePackage : activePackages) {
if (activePackage.equals("com.myth.cici")) {
if (!activePackage.equals(mLastPackageName)) {
mLastPackageName = activePackage;
mHandlertoast.sendEmptyMessage(0);
}
}
}
}
}
String[] getActivePackagesCompat() {
final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager
.getRunningTasks(1);
final ComponentName componentName = taskInfo.get(0).topActivity;
final String[] activePackages = new String[1];
activePackages[0] = componentName.getPackageName();
return activePackages;
}
private String[] getActivePackages() {
final Set<String> activePackages = new HashSet<String>();
final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
activePackages.addAll(Arrays.asList(processInfo.pkgList));
}
}
return activePackages.toArray(new String[activePackages.size()]);
}
}
5.0以上使用getActivePackages();以下则使用getRunningAppProcesses。
判断获取到的活动的应用包名和我们锁住的包名是否一致,一致则还要判断是否是上次已经解锁了的,防止一直解锁,然后就启动我们的锁屏界面了。
这只是个基本的部分,正式的还需要解决很多问题。比如Service被杀死了怎么办等。