Определение текущего приложения переднего плана из фоновой задачи или службы - PullRequest
101 голосов
/ 30 января 2010

Я хочу, чтобы одно приложение работало в фоновом режиме, которое знает, когда работает любое из встроенных приложений (обмен сообщениями, контакты и т. Д.)

Итак, мои вопросы:

  1. Как мне запустить приложение в фоновом режиме.

  2. Как мое фоновое приложение может узнать, какое приложение в данный момент выполняется на переднем плане.

Буду признателен за ответы от людей с опытом.

Ответы [ 13 ]

0 голосов
/ 24 мая 2016

Вот как я проверяю, находится ли мое приложение на переднем плане. Примечание. Я использую AsyncTask в соответствии с официальной Android документацией.

`

    private class CheckIfForeground extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {

        ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                Log.i("Foreground App", appProcess.processName);

                if (mContext.getPackageName().equalsIgnoreCase(appProcess.processName)) {
                    Log.i(Constants.TAG, "foreground true:" + appProcess.processName);
                    foreground = true;
                    // close_app();
                }
            }
        }
        Log.d(Constants.TAG, "foreground value:" + foreground);
        if (foreground) {
            foreground = false;
            close_app();
            Log.i(Constants.TAG, "Close App and start Activity:");

        } else {
            //if not foreground
            close_app();
            foreground = false;
            Log.i(Constants.TAG, "Close App");

        }

        return null;
    }
}

и выполните AsyncTask следующим образом. new CheckIfForeground().execute();

0 голосов
/ 24 января 2016

В леденце и выше:

Добавить в mainfest:

<uses-permission android:name="android.permission.GET_TASKS" />

И сделать что-то вроде этого:

if( mTaskId < 0 )
{
    List<AppTask> tasks = mActivityManager.getAppTasks(); 
    if( tasks.size() > 0 )
        mTaskId = tasks.get( 0 ).getTaskInfo().id;
}
0 голосов
/ 23 февраля 2010

Сделайте что-то вроде этого:

int showLimit = 20;

/* Get all Tasks available (with limit set). */
ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> allTasks = mgr.getRunningTasks(showLimit);
/* Loop through all tasks returned. */
for (ActivityManager.RunningTaskInfo aTask : allTasks) 
{                  
    Log.i("MyApp", "Task: " + aTask.baseActivity.getClassName()); 
    if (aTask.baseActivity.getClassName().equals("com.android.email.activity.MessageList")) 
        running=true;
}
...