在不使用主Activity的情况下启动Android应用程序并在启动应用程序时启动服务

105
我在我的应用程序中有以下场景。我的应用程序没有 UI,而是有一个服务,在启动时会持续运行。
我如何在没有主 Activity 的情况下配置清单文件?我能否在没有任何 Activity 的情况下启动我的应用程序?当启动我的应用程序时,我的服务应该启动。这个可能吗?
我不想创建一个半透明 Activity 来启动服务。

请查看此问题 - Munish Kapoor
4个回答

136

您说您不想使用半透明的活动,但似乎这是最好的方法:

  1. 在您的清单中,将活动主题设置为Theme.Translucent.NoTitleBar
  2. 不需要为您的活动创建布局,也不要调用setContentView()
  3. 在您的活动的onCreate()中,使用startService()启动您的服务。
  4. 一旦您启动了服务,就用finish()退出活动。

换句话说,您的活动不必可见;它只需确保您的服务正在运行,然后退出,听起来像您想要的。

我强烈建议至少显示一个Toast通知,告诉用户您正在启动服务,或者它已经在运行。当用户按下图标时,什么都不做是非常糟糕的用户体验。


2
启动我的应用程序后,它只显示一个空屏幕,这不应该发生... - Meher
1
@meher,我刚刚测试了一下,它对我来说完美无缺——我的服务启动了,我甚至没有看到任何活动,即使只是瞬间。请发布您的Activity onCreate() 的内容,我们应该能够找出问题所在。 - Darshan Rivka Whittle
当我第一次安装我的应用程序时,我可以看到活动在一秒钟内启动并消失。 - Meher
@DarshanComputing 你不应该使用bindService,而是使用startService吗?当Activity不存在时,仅绑定的服务不会被终止吗? - David Doria
1
我知道这是一个老问题,但它似乎不再起作用了。将主活动主题更改为Theme.Translucent.NoTitleBar或Theme.Translucent.NoTitleBar.FullScreen会导致原本工作正常的应用程序在短暂显示活动屏幕后变成始终引发“应用程序停止响应”消息的应用程序。 - alzee
显示剩余5条评论

36

您可以通过创建一个BroadcastReceiver,在应用程序启动时调用您的Service来实现这一点。以下是我给出的完整答案。
Android - Start service on boot

如果您不想为应用程序创建任何图标/启动器,那也可以,只需不创建任何带有

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

只需像通常声明一样声明您的Service


4
听起来询问者不介意在启动时启动"Service",但想知道如何没有主要的"Activity",只需确保当按下启动器图标时"Service"正在运行。 - Darshan Rivka Whittle
2
但是听起来他们想要一个启动器图标,当按下时,确保服务正在运行。您的建议只是摆脱了启动器图标。 - Darshan Rivka Whittle
在启动我的应用程序时 - 应用程序无法启动,没有活动。如果您想启动应用程序,必须创建一个活动。 - Lalit Poptani
4
除了 SyncAdapter,我无法启动我的应用程序,除非在 AndroidMenifest.xml 中包含 MAIN、LAUNCHER。你的回答真的是正确的吗? - sunghun
1
我已经删除了带有动作和类别标签的意图过滤器。现在应用程序在Android Studio中无法运行。 - Nauman Ash
显示剩余7条评论

24
创建无Activity或服务的应用程序的原因可能是为了创建一个不需要启动的主屏幕小部件应用程序。 在创建项目后,请勿创建任何活动。创建项目后,只需单击运行。Android Studio将显示“找不到默认活动”。 单击编辑配置(从运行菜单中),在启动选项部分将启动值设置为Nothing。 然后单击确定并运行该应用程序。 注意: 由于该应用程序没有启动器活动,因此应用程序菜单中不会显示任何图标。而是在设备的应用程序管理器中寻找它。

2
谢谢,那正是我的情况。如果您没有像我一样看到“编辑配置”选项,请从主菜单中选择“运行>运行...”,然后选择“编辑配置...”。 - pm_
1
此外,应用程序类未启动。 - Maor Hadad

8

Android Studio 2.3 版本

您可以通过几个简单的步骤创建一个没有主活动的服务。您将能够通过Android Studio安装此应用程序并像普通应用程序一样调试它。

首先,在Android Studio中创建一个没有活动的项目。然后创建您的服务类并将服务添加到AndroidManifest.xml文件中。

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

现在,在“运行”按钮(绿色箭头)旁边的下拉菜单中,选择“编辑配置”,并在“启动选项”中选择“Nothing”。这将允许您安装服务而不会导致Android Studio抱怨缺少主活动。

一旦安装完成,该服务将不会运行,但您可以使用以下adb shell命令启动它...

am startservice -n com.whatever.myservice/.MyService

可以通过以下方法检查它是否正在运行:

ps | grep whatever

我还没有尝试过,但你很可能可以让Android Studio自动启动服务。这可以在“编辑配置”菜单中完成。

1
我从adb shell中得到以下错误:Starting service: Intent { cmp=com.example.wolk.myapp/.MyIntentService } Error: Not found; no service started. LOGCAT显示:ActivityManager: don't allow to start ServiceInfo{274d8af com.example.wolk.myapp.MyIntentService - Trismegistos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接