Inicie la aplicación de Android sin la actividad principal e inicie el servicio al iniciar la aplicación

90

Tengo el siguiente escenario en mi aplicación. No hay IU en mi aplicación; en su lugar, hay un servicio que se inicia al arrancar y se ejecutará continuamente.

¿Cómo puedo configurar mi archivo de manifiesto sin una actividad principal? ¿Puedo iniciar mi aplicación sin ninguna actividad? Y al iniciar mi aplicación, mi servicio debería comenzar. es posible?

No quiero hacer una Actividad traslúcida para iniciar el Servicio.

Meher
fuente
Eche un vistazo a esta [pregunta] [1] [1]: stackoverflow.com/questions/4468006/…
Munish Kapoor

Respuestas:

125

Dijiste que no querías usar una actividad translúcida, pero esa parece ser la mejor manera de hacer esto:

  1. En su manifiesto, establezca el tema Actividad en Theme.Translucent.NoTitleBar.
  2. No se moleste con un diseño para su actividad y no llame setContentView().
  3. En su Actividad onCreate(), inicie su Servicio con startService().
  4. Salga de la Actividad con finish()una vez que haya iniciado el Servicio.

En otras palabras, su actividad no tiene que ser visible; simplemente puede asegurarse de que su Servicio se esté ejecutando y luego salir, que suena como lo que desea.

Recomiendo encarecidamente mostrar al menos una notificación de Toast que indique al usuario que está iniciando el Servicio o que ya se está ejecutando. Es una experiencia de usuario muy mala tener un icono de lanzador que parece no hacer nada cuando lo presionas.

Darshan Rivka Whittle
fuente
2
me da una pantalla en blanco después de iniciar mi aplicación, lo cual no debería ser el caso ...
Meher
1
@meher Acabo de probarlo y funcionó perfectamente para mí: mi servicio comenzó y no vi ninguna actividad, ni siquiera por un instante. Por favor, publique el contenido de onCreate () de su actividad, y deberíamos poder averiguar qué está mal.
Darshan Rivka Whittle
cuando instalé mi aplicación por primera vez, puedo ver la actividad iniciada y desapareciendo en un segundo.
Meher
testActivity de clase pública extiende la actividad {/ ** Se llama cuando se crea la actividad por primera vez. * / @Override public void onCreate (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); Log.i ("actividad", "servicio de inicio"); startService (nuevo Intent (TestActivity.this, MyService.class)); terminar(); }}
Meher
1
Me doy cuenta de que esta es una pregunta antigua, pero parece que ya no funciona. Cambiar el tema de la actividad principal a Theme.Translucent.NoTitleBar o Theme.Translucent.NoTitleBar.FullScreen provoca que una aplicación que de otro modo funcione y que muestre brevemente la pantalla de actividad en una que siempre provoque un mensaje de "la aplicación dejó de responder".
Alzee
32

Sí, puede hacerlo simplemente creando un BroadcastReceiverque llame a su Servicecuando se inicie su aplicación. Aquí hay una respuesta completa dada por mí.
Android: iniciar el servicio al arrancar

Si no desea ningún icono / lanzador para su aplicación, puede hacerlo también, simplemente no cree ninguna actividad con

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

Simplemente declare su Servicecomo declarado normalmente.

Lalit Poptani
fuente
2
Parece que el autor de la pregunta está bien para iniciar el Serviceinicio, pero quiere saber cómo no tener un main Activity, pero simplemente asegúrese de que se Serviceesté ejecutando cuando se presiona el icono del iniciador.
Darshan Rivka Whittle
2
Pero parece que quieren un icono de iniciador que, cuando se presiona, asegura que el Servicio se esté ejecutando. Su sugerencia simplemente elimina el ícono del iniciador.
Darshan Rivka Whittle
@LalitPoptani la solución está bien. Pero mi servicio no se iniciará hasta que arranque mi teléfono.
Meher
4
No puedo iniciar mi aplicación sin MAIN, LAUNCHER en AndroidMenifest.xml excepto SyncAdapter. ¿Es tu respuesta realmente cierta?
sunghun
1
He eliminado el filtro de intención con etiquetas de acción y categoría. Ahora la aplicación ya no se ejecuta en Android Studio
Nauman Ash
11

La razón para crear una aplicación sin actividad o servicio podría ser hacer una aplicación de widget de pantalla de inicio que no necesita iniciarse.
Una vez que inicie un proyecto, no cree ninguna actividad. Después de crear el proyecto, simplemente presione ejecutar. El estudio de Android dirá No default activity found.

Haga clic en Editar configuración (desde el menú Ejecutar ) y en la parte de la opción Launch establezca el valor de Launch en Nothing . Luego haga clic en Aceptar y ejecute la aplicación.

( Dado que no hay actividad de iniciador, no se mostrará ninguna aplicación en el menú Aplicaciones ).

Mahdi-Malv
fuente
Gracias, ese fue exactamente mi caso. En caso de que no se ve en Editar configuración como lo hice, seleccione Ejecutar> Ejecutar ... en el menú principal y luego seleccione Editar Configuraciones ... .
pm_
6

Android Studio versión 2.3

Puede crear un servicio sin una actividad principal siguiendo unos sencillos pasos. Podrás instalar esta aplicación a través de Android Studio y depurarla como una aplicación normal.

Primero, cree un proyecto en Android Studio sin una actividad. Luego cree su clase de servicio y agregue el servicio a su 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>

Ahora, en el menú desplegable al lado del botón "Ejecutar" (flecha verde), vaya a "editar configuraciones" y dentro de las "Opciones de lanzamiento" elija "Nada". Esto le permitirá instalar su Servicio sin que Android Studio se queje de no tener una Actividad principal.

Una vez instalado, el servicio NO se ejecutará, pero podrá iniciarlo con este comando de shell adb ...

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

Puede comprobar que se está ejecutando con ...

ps | grep whatever

No lo he intentado todavía, pero es probable que Android Studio también inicie el servicio automáticamente. Esto se haría en el menú "Editar configuraciones".

Merc
fuente
Recibo el siguiente error de adb shell: Iniciando servicio: Intent {cmp = com.example.wolk.myapp / .MyIntentService} Error: No encontrado; no se inició ningún servicio. LOGCAT muestra: ActivityManager: no permite iniciar ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos