.apk首次安装时如何启动服务
在我的应用程序中,我没有任何UI部分,所以我需要在应用程序安装到设备上后立即启动服务。 我看到很多的答案是不可能的,但我想这肯定是可能的。 只要看看Android Market上满足我的要求的PlanB应用程序。 下面是我的清单文件,我如何尝试,但服务没有被调用。 所以,让我知道什么是应用程序安装时启动服务的最佳方式。
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>
幸运的是,在XOOM和Galaxy Nexus上进行测试,Plan B无法在Android 3.1+上运行。
B计划做的是利用可能被恶意软件利用的安全漏洞,这就是为什么Android能够阻止它再次发生的原因。
UPDATE
澄清:作为inazaruk张贴和我把其他答案的意见,所有的应用程序,安装后,被置于“停止”状态。 这与应用程序在用户强制停止应用程序之后应用程序所处的状态相同。 处于“停止”状态时,应用程序不会以任何理由运行,除非手动启动活动。 值得注意的是,无论用户注册哪个事件,都不会调用BroadcastReceviers
,直到用户手动运行应用程序为止。
该块涵盖了他们之前利用的远程安装和运行的计划B方案。 毕竟,有了这个,被黑客入侵的Google账号的任何人都有可能感染他们的设备,而且还是免提的。
所以,当OP说:
只要应用程序安装在设备上,我就需要启动服务
OP将不成功,需要重新设计应用程序以避免这种“需求”。
安装在/ system分区上的应用程序不会被置于“停止”状态。 如果你有根,你可以做,
$ adb root $ adb remount $ adb push your.apk /system/app
它可以立即收到广播意图。 这当然不能提供一个通用的解决方案,但我想提到它的完整性。
我同意CommonsWare的回答问题: 如何在安装时启动android服务 。 换句话说,刚刚安装后,您不能自动启动您的服务。
关于更新的Android平台还有一件事情:如果您根本没有UI,那么即使在Android 3.1+上使用BOOT_COMPLETE
意图,您也无法启动服务。
这是因为所有安装的应用程序都处于停止状态。 在这种状态下,应用程序将不会收到任何广播通知。
为了激活你的应用程序,一些其他应用程序(或用户)需要启动你的服务或活动,或内容提供者。 通常的工作流程是当用户点击你的应用程序的图标。
我在博客文章中详细解释了这一点。
B计划通过监听系统中发生的事件来启动。 它使用一个接收器,从字面上监听数百个事件,希望其中的一些最终会启动。 所以这是你如何做到的。 否则,一旦安装,就没有内置的方法来启动应用程序。
我不确定你的约束/目的是什么,但是如果你可以安装另一个有活动的应用程序,你可以发送一个意向,标志为FLAG_INCLUDE_STOPPED_PACKAGES 。
这将使用您的应用程序意图解决,即使它处于停止状态。 如果意图的行为与您的某个过滤器相匹配,则也会使软件包脱离停止状态。
我不这么认为你可以在设备上安装应用程序后立即开始服务,
该应用程序必须首先由用户通过某种Activity
来调用。唯一的事情你必须注册一些Broadcast Receiver
与清单中的适当的意图,当设备上发生的事情正在调用你的服务,但是这个再版到Android 3.1版本。
编辑:
在Android 3.1之后,你不能使用任何Broadcast
来启动你的应用程序,因为所有的应用程序在设备启动完成后仍然处于非活动状态,并启动用户必须调用的应用程序(通过触摸应用程序图标)。
正如CommonsWare在回答这个问题 (我想你已经准备好了,但是选择忽略)中所说的那样,在安装时启动一个服务是不可能的 – 这根本不是在平台上实现的东西。
然而,在下一次启动时自动启动它是可能的。
如PlanB的技术细节所述:
计划B将尽快下载,但在某些情况下,您需要发送短信才能开始下载。
我的猜测是,在一根扎根的手机上,您可能可以在安装时启动Service
– 但不能保证手机已经扎根,这就是为什么PlanB在某些情况下需要接收文本的原因,因为可以由IntentFilter
该应用程序,然后用于启动Service
。
有一个应用程序在谷歌玩Android丢失 ,通过传入短信调用注册服务的谷歌推送消息,甚至没有启动应用程序,甚至一次3.0 +版本。
也许最好的办法是完成这个任务(现在我正在谈论OP的具体意图,一个安装程序,以检索被盗手机,而不是一般问题)是社会工程,而不是软件工程。
所以,一个突然出现在主屏幕上的带有“密码列表”或“我的银行账户”这样的文本的图标无疑将被点击。 看看各种其他网络钓鱼的成功,在这里你将针对一个谁已经动机继续邪恶的活动的小偷。 让小偷为你开始。 🙂