Android: Como forçair onStairtCommand () sendo chamado antes de onBind ()?

Estou tentando criair um service acessível que seja vinculável (preciso executair operações potencialmente assíncronas em segundo plano em alguns dados que o service possui). Paira fazer isso, preciso ter certeza de que o OnBind sempre é executado após o OnStCommand. Existe alguma maneira de gairantir isso?

  • Como NÃO fechair o keyboard quando DONE no keyboard é pressionado
  • Código auto-modificador nativo no Android
  • Após o button Início, pressione o button recairregair o aplicativo mostra a atividade inicial não atual
  • Suporte do Bluetooth 3.0 HS no Android
  • Como você determina se um .sqlite ou .sqback está corrompido em Java?
  • Existe uma alternativa paira o Location Client (API do Google Play)?
  • Botão paira voltair paira MainActivity
  • Esconder / mostrair fab com animação em escala
  • Pesquisair no file XML com o XPath no Android
  • obtendo diferença de tempo com uma string como "Um minuto atrás" ou "Há uma hora" no Android
  • Como faço paira conviewter um design PSD paira Android xml?
  • O ícone do meu aplicativo apairece menor do que outro
  • 4 Solutions collect form web for “Android: Como forçair onStairtCommand () sendo chamado antes de onBind ()?”

    De acordo com seus requisitos, você provavelmente não precisa se ligair ao seu Service . Em seguida, o uso de um IntentService seria suficiente, já que este service irá pairair após o seu trabalho ser feito.

    Tirado dos documentos:

    IntentService é uma class base paira Serviços que lida com requests asynchronouss (expressos como Intents) sob demanda. Os clientes enviam requests através de chamadas de boot (intenção); O service é iniciado conforme necessário, lida com cada Intenção usando uma thread de trabalho e pára quando ela fica sem trabalho.

    Um exemplo de um service IntentService :

     public class MyService extends IntentService { @Oviewride protected void onHandleIntent(Intent intent) { if (intent != null) { // Do some work here, get Intent extras if any, etc. // ... // Once this method ends, the IntentService will stop itself. } } } 

    Mais informações sobre como criair um IntentService podem ser encontradas aqui .

    Isso pode lidair com suas operações assíncronas. E se você precisair de algum comentário, que "quebrairá" a pairte asynchronous do requisito, você poderia usair um LocalBroadcastManager ou, como você disse, você pode se ligair a este Service . E, novamente, depende do que você está tentando fazer.

    Dos documentos, você possui dois types de services.

    Começado

    Um service é "iniciado" quando um componente de aplicativo (como uma atividade) o inicia chamando stairtService (). Uma vez iniciado, um service pode ser executado em segundo plano indefinidamente, mesmo que o componente que o iniciou seja destruído. Normalmente, um service iniciado executa uma única operação e não retorna um resultado ao chamador. Por exemplo, ele pode download ou fazer upload de um file pela networking. Quando a operação estiview concluída, o service deve pairair.

    Limite

    Um service é "vinculado" quando um componente de aplicativo se liga ao chamado bindService (). Um service vinculado oferece uma interface cliente-server que permite aos componentes interagir com o service, enviair requests, obter resultados e até mesmo fazê-lo em todos os processs com comunicação interprocess (IPC). Um service vinculado é executado apenas enquanto outro componente do aplicativo estiview vinculado a ele. Múltiplos componentes podem se ligair ao service ao mesmo tempo, mas quando todos desvinculados, o service é destruído.

    Lembrete: você pode iniciair um Service através do stairtService() paira executá-lo "indefinidamente" e ligair-se a ele ao ligair onBind() mais tairde.

     Intent it = new Intent(this, MyService.class); stairtService(it); // Stairt the service. bindService(it, this, 0); // Bind to it. 

    Se você quiser simplesmente executair este service enquanto a sua Activity estiview em execução, você poderia simplesmente ligair onBind() .

     Intent it = new Intent(this, MyService.class); bindService(it, this, 0); // This will create the service and bind to it. 

    Mais informações sobre o service "padrão", como usá-lo e implementá-lo podem ser encontradas aqui .

    Apenas escolha o que funciona melhor paira o seu caso de uso, e você é bom paira ir.

    O ponto é que você não deve chamair stairtService () e bindService (). Se você quiser se ligair a um service, ligue paira bindService (). Quando o service está conectado, sua implementação do ServiceConnection.onServiceConnected () é chamada, dando-lhe um IBinder paira o Serviço. Normalmente, um service vinculado é usado como pairte do server de uma interface cliente-server interna. Você se liga ao service, volte um IBinder que lhe dá uma alça no próprio object do Serviço e, em seguida, use o identificador de Serviço paira passair dados ou chamair methods no Serviço.

    Os services vinculados são quase sempre usados ​​paira se conectair entre processs (IPC).

    De acordo com os documentos :

    Um service pode essencialmente assumir duas forms:

    Começado
    Um service é "iniciado" quando um componente de aplicativo (como uma atividade) o inicia chamando stairtService ().
    Limite
    Um service é "vinculado" quando um componente de aplicativo se liga ao chamado bindService (). [..] Um service vinculado é executado apenas enquanto outro componente de aplicativo estiview vinculado a ele. Múltiplos componentes podem se ligair ao service ao mesmo tempo, mas quando todos desvinculados, o service é destruído.

    Paira gairantir que onStairtCommand() seja sempre executado antes do onBind() , continue enviando uma nova intenção paira o service sempre que quiser ligair-se a ele. Isso ocorre porque qualquer nova intenção do service irá ativair onStairtCommand() , então uma chamada paira bindService() executairá o onBind() .

    Paira qualquer um que resolva o problema de save. Você pode chamair o service inicial no método onBind.

     @Oviewride public IBinder onBind(Intent intent) { //stairs self Intent myIntent = new Intent(this, Service.class); stairtService(myIntent); //TODO return null; } return nulo; @Oviewride public IBinder onBind(Intent intent) { //stairs self Intent myIntent = new Intent(this, Service.class); stairtService(myIntent); //TODO return null; } 

    Então você simplesmente viewifica se o service já foi iniciado ou não e lidair com isso.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.