【问题标题】:How to start a Service when .apk is Installed for the first time第一次安装 .apk 时如何启动服务
【发布时间】:2012-01-21 20:20:30
【问题描述】:

在我的应用程序中,我没有任何 UI 部分,因此我需要在设备上安装应用程序后立即启动服务。我看到很多链接,答案是不可能的,但我想这肯定是可能的。看看 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/…?
  • @Lalit:调查从市场上推送安装应用程序会发生什么以及它可以做什么。某些事情正在触发 B 计划开始 - 它不会自动开始。我刚刚安装它,我想知道安装是否向他们的服务器发送了一些东西,然后向我的设备发送了一封电子邮件。 BroadcastReceiver 监听来自特定电子邮件地址的传入电子邮件可用于启动Service。在那之后,我不太了解市场上的 PUSH 安装如何工作,或者它们如何在没有用户输入的情况下安装,因此无法进一步提供帮助。
  • @Lalit: 你好,你有没有找到第一次安装apk时启动服务的方法?
  • 不,如果应用程序中没有任何 UI 部分,这是不可能的。
  • 感谢您的快速响应。我还有一个疑问。那么是否可以在没有任何应用程序图标的情况下创建应用程序?意味着该应用程序仅包含广播接收器和服务。

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


【解决方案1】:

幸运的是,在 XOOM 和 Galaxy Nexus 上测试过,Plan B 不适用于 Android 3.1+。

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


更新

澄清:正如 inazaruk 发布的并且我在其他答案中放入 cmets,所有应用程序在安装后都处于“停止”状态。这与用户从设置应用程序强制停止应用程序后应用程序结束的状态相同。在这种“停止”状态下,应用程序将不会因任何原因运行,除非手动启动活动。值得注意的是,在用户手动运行应用程序之前,不会调用BroadcastReceviers,无论他们注册了哪个事件。

此部分涵盖了他们之前利用的远程安装和运行的 B 计划方案。毕竟,这样一来,任何拥有被黑 Google 帐户的人都将面临设备被感染的风险,而无需动手操作。

所以,当 OP 说:

我需要在设备上安装应用程序后立即启动服务

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

【讨论】:

  • “值得注意的是,在用户手动运行应用程序之前,无论广播接收器注册的事件如何,都不会调用任何广播接收器”或执行硬件操作。这可以包括启动相机或重新启动(正如作者在stackoverflow.com/a/2127179/461982 中提到的那样)。请注意,这很容易让您的应用在 Google Play 上被标记为恶意软件。
【解决方案2】:

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

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

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

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

【讨论】:

  • ,如果他这样做了,他将无法更新应用程序,,,每次他必须执行相同的程序......
  • 正如我所提到的,这不是通用解决方案。
  • 他当然可以更新系统应用。只要您具有相同的包名称和签名,您就可以更新系统应用程序。更新将放置在数据分区上,但仍处于“系统”状态,因为系统分区上有以前的版本可用。
  • @JeffreyBlattman 是的,我同意你的观点。我在评论 Vipin 的评论。我不同意他的说法,即每次更新都必须通过 adb 命令完成。我的观点是它们只需要完成一次。一旦 apk 在 /system/app 中,就可以使用正常的应用安装/更新。
  • 我一直在使用平台证书签署我的应用程序,但使用 adb“正常”安装它。直到我将 apk 推送到 /system/app 服务才自行启动。这个答案很有帮助。
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 您提供了错误博客文章的链接,正确的是“Activating” applications。干杯:)
  • 未找到链接@inazaruk,Alexander Malakhov
  • @inazaruk:你的博客文章有新链接吗?
  • @AjayPandya@Kikiwa@AADTechnical、最新存档的link
【解决方案4】:

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

【讨论】:

  • 哦!因此,收听 100 个事件将消耗最高的电池使用量,因此该应用程序。可能会失败,我认为不会是这样。
  • @Malcolm:+1 - 我同意。 BroadcastReceiver 正在监听一些“外部”触发器。我想知道它是否可能是来自他们服务器的电子邮件,但“外部”可能只是设备本身上的其他一些“事件”。
  • @Lalit:“...成本最高的电池使用量,所以应用程序可能会失败...”。我刚刚安装了 B 计划,它会自动在我的手机上启用 GPS。您是否见过 GPS 会以多快的速度耗尽 HTC Desire 上的电池?比使用被动BroadcastReceiver 侦听各种系统事件要快得多。
  • 嗯,系统没有提供方法来做到这一点,所以 B 计划使用的方式是明显的 hack,甚至不能保证工作。当然,Plan B 打算在丢失的设备上工作,所以一切手段都很好。但这不是日常使用的应用程序中使用的方法,这是肯定的。您可以收听更少的事件,但这会降低您的应用程序很快启动的机会。
  • @MisterSquonk “如果它可能是来自他们服务器的电子邮件”,但我在想服务器如何知道 App.已安装但尚未发送电子邮件?
【解决方案5】:

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

这将使用您的应用程序来解决意图,即使它处于停止状态。如果意图的操作与您的过滤器之一匹配,它也会使包脱离停止状态。

【讨论】:

    【解决方案6】:

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

    应用程序必须首先由用户通过某种Activity 调用。唯一的事情是你必须在清单中注册一些Broadcast Receiver 与适当的意图,当设备上发生某些事情时调用你的服务,但这仍然是安卓3.1版本。

    编辑:

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

    【讨论】:

    • 那么每次安装新应用时,您都会启动自己的应用....:D.
    • @N-JOY 不用担心,我会检查应用程序的包名称。在这种情况下安装。 :D
    • 你肯定会的,但黑客所需要的只是这个广播并将安装的打包数据发送到远程服务器。
    • "肯定是 RECEIVE_BOOT_COMPLETE 上的那个,你已经试过了。" -- 不适用于 Android 3.1+。在任何BroadcastReceiver 工作之前,用户必须从应用程序手动启动一个活动。
    • @LalitPoptani:一旦用户启动您的应用程序的活动(例如,通过启动器),所有BroadcastReceivers 都将起作用,直到用户从设置应用程序强制停止应用程序,并且应用程序回到第一次安装时的“停止”状态。任务杀手可能也有同样的效果——我没试过。
    【解决方案7】:

    正如 CommonsWare 在 the answer to this question 中所述(我想你们都已经看到了,但选择忽略)在安装时启动服务是不可能的 - 这根本不是在平台中实现的东西。

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

    如 PlanB 的技术细节中所述:

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

    我的猜测是,在有根手机上,您可能能够在安装时启动 Service - 但不能保证手机已被根,这就是 PlanB 需要接收文本的原因在某些情况下,因为可以通过应用程序的IntentFilter 注册,然后用于启动Service

    【讨论】:

    • 是的,但您可以检查我在问题中链接的 PlanB 应用程序。
    • "但是可以在下次启动时自动启动它。" -- 不适用于 Android 3.1+。在任何BroadcastReceiver 工作之前,用户必须从应用程序手动启动一个活动。
    【解决方案8】:

    在 google play Android Lost 上有一个应用程序,它通过传入的短信调用 google 推送消息的注册服务,而对于 3.0+ 版本甚至无需启动该应用程序。

    【讨论】:

      【解决方案9】:

      也许实现这一点的最佳方式(现在我说的是 OP 的特定意图,一个安装用于找回被盗手机的程序,而不是一般问题)是社会工程,而不是软件工程.

      所以,突然出现在主屏幕上的带有“密码列表”或“我的银行账户”等文字的图标无疑会被点击。看看其他各种网络钓鱼的成功情况,您将在这里瞄准一个已经有动机继续进行邪恶活动的小偷。让小偷为你启动。 :)

      【讨论】:

        【解决方案10】:

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

        【讨论】:

        • 这不是一个真实/准确的答案,请检查所选答案以了解为什么这不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多