Inicie o aplicativo Android sem atividade principal e inicie o serviço ao iniciar o aplicativo

90

Eu tenho o seguinte cenário em meu aplicativo. Não há UI em meu aplicativo; em vez disso, há um serviço que inicia na inicialização e será executado continuamente.

Como posso configurar meu arquivo de manifesto sem uma atividade principal? Posso iniciar meu aplicativo sem qualquer atividade? E ao lançar meu aplicativo, meu serviço deve começar. Isso é possível?

Não quero fazer uma atividade translúcida para iniciar o serviço.

Meher
fonte
dê uma olhada nesta [questão] [1] [1]: stackoverflow.com/questions/4468006/…
Munish Kapoor

Respostas:

125

Você disse que não queria usar uma atividade translúcida, mas essa parece ser a melhor maneira de fazer isso:

  1. Em seu manifesto, defina o tema da atividade como Theme.Translucent.NoTitleBar.
  2. Não se preocupe com um layout para sua atividade e não ligue setContentView().
  3. Em suas atividades onCreate(), comece seu serviço com startService().
  4. Saia da atividade finish()assim que iniciar o serviço.

Em outras palavras, sua atividade não precisa estar visível; ele pode simplesmente verificar se o serviço está em execução e, em seguida, sair, o que parece o que você deseja.

Eu recomendo fortemente mostrar pelo menos uma notificação do Toast indicando ao usuário que você está iniciando o Serviço, ou que ele já está em execução. É uma experiência muito ruim para o usuário ter um ícone de inicialização que parece não fazer nada quando você pressiona.

Darshan Rivka Whittle
fonte
2
ele me dá uma tela em branco depois de iniciar meu aplicativo. o que não deveria ser o caso ...
Meher
1
@meher Acabei de testar e funcionou perfeitamente para mim - meu serviço começou e eu não vi nenhuma atividade, nem por um instante. Por favor, poste o conteúdo do onCreate () de sua atividade, e nós poderemos descobrir o que está errado.
Darshan Rivka Whittle
quando instalei meu aplicativo pela primeira vez, posso ver a atividade iniciada e desaparecendo em um segundo.
Meher
public class TestActivity extends Activity {/ ** Chamado quando a atividade é criada pela primeira vez. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("atividade", "início do serviço"); startService (novo Intent (TestActivity.this, MyService.class)); terminar(); }}
Meher
1
Sei que essa é uma pergunta antiga, mas parece que não funciona mais. Alterar o tema da atividade principal para Theme.Translucent.NoTitleBar ou Theme.Translucent.NoTitleBar.FullScreen faz com que um aplicativo que funcione de outra forma, mostre brevemente a tela de atividade em uma que sempre causa uma mensagem "o aplicativo parou de responder".
alzee
32

Sim, você pode fazer isso apenas criando um BroadcastReceiverque chame seu Servicequando seu aplicativo for inicializado. Aqui está uma resposta completa dada por mim.
Android - iniciar serviço na inicialização

Se você não quiser nenhum ícone / iniciador para seu aplicativo, você também pode fazer isso, apenas não crie nenhuma atividade com

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Apenas declare seu Servicecomo declarado normalmente.

Lalit Poptani
fonte
2
Parece que o autor da pergunta está bem para iniciar a Serviceinicialização, mas deseja saber como não ter o principal Activity, mas simplesmente certifique-se de que o Serviceestá executando quando o ícone do iniciador for pressionado.
Darshan Rivka Whittle
2
Mas parece que eles querem um ícone de inicialização que, quando pressionado, garante que o serviço está em execução. Sua sugestão simplesmente elimina o ícone do iniciador.
Darshan Rivka Whittle
@LalitPoptani a solução é boa. Mas meu serviço não iniciará até que eu inicialize meu telefone.
Meher
4
Não consigo iniciar meu aplicativo sem MAIN, LAUNCHER em AndroidMenifest.xml, exceto SyncAdapter. A sua resposta é realmente verdadeira?
sunghun
1
Removi o filtro de intenção com tags de ação e categoria. Agora o aplicativo não está mais sendo executado no Android Studio
Nauman Ash
11

A razão para fazer um aplicativo sem atividade ou serviço pode ser fazer um aplicativo Homescreen Widget que não precisa ser iniciado.
Depois de iniciar um projeto, não crie nenhuma atividade. Depois de criar o projeto, basta clicar em executar. Estúdio Android dirá No default activity found.

Clique em Editar configuração (no menu Executar ) e na parte da opção Iniciar defina o valor Iniciar como Nada . Em seguida, clique em ok e execute o aplicativo.

( Como não há atividade do iniciador, nenhum aplicativo será mostrado no menu Aplicativos. ).

Mahdi-Malv
fonte
Obrigado, esse foi exatamente o meu caso. No caso de você não ver Editar configuração como eu fiz, selecione Executar> Executar ... no menu principal e selecione Editar Configurações ... .
pm_
6

Android Studio versão 2.3

Você pode criar um serviço sem uma atividade principal, seguindo algumas etapas fáceis. Você poderá instalar este aplicativo por meio do Android Studio e depurá-lo como um aplicativo normal.

Primeiro, crie um projeto no Android Studio sem uma atividade. Em seguida, crie sua classe de serviço e adicione o serviço ao seu AndroidManifest.xml

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

Agora, no menu suspenso ao lado do botão "Executar" (seta verde), vá em "editar configurações" e em "Opções de inicialização" escolha "Nada". Isso permitirá que você instale seu serviço sem que o Android Studio reclame por não ter uma atividade principal.

Depois de instalado, o serviço NÃO estará em execução, mas você poderá iniciá-lo com este comando adb shell ...

am startservice -n com.whatever.myservice/.MyService

Pode verificar se está funcionando com ...

ps | grep whatever

Ainda não tentei, mas provavelmente você também pode fazer com que o Android Studio inicie o serviço automaticamente. Isso seria feito no menu "Editar configurações".

Merc
fonte
Recebo o seguinte erro do shell adb: Iniciando serviço: Intent {cmp = com.example.wolk.myapp / .MyIntentService} Erro: não encontrado; nenhum serviço foi iniciado. LOGCAT mostra: ActivityManager: não permite iniciar ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos