atividade de início do Android do serviço

151

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

Lancei este serviço de Activity

Em Activityse satisfaz condição de início

startService(new Intent(WozzonActivity.this, LocationService.class));

do meu LocationServicemencionado acima não pôde iniciar Activity, como posso obter o contexto da execução atual Activityna classe de serviço?

d-man
fonte

Respostas:

344

De dentro da classe Service:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
d-man
fonte
17
Somente o FLAG_ACTIVITY_NEW_TASK é necessário, pois apenas as atividades podem iniciar atividades sem ele. 'this' pode ser usado no lugar de getBaseContext e getApplication, pois o serviço tem seu próprio contexto.
sojurn
1
Como remover programaticamente essa atividade da lista de telas recentes?
Prashanth Debbadwar
2
Não funciona se o serviço estiver em segundo plano. Alguma correção para isso?
Rick Royd Aban
4
Por favor, ajude-me a abrir o aplicativo do serviço em segundo plano. Uso o serviço Firebase (FCM). Eu quero abrir meu ecrã UI Chamar do meu aplicativo Então, por favor me ajude para que
Dipanki Jadav
2
Eu escrevi seu código dentro do meu serviço quando o aplicativo está em segundo plano e vejo que o serviço funcionou no xiaomi mi a2, mas não está funcionando no xiaomi redmi note 7, você pode me ajudar por que ele está funcionando em um dispositivo e um não está?
Amjad Omari
18

Eu tive o mesmo problema e quero que você saiba que nenhuma das opções acima funcionou para mim. O que funcionou para mim foi:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

e em uma das minhas subclasses, armazenadas em um arquivo separado, eu precisava:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

Todas as outras respostas me deram a nullpointerexception.

Andy
fonte
5
você está armazenando o serviço em um campo estático, o que poderia levar ao vazamento de memória
Murmel
1
startActivity é o mesmo this.startActivity! você cria uma instância inútil do seu serviço com startActivity normal igual, por que?
Amir Hossein Ghasemi
8

Outra coisa que vale a pena mencionar: embora a resposta acima funcione bem quando nossa tarefa estiver em segundo plano, a única maneira de fazê-la funcionar se nossa tarefa (feita de serviço + algumas atividades) estiver em primeiro plano (ou seja, uma de nossas atividades visíveis para o usuário) foi assim:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

Não sei se ACTION_VIEW ou FLAG_ACTIVITY_NEW_TASK tem alguma utilidade real aqui. A chave para ter sucesso foi

storedActivity.startActivity(intent);

e, é claro, FLAG_ACTIVITY_REORDER_TO_FRONT por não instanciar a atividade novamente. Boa sorte!

kellogs
fonte
1
Isso não funciona. Tudo isso me dá o erro "Chamar startActivity () de fora de um contexto de Atividade requer o sinalizador FLAG_ACTIVITY_NEW_TASK. É isso mesmo que você deseja?"
Cerin
2
Isso ocorre porque a segunda chamada para setFlags substitui a primeira. Esta solução deve usar addFlags ou uma única chamada para definir sinalizadores que passam Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac
8
Você não deseja combinar sinalizadores com o &&; você quer usar | (uma única barra de bit a bit ou)
Jon Watte
Intenção intenção = nova Intenção (storedActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity (intent);
precisa saber é o seguinte
1

não se pode usar o Contextdo Service; foi capaz de obter o (pacote) da Contextmesma forma:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);
Martin Zeitler
fonte
Eu acho que isso só funciona com FLAG_ACTIVITY_NEW_TASKbandeira
Cerlin
0

Alternativamente,

Você pode usar sua própria classe Application e ligar de onde precisar (principalmente não atividades).

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

E registre sua classe Application:

<application android:name="yourpackage.App" ...

Então ligue :

App.getContext();
James
fonte
2
Tome cuidado de utilizar uma instância estática do contexto, pode levar severals memor vazamentos
crgarridos
1
@crgarridos Nope. Este é o contexto de aplicação que é Singleton, pela sua natureza e não vai levar a vazamentos de memória
GV_FiQst
1
Gostaria de mudar a linha context = getApplicationContext();paracontext = this;
GV_FiQst
-1

Se você precisar recalcular uma Atividade que esteja no fundo, do seu serviço, sugiro o seguinte link. Intent.FLAG_ACTIVITY_NEW_TASK não é a solução.

https://stackoverflow.com/a/8759867/1127429

GMG
fonte