Я пытаюсь разработать App Lock в android. Поэтому в моем классе обслуживания ScheduledExecutorService
, который постоянно проверяет текущее приложение переднего плана и для получения имени пакета, у меня есть этот код:
public String checkRunningApps() {
String currentApp = null;
UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> applist = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
if (applist != null && applist.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : applist) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (!mySortedMap.isEmpty()) {
currentApp = Objects.requireNonNull(mySortedMap.get(mySortedMap.lastKey())).getPackageName();
}
}
return currentApp;
}
И моя реализация ScheduledExecutorService
выглядит следующим образом:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try{
// of type List<String> to hold all the locked App's Packagename;
lockedApps = AppPref.getInstance().getAppList(getApplicationContext());
String localPackName = checkRunningApps();
if( lockedApps.contains(localPackName) ){
if( !allowedApps.contains( localPackName )){ //allowedApps will call clear when screen is locked; so that we can show lockactivity again;
allowedApps.add( localPackName );
Message message = Message.obtain();
message.obj = localPackName;
customHandler.sendMessage(message);
}
}
}catch(Exception e){
customHandler.removeMessages(0);
Log.i("mytag","Exception e: "+e.getLocalizedMessage());
}
}
}, 0, 200, TimeUnit.MILLISECONDS);
У меня есть обработчик для обработки отправленного сообщения и запуска намерения, которое не работает, и реализация выглядит следующим образом:
private final Handler customHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
try{
// Log.i("mytag", "I'm launchign act: "+(String)msg.obj);
Toast.makeText(getApplicationContext(),"I'm launching",Toast.LENGTH_SHORT).show();
String localPackName = (String)msg.obj;
Intent intent = new Intent(SaveMyAppsService.this.getApplicationContext(), defaultPassAct); // defaultPassAct = Lock Activity class
intent.putExtra("package",localPackName);
if(defaultLockPref.equalsIgnoreCase("TILES")) //Tiles Lock
intent.putExtra("operation",1);
else
intent.putExtra(AppLock.EXTRA_TYPE, AppLock.UNLOCK_PIN); //Pin Lock
intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION );
startActivity( intent );
}catch(Exception e){
Log.i("mytag","erroe inside handler: "+e.getLocalizedMessage());
}
}
};
PS: Toast отлично работает из обработчика;