【问题标题】:Start a service/foregroundService is bringing app to front if it is in background启动服务/前台服务将应用程序置于后台(如果它在后台)
【发布时间】:2018-10-23 08:25:39
【问题描述】:

一个简单的调用

Intent serviceIntent = new Intent(this, NotificationService.class); startService(serviceIntent);

如果应用程序在后台,则将其置于最前面,如果应用程序关闭,则不会发生任何事情。我想避免这种行为,但我不知道该怎么做。 它发生在 android OP 上。 我已经设置alarmManager在特定时间唤醒我的应用程序,然后pendingIntent启动Activity(它不会在屏幕上显示任何内容)并检查从Intent接收到的操作确定要执行的操作。我的应用程序中有 2 个服务,每次醒来时它们都会将应用程序放在前面,这对用户来说很烦人。

【问题讨论】:

  • 限制已从 android O 添加,这就是原因。
  • 我不认为这是由于 Android 操作系统的行为,我认为您自己的代码在服务启动时以某种方式启动了 Activity。考虑将Activity.getIntent() 的结果转储到Activity.onCreate() 中,并确定它是启动器Intent 还是您的alarmManager Intent。
  • @Jeeva 它确实在奥利奥中发生了变化,但不会导致这个问题。奥利奥要求应用在临时白名单上;否则,服务创建失败并引发异常。 OP 似乎在描述的是一个 Activity 自动返回前台。

标签: android service foreground-service


【解决方案1】:

我通过用PendingIntent.getBroadcast() 替换PendingIntent.getActivity() 解决了这个问题,同时创建了将由AlarmManager 触发的PendingIntent。代码如下:

      private PendingIntent getNotifyIntent() {
         Intent notifyIntent = new Intent(mContext, MyBroadcastReceiver.class);
         return PendingIntent.getBroadcast(mContext, 0, notifyIntent, 0);
}

我之前已经使用过此代码 (PendingIntent.getActivity()),但我从未见过该应用程序出现在屏幕上。我使用的活动是完全透明和不可见的,它没有在屏幕上放置布局。我使用它是因为由于某种原因使用广播不起作用。但是现在应用程序正在打开,我想是因为打开的透明活动会检查应该做什么和关闭,在它显示在屏幕上之前调用活动。

恢复:问题不在于服务本身,而是我设置AlarmManager 的方式

在帮助下把你们全部坦克!

【讨论】:

    【解决方案2】:

    在 Android 8.0 之前,创建前台服务的常用方法是 创建一个后台服务,然后将该服务推广到 前景。使用 Android 8.0,有一个复杂之处;系统 不允许后台应用程序创建后台服务。为了 为此,Android 8.0 引入了新方法 startForegroundService() 在前台启动一个新服务。 系统创建服务后,应用程序有 5 秒时间 调用服务的 startForeground() 方法来显示新服务的 用户可见的通知。如果应用没有调用 startForeground() 时限内,系统停止服务并声明 应用成为 ANR。

    https://developer.android.com/about/versions/oreo/background
    https://stackoverflow.com/a/47611385/6059583
    按照此链接显示如何显示运行服务 i 后台的通知

    【讨论】:

    • 我的问题不是服务没有启动,它正常启动,问题是如果应用程序在后台打开,服务启动时它会被带到前面。如果我的应用在后台打开,我只需要运行我的前台服务而不自动向用户显示我的应用
    • 那么你需要显示一个通知来表明你的服务正在后台运行
    • 我愿意,我用 Intent 启动一个服务 serviceIntent = new Intent(this, NotificationService.class);启动服务(服务意图);在 NotificationService 中,我创建了一个通知并调用 startForeground。一切正常,但如果应用程序已经在后台打开,它会显示给用户,这就是问题所在,我不希望应用程序来自后台并仅仅因为我启动了服务而显示给用户。
    • -1 这似乎是关于如何启动前台服务的说明,但没有解决 OP 的问题:应用程序在意外时间恢复。
    • @greeble31 这就是为什么我提到来自 android 服务的链接,它说服务行为已完全改变
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2020-06-05
    • 1970-01-01
    • 2011-09-15
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多