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

Tengo las siguientes cosas en mi mente, alguien puede ayudar y aclarar mis dudas.

  1. El diseño del servicio es necesario para lograr esta tarea ??
  2. ¿Qué Service Remote(AIDL) o Servicio Local y por qué?
  3. ¿Cómo ocurre la UI y la interacción de Service ?
  4. Después de que la UI está activa, ¿quién recibe las llamadas de respaldo? UI o Service ?
  5. ¿Debo hacer que el Service como mi Controller es decir, el Service a los datos de la UI de UI pase a la inversa?

Ejemplo de aplicación: Skype.

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.

  1. 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.

  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.

  3. 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.

  4. 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.

  5. 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:

  1. 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); } 
  2. 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.

  • No es posible que el SDKcontroller de Android funcione
  • USB debugging - Problema con la instalación de controladores para Epson Moverio
  • ¿Cómo eliminar mensajes retrasados ​​antes de llegar a un manejador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.