it-swarm-pt.tech

Como iniciar um serviço quando o .apk é instalado pela primeira vez

No meu aplicativo, não estou tendo nenhuma parte da interface do usuário; portanto, preciso iniciar um serviço assim que o aplicativo for instalado no dispositivo. Vi muitos links nos quais a resposta foi que não é possível, mas acho que é certamente possível. Basta dar uma olhada em PlanB Aplicativo no mercado Android que atende aos meus requisitos. Abaixo está o meu arquivo de manifesto, como tentei, mas o Serviço não foi chamado. Então, deixe-me saber qual é a melhor maneira possível de iniciar um serviço quando o aplicativo for instalado.

ATUALIZAÇÃO

Eu também tentei usar Android.intent.action.PACKAGE_ADDED ele funciona bem para detectar o pacote para os outros aplicativos, mas não para si.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.auto.start"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk Android:minSdkVersion="8" />
    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        Android:icon="@drawable/ic_launcher" >

        <service Android:name=".MyService">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </service>

        <receiver Android:name=".BootUpReceiver">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
                <category Android:name="Android.intent.category.DEFAULT"/>
                <action Android:name="Android.intent.action.PACKAGE_INSTALL" />
                <action Android:name="Android.intent.action.PACKAGE_ADDED" />
                <data Android:scheme="package"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>
67
Lalit Poptani

Felizmente, o Plano B não funciona em Android 3.1+, testado em um XOOM e um Galaxy Nexus.

O que o Plano B faz é explorar uma brecha na segurança que pode ser usada por malware drive-by, razão pela qual Android impede que isso aconteça mais.


ATUALIZAÇÃO

Para esclarecer: Como o inazaruk postou e eu coloquei comentários em outras respostas, todos os aplicativos, durante a instalação, são colocados no estado "parado". É o mesmo estado em que o aplicativo é encerrado depois que o usuário interrompe o aplicativo a partir do aplicativo Configurações. Enquanto estiver nesse estado "parado", o aplicativo não será executado por qualquer motivo, exceto pelo lançamento manual de uma atividade. Notavelmente, nenhum BroadcastReceviers será chamado, independentemente do evento para o qual ele se registrou, até que o usuário execute o aplicativo manualmente.

Este bloco cobre o cenário do Plano B de instalação e execução remota, do qual eles estavam aproveitando anteriormente. Afinal, com isso, qualquer pessoa com uma conta do Google invadida correria o risco de infectar o dispositivo, sem usar as mãos.

Então, quando o OP diz:

Preciso iniciar um serviço assim que o Applicaton for instalado no dispositivo

o OP não terá êxito e precisará reprojetar o aplicativo para evitar essa suposta "necessidade".

78
CommonsWare

Os aplicativos instalados na partição/system não estão sujeitos a serem colocados no estado "parado" após a instalação. Se você tem root, você pode fazer,

$ adb root
$ adb remount
$ adb Push your.apk /system/app

E pode receber imediatamente intenções de transmissão. Isso certamente não fornece uma solução de uso geral, mas eu queria mencioná-lo por completo.

EDIT: Lembre-se de que versões diferentes do Android localizam APKs do sistema em locais diferentes. Por exemplo, Android 8 os coloca em /system/app//.apk. Conecte-se ao seu dispositivo e bisbilhote e siga o mesmo esquema usado para outros APKs do sistema.

17
Jeffrey Blattman

Concordo com a resposta da CommonsWare à pergunta: Como iniciar o serviço Android na instalação . Em outras palavras, você não pode iniciar seu serviço automaticamente após a instalação.

Mais uma coisa sobre as plataformas Androidmais recentes: se você não tiver uma interface do usuário, você terá problemas para iniciar o serviço, mesmo ao usar BOOT_COMPLETE com a intenção de Android 3.1 +.

Isso ocorre porque todos os aplicativos instalados estão no estado parado. Nesse estado, os aplicativos não receberão QUALQUER notificação de transmissão.

Para ativar seu aplicativo, outro aplicativo (ou usuário) precisa iniciar seu serviço ou atividade ou provedor de conteúdo. O fluxo de trabalho usual é quando o usuário clica no ícone do seu aplicativo.

Eu escrevi explicações detalhadas sobre isso no meu postagem no blog .

14
inazaruk

O plano B faz esse lançamento ouvindo os eventos que acontecem no sistema. Ele usa um receptor que literalmente escuta centenas de eventos, esperando que alguns deles acabem sendo acionados. Então é assim que você pode fazer. Caso contrário, não há meios internos para iniciar o aplicativo assim que ele for instalado.

5
Malcolm

Não sei ao certo quais são suas restrições/objetivo, mas se você puder instalar outro aplicativo que tenha uma atividade, poderá enviar uma intenção com o sinalizador FLAG_INCLUDE_STOPPED_PACKAGES .

Isso usará seu aplicativo para a resolução de intenção, mesmo que esteja em um estado parado. Se a ação da intenção corresponder a um dos seus filtros, também trará o pacote para fora do estado parado.

5
Xiao

Acho que não. Você pode iniciar o serviço imediatamente após a instalação do aplicativo no dispositivo

O aplicativo deve primeiro ser chamado pelo usuário através de algum tipo de Activity. As únicas coisas que você precisa registrar são _Broadcast Receiver_ com intenções apropriadas no manifesto que invocam seu serviço quando algo está acontecendo no dispositivo, mas este restante para Android versão 3.1.

EDIT:

Depois de Android 3.1 + em diante, você não pode usar nenhum Broadcast para iniciar seu aplicativo, porque todo o aplicativo permanece no estado inativo após a conclusão da inicialização do dispositivo e para iniciar o aplicativo, o usuário precisa invocá-lo (Tocando no ícone do aplicativo).

3
user370305

Talvez a melhor maneira de fazer isso (e agora estou falando com a intenção específica do OP, um programa que é instalado para recuperar um telefone roubado, não a questão geral) seja engenharia social, não engenharia de software.

Portanto, sem dúvida, um ícone com texto como "Lista de senhas" ou "Minhas contas bancárias" que apareceu repentinamente na tela inicial. Veja o sucesso de todos os tipos de outros phishing, e aqui você estaria mirando um ladrão, que já está motivado para continuar com atividades nefastas. Deixe o ladrão começar por você. :)

1
Anders8

Conforme declarado pelo CommonsWare em a resposta a esta pergunta (que eu suponho que você já tenha visto, mas optou por ignorar) iniciar um Serviço na instalação não é possível - simplesmente não é algo implementado na plataforma.

Iniciá-lo automaticamente na próxima inicialização, no entanto, é possível.

Conforme declarado nos detalhes técnicos do Plano B:

O plano B tentará iniciar assim que for baixado, mas em alguns casos você precisará enviar um SMS para iniciá-lo.

Meu palpite é que, em um telefone com root, você poderá iniciar o Service na instalação - mas não há garantia de que o telefone esteja com root , é por isso que o PlanB exigirá o recebimento de um texto em alguns casos, porque isso pode ser registrado pelo IntentFilter do aplicativo e, em seguida, usado para iniciar o Service.

1
kaspermoerch

existe um aplicativo no google play Android Lost que invoca o serviço de registro para mensagens push do Google por meio de um sms recebido sem iniciar o aplicativo nem uma vez para a versão 3.0+.

1
test