问题
Is it possible to track the launch of a third-party application on the device? Maybe the android sends a broadcast when the applications are launched.
UPDATE
public class ServiceAppControl extends IntentService {
private boolean serviceStarted = true;
public ServiceAppControl() {
super("ServiceAppControl");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
while (serviceStarted){
String appIsForeground = isAppOnForeground(getBaseContext());
Log.d(AppGlobal.LOG_TAG, "Запущено приложение " + appIsForeground);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private String isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
String appIsForeground = "";
if (appProcesses == null) {
return appIsForeground;
}
final String packageName = context.getPackageName();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
appIsForeground = appProcess.processName;
return appIsForeground;
}
}
return appIsForeground;
}
}
回答1:
Yes, it's possible in Android. You can check whether third party application is in forground or is in background using below code
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> {
@Override
protected Boolean doInBackground(Context... params) {
final Context context = params[0].getApplicationContext();
return isAppOnForeground(context);
}
private boolean isAppOnForeground(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
final String packageName = context.getPackageName();
for (RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
}
回答2:
There is no broadcast as such to inform about launch of an application to which others can listen because that can be a security threat. People can use it for malicious purpose. Otherwise from the logs you can get to know about currently launched application.
回答3:
First, answer your question, Is it possible to track the launch of a third-party application on the device? - YES
Check this link, I explained briefly.
Note: We should be aware of few things before doing few things
Running a while loop or timer continuously and getting the recent app will drain a lot of battery(All the AppLocker will do same to get the current opening app) but we should be smart enough and we should run the loop only when the screen ON, when screen OFF we should stop that timer or whatever.
From Android "O" some restriction in running the service in background, so better put your service as Foreground service
Done!!!.
来源:https://stackoverflow.com/questions/44408104/track-the-launch-of-a-third-party-application