Android: Hacer la conexión de la aplicación en segundo plano en el arranque
Tengo una aplicación VOIP
, necesito iniciar sesión en la aplicación en segundo plano en el arranque del dispositivo.
Actualmente el init de mi aplicación se realiza en UI
Active ( onCreate()
).
- ¿Qué es el grupo de mensajes globales en Android? ¿Dónde reside en la memoria?
- Acceso al controlador de subprocesos de interfaz de usuario desde un servicio
- Handler en Android
- Android: ¿Dejar de usar Looper?
- Problema con la detección de tabletas Synchro Digital
Tengo las siguientes cosas en mi mente, alguien puede ayudar y aclarar mis dudas.
- El diseño del servicio es necesario para lograr esta tarea ??
- ¿Qué
Service Remote(AIDL)
o Servicio Local y por qué? - ¿Cómo ocurre la
UI
y la interacción deService
? - Después de que la
UI
está activa, ¿quién recibe las llamadas de respaldo?UI
oService
? - ¿Debo hacer que el
Service
como miController
es decir, elService
a los datos de laUI
deUI
pase a la inversa?
Ejemplo de aplicación: Skype.
- No se puede conectar el Samsung Galaxy Tab2 GT- P3100 al PC
- Realizar cambios en la interfaz de usuario de la actividad principal desde el subproceso en Service
- Android: mensajes de Handler retrasados al final del hilo de trabajo
- Android hilo problema, ¿por qué ui todavía bloquea cuando he utilizado un hilo de trabajo?
- Pruebas de unidad de Android con múltiples subprocesos
- ¿La clase android.os.Handler elimina la necesidad de declarar ciertos métodos como sincronizados?
- Cómo llamar a un método después de un retraso en Android
- Controladores de "modo blando" del modo de host USB de Android para dispositivos USB estándar compatibles con la clase
Así que hay muchas maneras de lograr lo que quieres, es una cuestión de lo que se ajusta a su estilo y diseño mejor. Esperamos que encuentre esta información útil.
-
Para la aplicación de inicio de sesión en el fondo en el inicio hay una opción pocos. Lo primero que necesitará es un BroadcastReceiver que se define como un receptor en el manifiesto. Haga que el BroadcastReceiver capture la intención ACTION_BOOT_COMPLETED . Desde aquí puede iniciar su Servicio. Esto conduce al # 2.
-
Si todo lo que estás haciendo son llamadas RESTful entonces realmente un IntentService sería ideal. La diferencia entre un IntentService y un Servicio es simple: Un IntentService se ejecuta fuera del hilo principal, ejecuta su 'código' y muere. Un servicio, sin embargo se ejecuta en el hilo principal (esto es un hecho importante) y es largo por lo que se tiene que decir a stopSelf () . Para tomar más las cosas, un servicio es también menos probable que se maten en comparación con una actividad (componentes de la aplicación se matan para hacer espacio en la memoria de las aplicaciones recién lanzadas), es decir. Toma mayor precedencia. El servicio también puede ser declarado un servicio de primer plano que requiere una notificación pero dar precedencia aún mayor. Creo que en su caso un servicio sería perfecto.
-
Una vez que su UI (Actividad) se abra, la mejor manera de conectarse al Servicio sería el Binder . Esto permitirá múltiples interfaces al Servicio de diferentes aplicaciones / componentes si es necesario. AIDL es bastante cool cosas pero de mi experiencia mucho más difícil de gestionar ya que todos los parámetros deben ser primitivos o Parcables. AIDL también es más lento y menos eficiente porque es realmente una forma de IPC. Cuando se inicia un servicio con una intención, se llama al método onStartCommand (). Si el servicio es iniciado por una aplicación que intenta unirse a él, entonces se llama al método onBind (). Pero puede iniciar el servicio con e Intent y luego enlazarlo. Si prefiere el enfoque RESTful en el que sólo tiene llamadas rápidas para datos, puede utilizar un IntentService con un ResultReceiver . Este es un gran artículo escrito sobre los ejemplos de Google I / O y, en general, bien implementado si está interesado en IntentService y ResultReceiver.
-
Esto depende de ti. Utilizando el Binder o AIDL su Actividad puede llamar a los métodos de Servicio como método de objeto donde el 'devolución de llamada' sería el retorno del método. Si utiliza un ResultReceiver, la Actividad que interconecta el receptor sería la devolución de llamada. También podría pasar Intents hacia adelante y hacia atrás, pero esto podría ponerse desordenado. Una vez más para su caso el acercamiento de la carpeta sería bueno así como un receptor.
-
Piense en el Servicio como un modelo en el sistema MVVM – úselo como un ayudante para obtener datos, no como algo que controla la lógica de la aplicación.
Lo siento si esto parece desordenado hay tantas maneras de lograr lo que está buscando. Su sólo una cuestión de lo que se adapte mejor a su situación lo que "se siente" es mejor. Sin mencionar el SDK de Android es bastante grande. Traté de incidir en todos los temas que podrían ayudarte. ¡Buena suerte!
Intente un servicio con un recibo de arranque. Aquí está un ejemplo que encontré después de una búsqueda rápida de google. A continuación, asegúrese de almacenar en la información de inicio de sesión en algún lugar para cuando se inicia la aplicación. No estoy seguro de qué callbacks podría tener, así que realmente difícil responder a esa parte. Yo diría que si las devoluciones de llamada debe afectar a la interfaz de usuario a continuación, dejar que la actividad tomar más cuando se inicia. Si necesita una interfaz de usuario cuando sólo se ejecuta el servicio, probablemente sea mejor lanzar una notificación y hacer que llame a la actividad apropiada con los datos de devolución de llamada.
Puede authanticate inicio de sesión de usuario por el paquete de servicios de fondo com.javaorigin.android.sample.service;
import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MyService extends Service { String tag="TestService"; @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show(); Log.i(tag, "Service created..."); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.i(tag, "Service started..."); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show(); } @Override public IBinder onBind(Intent intent) { return null; } } public class SampleAction extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView view = new TextView(this); view.setText("Service Test"); Intent i = new Intent(); i.setClassName( "com.javaorigin.android.sample.service", "com.javaorigin.android.sample.service.MyService" ); bindService( i, null, Context.BIND_AUTO_CREATE); this.startService(i); setContentView(view); } }
Si el inicio de sesión se tarda tanto en utilizar [AccountManager][1]
y hacerlo sólo una vez. La idea detrás de AccountManager
un token o cualquier credencial que necesites usar en tu Service
.
En su caso particular creo que la mejor manera de comunicar su Activity
con el Service
es vinculante para ella.
La mejor fuente de conocimiento sobre el uso básico del Service
es SDK . Larga historia corta AIDL
se utiliza para comunicaciones IPC y mientras ejecuta el servicio en el mismo proceso que no lo necesita. Supongo que tienes dos opciones:
-
Si lo único que necesita es sólo iniciar sesión, puede iniciar un servicio de arranque, inicio de sesión y, a continuación, enviar una emisión pegajosa con datos de inicio de sesión que se recibirá en la aplicación. Vea esta pregunta para un buen conjunto de maneras de iniciar un servicio al arrancar.
@Override public void onCreate() { Data data = performLogin(); Intent i = new Intent(ACTION_VOIP_LOGIN); i.putExtra(EXTRA_LOGIN_DATA, data); mContext.sendStickyBroadcast(i); } ... private final class LoginReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // You may use a Bundle instead Data data = intent.getParcelableExtra(); processLoginData(data) } } protected void onCreate(Bundle savedInstanceState) { ... IntentFilter filter = new IntentFilter(ACTION_VOIP_LOGIN); mContext.registerReceiver(new LoginReceiver(), filter); }
-
En el segundo caso es posible que desee mover toda su lógica al servicio. Aquí ampliará la clase
Binder
. Consulte este artículo de SDK para obtener más detalles.