startActivity (намерение), похоже, игнорируется обработчиком - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь разработать 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 отлично работает из обработчика;

...