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


69

在我的应用程序中,我没有任何用户界面部分,因此,一旦在设备上安装了Applicaton,就需要启动服务。我看到许多链接,答案是不可能的,但我想肯定有可能。只需看看确实满足我要求的Android Market上的PlanB应用程序即可。以下是我尝试的清单文件,但是根本没有调用服务。因此,请让我知道安装应用程序后启动服务的最佳方法是什么。

更新

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

也许这篇文章会对您有所帮助:stackoverflow.com/questions/2227604/…
Yahor11年

@Lalit:调查从市场中按PUSH安装应用程序会发生什么以及它可以做什么。某种原因触发了计划B的启动-它不会自动启动。我刚刚安装了它,我想知道安装是否向他们的服务器发送了一些东西,然后服务器又向我的设备发送了电子邮件。一个BroadcastReceiver用于从特定电子邮件地址收到的邮件收听可以用来启动Service。在那之后,我对Market中的PUSH安装是如何工作的,或者在没有用户输入的情况下如何安装的了解得不够充分,因此无济于事。
Squonk 2011年

@Lalit:嗨,第一次安装APK时,您是否找到启动服务的方法?
Mehul Joisar

不,如果没有应用程序中的任何UI部分,则不可能。
Lalit Poptani

感谢您的快速答复。我还有一个疑问。因此是否可以创建没有任何应用程序图标的应用程序?这意味着该应用程序仅包含广播接收器和服务。
Mehul Joisar

Answers:


80

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

Plan B所做的是利用一个可被偷渡式恶意软件利用的安全漏洞,这正是Android阻止其再次发生的原因。


更新

需要说明的是:正如inazaruk所张贴的,我对其他答案的评论一样,所有应用程序在安装后都处于“停止”状态。在用户从“设置”应用程序中强制停止该应用程序后,该应用程序即进入此状态。在这种“已停止”状态下,该应用程序不会以任何原因运行,除非手动启动活动。值得注意的是,BroadcastReceviers无论用户注册了什么事件,都不会调用no ,直到用户手动运行该应用程序为止。

此块涵盖了他们先前利用的远程安装和运行的Plan B方案。毕竟,有了这些,拥有Google帐户被黑客入侵的任何人都将有被感染设备的风险,并且可以免提。

因此,当OP说:

在设备上安装Applicaton后,我需要立即启动服务

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


“值得注意的是,无论用户注册了什么事件,都不会调用BroadcastReceviers,直到用户手动运行该应用程序为止”或执行硬件操作。这可以包括启动相机或重新启动(正如作者还在stackoverflow.com/a/2127179/461982中提到的那样)。请记住,这很容易使您的应用在Google Play上被标记为恶意软件。
被遗弃的购物车,

17

安装在/ system分区上的应用程序在安装后不会进入“停止”状态。如果您有根,就可以做到,

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

它可以立即接收广播意图。这当然不能提供通用的解决方案,但是为了完整起见,我想提一下。

编辑:请记住,不同版本的Android在不同的位置定位系统APK。例如,Android 8将它们放在/system/app//.apk下。装进您的设备并戳一下,并遵循用于其他系统APK的相同方案。


,如果他这样做,他将无法更新应用程序,,,每次他做同样的手术时间....
VIPIN萨胡

正如我提到的,这不是通用解决方案。
杰弗里·布拉特曼

3
当然,他将能够更新系统应用程序。只要您具有相同的程序包名称和签名,就可以更新系统应用程序。该更新将放置在数据分区上,但由于系统分区上有较早的版本,因此仍处于“系统”状态。
Olle 2012年

2
@JeffreyBlattman是的,我同意你的观点。我在评论Vipin的评论。我不同意他的说法,即每次更新都必须通过adb命令来完成。我的观点是,它们只需要做一次。将APK放入/ system / app后,即可使用正常的app安装/更新。
Olle 2012年

2
我已经使用平台证书对我的应用程序进行了签名,但是使用adb“正常”安装了它。直到我将apk推送到/ system / app时,该服务才自行启动。这个答案很有帮助。
Josh Feldman

14

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

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

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

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

我已经在博客文章中对此进行了详细的解释。


您提供了指向错误博客文章的链接,正确的一个是“激活”应用程序。干杯:)
亚历山大·马拉霍夫

1
未找到链接@ inazaruk,亚历山大·马拉霍夫
阿贾伊·潘迪亚

@inazaruk:您是否为博客文章添加了新链接?
奇奇瓦

@ AjayPandya@ Kikiwa@ AADTechnical,最新的存档链接
丹尼斯T-恢复莫妮卡

5

计划B通过侦听系统中发生的事件来进行启动。它使用一个接收器,从字面上听数百个事件,希望其中一些最终会触发。这就是您可以做到的。否则,没有内置的方法可在应用程序安装后立即启动。


1
哦!!因此,收听100个事件将消耗最高的电池电量,因此该应用程序也是如此。会失败,我认为情况并非如此。
Lalit Poptani 2011年

@马尔科姆:+1-我同意。有一个“外部”触发器正在被听BroadcastReceiver。我想知道这是否可能是来自其服务器的电子邮件,但是通过“外部”,它可能只是设备本身上的其他“事件”。
Squonk 2011年

1
@Lalit:“ ...消耗最高的电池电量,因此应用程序可能会失败...”。我刚刚安装了Plan B,它会在手机上自动启用GPS。您是否曾见过GPS消耗HTC Desire电池的速度有多快???比被动听BroadcastReceiver各种系统事件要快得多。
Squonk 2011年

嗯,系统没有提供执行此操作的方法,因此Plan B的使用方式显然是黑客,甚至不能保证它能正常工作。当然,计划B打算在丢失的设备上工作,所以一切都很好。但这肯定不是在日常应用中使用的方法。尽管可以减少应用程序很快启动的机会,但是您可以听的事件较少。
马尔科姆

@MisterSquonk“如果它可能是来自其服务器的电子邮件”,但我在想服务器如何知道该应用程序。已安装且尚未发送电子邮件?
Lalit Poptani

5

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

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


4

我不认为您可以在设备上安装应用程序后立即开始服务,

该应用程序必须首先由用户通过某种方式调用Activity。您只需注册一些内容即可。Broadcast Receiver需要在清单中以适当的意图事情是在设备上发生某些事情时调用您的服务,但这仍然是Android 3.1版本。

编辑:

Android 3.1及更高版本开始,您将无法使用任何Broadcast程序来启动应用程序,因为在设备启动完成后所有应用程序均处于非活动状态,并且用户必须调用该应用程序才能启动该应用程序(通过触摸应用程序图标)。


然后,每次安装新应用程序时,您都将启动自己的应用程序....:D。
N-JOY

@ N-JOY不必担心我会检查该应用程序的程序包名称。在这种情况下安装。:D
Lalit Poptani 2011年

可以肯定,但是黑客需要的只是广播,并将已安装的打包数据发送到远程服务器。
N-JOY

1
“肯定是一种您已经尝试过的RECEIVE_BOOT_COMPLETE。” -不适用于Android 3.1+。用户必须先从应用程序手动启动活动,然后才能进行任何BroadcastReceiver活动。
CommonsWare

1
@LalitPoptani:一旦用户启动了您的应用程序活动(例如,通过启动器),所有功能都BroadcastReceivers将起作用,直到用户从“设置”应用程序中强制停止该应用程序,并且该应用程序返回到“已停止”状态为止在首次安装时。任务杀手可能也有相同的效果-我还没有尝试过。
CommonsWare,

1

如CommonsWare在此问题的答案所述(我想您已经准备就绪,但选择忽略)中无法在安装时启动Service -这根本不是在平台中实现的事情。

但是,可以在下次启动时自动启动它。

如PlanB的技术详细信息中所述:

计划B将在下载后立即尝试启动,但是在某些情况下,您需要发送SMS才能启动它。

我的猜测是,在有根电话的情况下,您可能可以启动Service安装过程-但不能保证该电话已从根目录开始,这就是为什么PlanB在某些情况下需要接收文本的原因,因为该文本可以由IntentFilter应用的进行注册然后用来启动Service


是的,但您可以检查我在问题中链接的PlanB应用程序。
Lalit Poptani 2011年

“但是,可以在下次启动时自动启动它。” -不适用于Android 3.1+。用户必须先从应用程序手动启动活动,然后才能进行任何BroadcastReceiver活动。
CommonsWare

1

在Google Play Android Lost上有一个应用程序,该应用程序通过传入的短信调用Google推送消息的注册服务,即使版本3.0或更高版本都不会启动该应用程序。


1

也许做到这一点的最佳方法(现在我要讲的是OP的特定意图,即安装程序以检索被盗电话的程序,而不是一般性的问题)是社交工程,而不是软件工程。

因此,无疑会单击突然出现在主屏幕上的带有“密码列表”或“我的银行帐户”之类的文本的图标。看看其他各种网络钓鱼的成功,在这里您将瞄准一个已经有动机继续进行邪恶活动的小偷。让小偷为您启动它。:)


-5

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


这不是一个真实/准确的答案,请检查选择的答案以了解为什么它不起作用。
API_sheriff_orlie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.