Không, bạn không thể biết khi nào một ứng dụng khác được khởi chạy mà không có loại hack nào. Điều này là do khởi chạy ứng dụng không được phát sóng.
Điều bạn có thể làm là tạo một dịch vụ chạy theo khoảng thời gian cố định, giả sử 1000 mili giây để kiểm tra xem ứng dụng không thuộc hệ thống nào ở phía trước. Giết ứng dụng đó và từ dịch vụ bật hộp nhập mật khẩu. Nếu mật khẩu mà là đúng relaunch rằng ứng dụng
Dưới đây là một số mẫu mã
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo appProcess : appProcesses) {
try {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
if (!lastFrontAppPkg.equals((String) appProcess.pkgList[0])) {
apkInfo = ApkInfo.getInfoFromPackageName(appProcess.pkgList[0], mContext);
if (apkInfo == null || (apkInfo.getP().applicationInfo.flags && ApplicationInfo.FLAG_SYSTEM) == 1) {
// System app continue;
} else if (((apkInfo.getP().versionName == null)) || (apkInfo.getP().requestedPermissions == null)) {
//Application that comes preloaded with the device
continue;
} else {
lastFrontAppPkg = (String) appProcess.pkgList[0];
}
//kill the app
//Here do the pupop with password to launch the lastFrontAppPkg if the pass is correct
}
}
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}
}, 0, 1000);
Và đây là ApkInfo.getInfoFromPackageName()
/**
* Get the ApkInfo class of the packageName requested
*
* @param pkgName
* packageName
* @return ApkInfo class of the apk requested or null if package name
* doesn't exist
* @see ApkInfo
*/
public static ApkInfo getInfoFromPackageName(String pkgName,
Context mContext) {
ApkInfo newInfo = new ApkInfo();
try {
PackageInfo p = mContext.getPackageManager().getPackageInfo(
pkgName, PackageManager.GET_PERMISSIONS);
newInfo.appname = p.applicationInfo.loadLabel(
mContext.getPackageManager()).toString();
newInfo.pname = p.packageName;
newInfo.versionName = p.versionName;
newInfo.versionCode = p.versionCode;
newInfo.icon = p.applicationInfo.loadIcon(mContext
.getPackageManager());
newInfo.setP(p);
} catch (NameNotFoundException e) {
e.printStackTrace();
return null;
}
return newInfo;
}
Dịch vụ kiểm tra mỗi giây sẽ tiêu hao pin của bạn sau vài giờ. Nó sẽ không được tốt hơn để làm cho một ứng dụng launcher/home? – Erdal
bạn đã đúng! Nhưng đó không phải là điều tôi muốn. Cảm ơn câu trả lời của bạn! – ngbl