В манифесте я настроил широковещательный приемник, чтобы он сообщал мне, когда Bluetooth включается или выключается через тосты и регистрирует сообщения.Приемник работал нормально как на «Зефире», так и на «Пироге», но мне нужно, чтобы приложение работало в фоновом режиме, поэтому я настроил постоянное уведомление.После реализации текущего уведомления теперь я могу получать сообщения о тостах / журналах после закрытия приложения на моем устройстве, на котором запущен Marshmallow.Я пытался протестировать приложение на моем устройстве с Pie, но я больше не получаю тосты / сообщения журнала от получателя, даже когда приложение открыто;Я думаю, что это перестало работать полностью.Я прочитал logcat и не увидел ничего, что помогло.
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".OngoingApp">
<service android:name=".NotificationsMessagingService">
<intent-filter android:priority="1">
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service android:name=".OngoingService" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".BReceivers" android:exported="true" android:enabled="true">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
</receiver>
</application>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
BReceivers.kt
import android.bluetooth.BluetoothAdapter
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.Toast
class BReceivers : BroadcastReceiver() {
companion object {
const val TAG = "Bluetoooth"
}
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
when(intent?.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
BluetoothAdapter.STATE_OFF -> Log.d(TAG, "Bluetooth is OFF")
BluetoothAdapter.STATE_TURNING_OFF -> Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_LONG).show()
BluetoothAdapter.STATE_ON -> Log.d(TAG, "Bluetooth is ON")
BluetoothAdapter.STATE_TURNING_ON -> Toast.makeText(context, "Bluetooth is turning ON", Toast.LENGTH_LONG).show()
}
}
}
}
ПостоянныйApp.kt
import android.app.Application
import android.content.Intent
class OngoingApp : Application() {
override fun onCreate() {
super.onCreate()
startService(Intent(this, OngoingService::class.java))
}
}
ПостоянныйService.kt
import android.app.*
import android.content.Intent
import android.os.IBinder
import android.support.v4.app.NotificationCompat
import android.content.Context
import android.os.Build
import android.support.annotation.RequiresApi
import android.support.v4.app.NotificationCompat.PRIORITY_MIN
class OngoingService : Service() {
override fun onBind(intent: Intent): IBinder? {
return null
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
startForeground()
return super.onStartCommand(intent, flags, startId)
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private fun startForeground() {
val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
initChannels("fearApp_service", "Fear Appeals Service")
} else {
// If earlier version channel ID is not used
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
""
}
val notificationIntent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this, 0,
notificationIntent, 0
)
val notificationBuilder = NotificationCompat.Builder(this, channelId )
val notification = notificationBuilder
.setOngoing(true)
.setContentTitle(getString(R.string.app_name))
.setContentText("Fear Appeals is running background")
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(PRIORITY_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.setContentIntent(pendingIntent)
.build()
startForeground(101, notification)
}
@RequiresApi(Build.VERSION_CODES.O)
private fun initChannels(channelId: String, channelName: String): String {
val channel = NotificationChannel(
channelId,
channelName,
NotificationManager.IMPORTANCE_DEFAULT)
channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
channel.description = "Ongoing notification to keep the app opened."
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
return channelId
}
}