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

时间:2011-12-16 09:07:19

标签: android android-layout android-emulator android-widget

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

更新

我也尝试使用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>

10 个答案:

答案 0 :(得分:79)

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

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


<强>更新

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

该块涵盖了远程安装和运行的B计划方案,他们之前正在利用这些方案。毕竟,有了这个,任何拥有黑客谷歌帐户的人都有可能感染他们的设备,无需亲自动手。

所以,当OP说:

  

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

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

答案 1 :(得分:17)

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

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

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

编辑:请记住,不同版本的Android会在不同的地方找到系统APK。例如,Android 8将它们放在/system/app//.apk下。密封到您的设备中,并使用与其他系统APK相同的方案。

答案 2 :(得分:14)

我同意CommonsWare对问题的回答:How to start android service on installation。换句话说,刚刚安装后,您无法自动启动服务。

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

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

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

我在blog post中已经写了详细的解释。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

我不这么认为您可以在设备上安装应用程序后立即启动服务,

用户必须首先通过某种Activity来调用应用程序。您必须在清单中使用适当的意图注册一些Broadcast Receiver,以便在设备上发生某些事情时调用您的服务但这个重新安装到Android 3.1版本。

修改

Android 3.1 + 之后,您无法使用任何Broadcast启动应用程序,因为所有应用程序在设备启动完成后仍处于非活动状态并启动用户拥有的应用程序调用它。(通过触摸应用程序图标)。

答案 6 :(得分:1)

正如CommonsWare在the answer to this question中所说的那样(我想你已经准备好了,但选择忽略了)在安装时启动服务是不可能的 - 它根本不是在平台中实现的东西。

然而,可以在下次启动时自动启动它。

如PlanB的技术细节所述:

  

B计划会在下载后立即启动,但在某些情况下,您需要发送短信才能启动。

我的猜测是,在root用户手机上,你可能能够在安装时启动Service - 但不能保证手机已植根,这就是为什么PlanB将要求在某些情况下接收文本,因为该文本可以由应用的IntentFilter注册,然后用于启动Service

答案 7 :(得分:1)

谷歌播放Android Lost上有一个应用程序,它通过传入的短信调用google推送消息的注册服务,而无需为版本3.0 +启动应用程序一次。

答案 8 :(得分:1)

也许是实现这一目标的最佳方法(现在我正在谈论OP的具体意图,为了检索被盗手机而安装的程序,而不是一般性问题)是社会工程,而不是软件工程

因此,毫无疑问会点击主屏幕上突然出现的带有“密码列表”或“我的银行账户”等文字的图标。看看各种其他网络钓鱼的成功,在这里你将瞄准一个小偷,他已经有动力继续进行恶意活动。让小偷为你开始吧。 :)

答案 9 :(得分:-5)

嘿我认为使用BroadcastRecivier在设备重启时自动启动应用程序因此它会在设备启动时自动启动。希望这会有所帮助