如何在首次安装.apk时启动服务

Lal*_*ani 67 android android-widget android-emulator android-layout

在我的应用程序中,我没有任何UI部分,因此我需要在Device上安装Applicaton后立即启动服务.我看到很多链接,答案是不可能的,但我想这肯定是可能的.只需查看符合我要求的Android Market上的PlanB应用程序即可.下面是我的Manifest文件我是如何尝试的,但根本没有调用该服务.所以,让我知道在应用程序安装时启动服务的最佳方法是什么.

UPDATE

我也试过使用android.intent.action.PACKAGE_ADDED它可以很好地检测其他应用程序的包,但不适用于自己.

<?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>
Run Code Online (Sandbox Code Playgroud)

Com*_*are 80

幸运的是,在XOOM和Galaxy Nexus上进行测试时,Plan B无法在Android 3.1+上运行.

Plan B所做的是利用驱逐恶意软件可能使用的安全漏洞,这正是Android阻止它再次发生的原因.


UPDATE

澄清:正如inazaruk发布并且我对其他答案发表评论,所有应用程序在安装时都处于"停止"状态.这与用户从"设置"应用程序强制停止应用程序后应用程序结束的状态相同.在处于"停止"状态时,除了手动启动活动外,应用程序不会以任何理由运行.值得注意的是,BroadcastReceviers在用户手动运行应用程序之前,无论他们注册了哪个事件,都不会调用no .

该块涵盖了远程安装和运行的Plan B场景,他们之前正在利用它们.毕竟,有了这个,任何拥有黑客谷歌帐户的人都有可能感染他们的设备,实际上是免提.

因此,当OP说:

我需要在Device上安装Applicaton后立即启动服务

OP将不成功,需要重新设计应用程序以避免这种所谓的"需要".


Jef*_*man 17

安装在/ system分区上的应用程序在安装后不会被置于"已停止"状态.如果你有root,你可以这样做,

$ adb root
$ adb remount
$ adb push your.apk /system/app
Run Code Online (Sandbox Code Playgroud)

它可以立即接收广播意图.这肯定不提供通用解决方案,但我想提及它的完整性.

编辑:请记住,不同版本的Android在不同的地方定位系统APK.例如,Android 8将它们放在/system/app//.apk下.将Shell封装到您的设备中,然后按照与其他系统APK相同的方案进行操作.

  • 当然,他将能够更新系统应用程序.只要您具有相同的包名称和签名,您就可以更新系统应用程序.更新将放在数据分区上,但仍具有"系统"状态,因为系统分区上的先前版本可用. (3认同)
  • @JeffreyBlattman是的,我同意你的观点.我正在评论Vipin的评论.我不同意他的说法,即每次更新都必须通过adb命令完成.我的观点是他们只需要做一次.一旦apk在/ system/app中,就可以使用正常的app install/update. (2认同)
  • 我一直使用平台证书签署我的应用程序,但使用adb"正常"安装它.直到我将apk推送到/ system/app,该服务才开始自行启动.这个答案非常有帮助. (2认同)

ina*_*ruk 14

我同意CommonsWare对问题的回答:如何在安装时启动android服务.换句话说,刚刚安装后,您无法自动启动服务.

关于较新的Android平台还有一件事:如果您根本没有UI,即使BOOT_COMPLETE在Android 3.1+上使用intent ,您也无法启动服务.

那是因为所有已安装的应用程序都处于停止状态.在此状态下,应用程序将不会收到任何广播通知.

为了激活您的应用程序,某些其他应用程序(或用户)需要启动您的服务或活动或内容提供商.通常的工作流程是用户点击应用程序的图标.

我在博文中写了详细的解释.


Mal*_*olm 5

B计划通过收听系统中发生的事件来启动此功能.它使用一个接收器,它真正地听取了数百个事件,希望它们中的一些最终会启动.所以这就是你如何做到的.否则,安装后立即没有内置方法来启动应用程序.


Xia*_*iao 5

我不确定你的约束/目的是什么,但如果你可以安装另一个有活动的应用程序,你可以让它发送一个带有FLAG_INCLUDE_STOPPED_PACKAGES标志的意图.

这将使用您的应用程序进行意图解析,即使它处于停止状态.如果intent的操作与您的某个过滤器匹配,它也会使程序包退出停止状态.