我正在设计一个基本上只是一项服务的应用。
它没有 MainActivity...只有一个 BroadcastReceiver 和一个服务。每次我构建和安装时,什么都没有发生。广播接收器检测手机是否连接到 WiFi 网络。如果 WiFi 未连接,它将 stopService(),否则它 startService()。
该服务将检查 Pebble 应用消息并在收到消息时执行某些命令。问题是,如果没有 MainActivity,我将无法启动该服务。
会不会是因为我没有MainActivity
?
最佳答案
简单的后台应用程序在 Android 3.0 版本后停止工作。
从 Android 3.1 开始,系统的包管理器会跟踪处于停止状态的应用程序,并提供一种控制它们从后台进程和其他应用程序启动的方法。
系统将 FLAG_EXCLUDE_STOPPED_PACKAGES
添加到所有广播 Intent 。它这样做是为了防止来自后台服务的广播无意中或不必要地启动已停止的应用程序的组件。更多信息 Launch controls on stopped applications .
正如您所提到的,您只有一个 BroadcastReceiver
和一个 Service
而没有 Activity
所以问题可能出在您的 BroadcastReceiver
可能永远不会启动,因为 FLAG_EXCLUDE_STOPPED_PACKAGES
标志。
要接收广播,您的应用程序进程应处于 Activity 状态。 Android 操作系统不允许 BroadcastReceiver
在应用进程不活动时接收一些广播。
如果您有一个正在运行的 Activity ,那么您的进程是 Activity 的,因此您的接收器可以接收广播。
你可以做的是在没有任何 UI 的情况下制作一个透明的 Activity
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
并使用startService()
在后台启动服务,然后调用Activity
的finish()
。当您的服务正在运行时,你的进程是活的,所以 Android 操作系统会让你接收广播。
关于Android 应用程序,仅服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22652350/