- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的前台服务而苦苦挣扎。在我的设备(Redmi 5 Plus,Android 8.1.0)上,服务通知不再可见应用程序已从最近的应用程序中删除。在其他设备(Android 5.0.1、Android 7.0)和模拟器(android 8.1 - api 27)上,当应用从最近的应用中删除时,通知仍然可见。
在主 Activity 中,我正在使用 ContextCompat.startForegroundService(this, intent)
来启动我的服务。
前台服务代码如下:
package com.ngallazzi.bluetoothtests.services
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.app.*
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationCompat.PRIORITY_LOW
import android.util.Log
import com.ngallazzi.blemanager.managers.DeviceScanningListener
import com.ngallazzi.blemanager.managers.InRangeDetectionManager
import com.ngallazzi.bluetoothtests.MainActivity
import com.polidea.rxandroidble2.RxBleDevice
/**
* BluetoothTests
* Created by Nicola on 12/17/2018.
* Copyright © 2018 Zehus. All rights reserved.
*/
class DeviceDetectionService : Service() {
private lateinit var detectionManager: InRangeDetectionManager
override fun onBind(intent: Intent): IBinder? {
// We don't provide binding, so return null
return null
}
override fun onCreate() {
super.onCreate()
detectionManager = InRangeDetectionManager(this)
}
@SuppressLint("MissingPermission")
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent != null) {
val action = intent.action
when (action) {
ACTION_START_FOREGROUND_SERVICE -> {
startForegroundService()
detectionManager.startDeviceScanning(object : DeviceScanningListener {
@SuppressLint("CheckResult")
override fun onDeviceFound(device: RxBleDevice) {
device.establishConnection(false).subscribe({
Log.v(TAG, "Connected")
displayNotification(getNotification("Connected with: {${device.name}}"))
}, {
displayNotification(getNotification("An error occurred: {$it.message!!}"))
})
}
override fun onError(message: String?) {
displayNotification(getNotification("An error occurred: {$message}"))
}
})
}
ACTION_STOP_FOREGROUND_SERVICE -> {
stopForegroundService()
}
}
}
return START_NOT_STICKY
}
@SuppressLint("MissingPermission")
private fun startForegroundService() {
startForeground(NOTIFICATION_ID, getNotification(SEARCHING_DEVICES_MESSAGE))
Log.v(TAG, "Device detection service started")
}
private fun getNotification(message: String): Notification {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
createChannel()
val mBuilder = NotificationCompat.Builder(this, CHANNEL_NAME).apply {
setSmallIcon(android.R.drawable.ic_menu_mylocation)
setContentTitle(message)
setContentIntent(getMainActivityPendingIntent())
}
return mBuilder
.setPriority(PRIORITY_LOW)
.setCategory(Notification.CATEGORY_SERVICE)
.build()
}
private fun displayNotification(notification: Notification) {
val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
mNotificationManager.notify(NOTIFICATION_ID, notification)
}
private fun getMainActivityPendingIntent(): PendingIntent {
// Create an Intent for the activity you want to start
val intent = Intent(this, MainActivity::class.java)
// Create the TaskStackBuilder
val pendingIntent = PendingIntent.getActivity(
this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT
);
return pendingIntent!!
}
@TargetApi(26)
@Synchronized
private fun createChannel() {
val mNotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val importance = NotificationManager.IMPORTANCE_DEFAULT
val mChannel = NotificationChannel(CHANNEL_NAME, SEARCHING_DEVICES_MESSAGE, importance)
mNotificationManager.createNotificationChannel(mChannel)
}
private fun stopForegroundService() {
Log.d(TAG, "Stop foreground service.")
// Stop foreground service and remove the notification.
stopForeground(true)
// Stop the foreground service.
stopSelf()
}
override fun onDestroy() {
super.onDestroy()
}
companion object {
private val TAG = DeviceDetectionService::class.java.simpleName
const val NOTIFICATION_ID = 1
const val ACTION_START_FOREGROUND_SERVICE = "start_service"
const val ACTION_STOP_FOREGROUND_SERVICE = "stop_service"
const val CHANNEL_NAME = "DEVICE_DETECTION_SERVICE"
const val SEARCHING_DEVICES_MESSAGE = "Searching in range device"
}
}
这是我的 list 文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ngallazzi.bluetoothtests">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".services.DeviceDetectionService" android:enabled="true"/>
<receiver android:name=".BootCompletedReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.REBOOT"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
</application>
</manifest>
我错过了什么?它是否受后台执行限制的约束?
最佳答案
试试这个
Step 1) Add this tag
android:process
in your service class tag inandroid:process="classname"manifest file
然后在服务类中执行此操作
Step 2) Override
onTaskRemoved()
in service classRestart the service using alarm manager
Step 3) Ask user to enable autorun persmission which has customized os
如果用户启用它,那么您的服务将在应用被终止后运行。
Link for autoenable permission code
注意:- 复制并粘贴这段代码,Kotlin 转换器会自动转换它
关于android - 前台服务在 Oreo 上被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54038396/
我正在关注 Android guide在媒体播放器应用程序中使用 MediaBrowserServiceCompat,但该服务在应用程序退出时被销毁。
我使用System.Windows.Window.IsActive来检测窗口是否位于前台,并且在某些情况下有效。但我发现了一些情况,它没有,我想知道是否有任何方法可以检测到它。 最佳答案 除非仅后台进
我需要为 EditText 的一部分设置样式。我希望文本为白色,背景为灰色。看起来很简单,但事实并非如此。 spanRange.setSpan(new BackgroundColorSpan(Colo
我决定在一个帖子中发布两个问题,因为这是完全相同的问题。 我需要知道屏幕何时打开或关闭,以便我可以打开 LED。第二个我需要知道我的应用程序是在后台还是在前台,以便在应用程序处于后台时管理在某些操作上
关于双高红色录音状态栏有很多问题( here , here ),但是当应用程序退出到后台时,所有这些问题都引用闪烁。我得到了一个闪光,我假设来自 AVCaptureSession设置,而应用程序在前台
我有一个奇怪的案例。我的 swift ios 应用程序已连接到 Cloudkit。如果应用程序未运行(后台状态),我每次都会收到通知徽章和警报!如果应用程序正在运行,则不会收到任何通知!我知道它没有击
我是 firebase 和 android 的新手,我想在我的应用程序中包含实时聊天。但我对 firebase 有以下疑问。请帮忙。 1) 如果应用程序在前台,系统托盘中是否会有默认通知,还是我必须在
我正在为 Excel 编写 VSTO 加载项,我注意到,如果我锁定工作表并使用密码保护它(因此只有我的加载项可以写入它,但用户可以查看它),如果用户尝试编辑工作表时,他们收到“此工作表已锁定”弹出窗口
我正在开发一个 iOS 应用程序,此应用程序允许其用户添加他稍后必须执行的任务。完成添加此任务后,它将发送到服务器以保存在服务器端。现在我对某些情况感到困惑:我的用户在输入任务详细信息时有什么电话..
我正在阅读内存不足 (OOM) killer ,以及 Android 如何确定进程的优先级 (https://developer.android.com/guide/components/proces
我已经在我的新应用程序中启动了一项服务。该服务是前台的,带有通知。当它在 AVD 2.1 API Level 7 中运行时,一切正常。但是当它在运行 Gingerbread 的 Samsung Gal
我的 Laravel 应用程序的结构需要帮助。 我想要的基本上是这个结构: 应用程序接口(interface) 管理面板 公共(public)网站 我开始构建我认为非常正确的文件夹结构: app/
我正在尝试用 CardView 填充我的 RecyclerView,CardView 使用 Android 数据绑定(bind)来设置属性,例如 TextView 中的文本。在未完成喷射的项目上,我想
我想使用 Window Script Host(WSH) 查找当前事件(具有焦点)的窗口的标题,因为我希望我的 WSH 脚本仅在所需窗口处于事件状态时才发送键。 注意*我无法使用替代方案,即在调用 s
如何调试 react-scripts 启动? 这工作正常,我不知道发生了什么变化(我没有改变任何东西) 看来 react-scripts start 无法作为前台进程继续运行。 我的 Dockerfi
我想制作像endonmondo那样的秒表。当我们启动应用程序时,它应该计算时间并更新主 Activity 中的textView(实际上它是一个 fragment )。 我做了后台服务(如 here )
我遇到了一个需求,但我无法获得正确的实现方式,因此需要您的帮助。 我想做什么? - 我想根据收到的通知执行操作,如下所示: 当应用程序打开并位于前台时,即对用户可见并且我收到通知时,我只是显示一个弹出
在 Android 10 中,我注意到我从操作系统收到一条 Toast 消息,说明“此 NFC 标签不支持应用程序”或“此 NFC 标签不支持应用程序”(取决于设备): 奇怪的是,我在 enableR
我是一名优秀的程序员,十分优秀!