Как вызвать мое приложение и запустить его, когда открывается какой-то конкретный - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу отслеживать приложение, т.е. com.facebook.katana, у меня уже есть имя пакета, теперь мой вопрос заключается в том, чтобы я мог вызвать свое приложение и запустить его, когда это приложение (com.facebook.katana ") открывается, ладно, давайте прямо, я делаю App Locker, но я просто хочу заблокировать только это приложение (" com.facebook.katana ")!я сделаю все остальное, но мне нужна помощь в запуске своей активности, когда запустится это приложение!Заранее спасибо!

В настоящее время я использую этот код:

        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
    ActivityManager.RunningTaskInfo ar = RunningTask.get(0);

    String activityOnTop = ar.topActivity.getClassName ();

1 Ответ

0 голосов
/ 28 декабря 2018

TL; DR;

Вам нужно будет создать Сервис , который периодически проверяет, является ли передний план Activity и принадлежит ли он com.facebook.katana с ActivityManager .

Если это так, запустите свой шкафчик Activity.

Ваш код в порядке, просто поместите его в службу, которую я описал выше.

Обратите внимание, что если вы нацеливаетесь на Oreo +, вам придется сделать это в качестве службы переднего плана.

LR

Итак, в Androidесли вы хотите периодически выполнять работу, не располагая свое приложение в верхней части экрана (что означает, что ваше приложение находится в фоновом режиме или даже не запущено), у вас есть несколько вариантов, это называется планирование задач .

Опция, которую я вам здесь предоставляю, - это Service, по нескольким причинам вы можете выяснить, прочитав документацию, которую я каждый раз связывал.

Для этого создайте Сервискак это:

class ForegroundScanService : Service() {

    val handler = Handler(Looper.getMainLooper())

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {  
        startForeground(1,  createNotification())
        checkApp()
        // Ended
        return START_STICKY
    }

    fun checkApp() {
        // Detect if the target app is on top, if yes invoke your app with an intent if it hasn't been done already
        if(appIsDetected()) {
            startYourApp()
        }
        // Ask the system to restart us, there are many ways to do this, each one will impact the battery in a different way
        handler.postDelayed(object: Runnable() {
            override fun run() {
                checkApp()
            }
        }, 5000);
    }

}

Затем объявите это в своем манифесте и запустите его из активности вашего приложения,Поскольку служба будет работать и постоянно работать, «лучшим» способом будет использование ForegroundService.Если вы этого не сделаете и решите использовать WorkManager или AlarmManager или что-то еще, это лучше для батареи, но ограничено по времени перезапуска.

Надеюсь, это поможет вам, даже если реализация не та, которую вы выберете,чтобы понять, как это работает.

Кстати, вы можете найти документацию по Обработчику здесь

...