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?

Respostas:


344

De dentro da classe Service:

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

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.


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!


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);

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();

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.