Parece que o Google finalmente fechou todas as portas para obter o pacote de aplicativos de primeiro plano atual.
Após a atualização do Lollipop, que acabou getRunningTasks(int maxNum)
e graças a esta resposta , usei este código para obter o pacote do aplicativo em primeiro plano desde o Lollipop:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == PROCESS_STATE_TOP) {
currentInfo = app;
break;
}
}
}
return currentInfo;
O Android 5.1.1 e superior (6.0 Marshmallow), ao que parece, também matou getRunningAppProcesses()
. Ele agora retorna uma lista de seu próprio pacote de aplicativo.
UsageStatsManager
Podemos usar a nova UsageStatsManager
API conforme descrito aqui, mas ela não funciona para todos os aplicativos. Alguns aplicativos do sistema retornarão o mesmo pacote
com.google.android.googlequicksearchbox
AccessibilityService (dezembro de 2017: vai ser banido para uso pelo Google)
Alguns aplicativos usam AccessibilityService
(como visto aqui ), mas tem algumas desvantagens.
Existe outra maneira de obter o pacote de aplicativos em execução no momento?
fonte
ps
em um shell e a política for"fg"
e o conteúdo de/proc/[pid]/oom_adj_score
igual0
, o aplicativo será o aplicativo em primeiro plano. Infelizmente, parece que/proc/[pid]/oom_adj_score
não é mais legível no Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120eRespostas:
Para obter uma lista dos processos em execução no Android 1.6 - Android 6.0, você pode usar esta biblioteca que escrevi: https://github.com/jaredrummler/AndroidProcesses A biblioteca lê / proc para obter informações do processo.
O Google restringiu significativamente o acesso a / proc no Android Nougat. Para obter uma lista dos processos em execução no Android Nougat, você precisará usar o UsageStatsManager ou ter acesso root.
Clique no histórico de edição para soluções alternativas anteriores.
fonte
Process
implementeComparable
e substitua ocompareTo
método. Então, quando você usarCollections.sort(processesList)
, ele usará a ordem que você especificou.Use este método para obter a tarefa de primeiro plano. Você precisará de uma Permissão do Sistema "android: get_usage_stats"
SE o usuário habilitar isso em configuração -> Segurança-> aplicativo com acesso de uso. Depois disso, você receberá a tarefa de primeiro plano. Processo semelhante Clean matser por Cheetahamobile google play link
fonte
UsageStatsManager
. A Samsung removeu as solicitações e é muito chato para o usuário conceder permissão ao sistema.Dê uma olhada em https://github.com/ricvalerio/foregroundappchecker , pode ser o que você precisa. Fornece código de amostra e elimina a dor de ter que implementar o detector de primeiro plano de versão cruzada.
Aqui estão dois exemplos:
Ou verifique regularmente:
fonte
O Google limitou essa funcionalidade apenas para aplicativos do sistema. Conforme relatado em um tíquete de bug , você precisará da permissão REAL_GET_TASKS para acessar lá.
fonte
Apenas jogando fora uma otimização potencial para o que eu imagino ser um pedaço de código copiado e colado para detectar o aplicativo mais popular no Android M.
este
Pode ser simplificado para isso
Eu me vi usando esse código em um loop de 2 segundos e me perguntei por que estava usando uma solução complexa que era O (n * log (n)) quando uma solução mais simples estava disponível em Collections.max () que é O (n )
fonte
Em seguida, inicie o serviço e a acessibilidade do aplicativo na configuração do dispositivo-> acessibilidade-> Aplicativo nesse serviço.
fonte
Tente usar em
getRunningServices()
vez dogetRunningAppProcesses()
método.fonte