我只想让蓝牙保持开启状态,为此我监听蓝牙的状态,如果关闭了,则广播接收器可将其启用。并且我希望即使应用程序关闭后也能运行。因此,我尝试在应用程序关闭后仍运行蓝牙广播接收器(在不工作时)。为此,我了解到需要使用 Work Manager 来支持所有设备。我尝试将 广播接收器和 Work Manager 结合 使用。但无法在应用程序关闭时运行它。
这是我的 MainActivity.java,我在其中排队工作请求。
以下类是我的 MyWorker.java。在这里,我注册了接收器。
以下是我的 BlueToothBroadcastReceiver.java 类,我在这里监听蓝牙状态的变化,并尝试在它关闭时打开它。当应用程序正在运行时,它能够正常工作。但是我希望它也可以在应用程序关闭时工作,但我无法实现它。
这是我的 MainActivity.java,我在其中排队工作请求。
package com.example.workmanagersample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class).build();
WorkManager.getInstance().enqueue(workRequest);
}
}
以下类是我的 MyWorker.java。在这里,我注册了接收器。
package com.example.workmanagersample;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.IntentFilter;
import android.support.annotation.NonNull;
import android.support.v4.app.NotificationCompat;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class MyWorker extends Worker {
private BlueToothBroadcastReceiver myReceiver;
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
/*
* This method is responsible for doing the work
* so whatever work that is needed to be performed
* we will put it here
*
* For example, here I am calling the method displayNotification()
* It will display a notification
* So that we will understand the work is executed
* */
@NonNull
@Override
public Result doWork() {
displayNotification("My Worker", "Hey I finished my work");
setReceiver();
return Worker.Result.success();
}
/*
* The method is doing nothing but only generating
* a simple notification
* If you are confused about it
* you should check the Android Notification Tutorial
* */
private void displayNotification(String title, String task) {
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("simplifiedcoding", "simplifiedcoding", NotificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder notification = new NotificationCompat.Builder(getApplicationContext(), "simplifiedcoding")
.setContentTitle(title)
.setContentText(task)
.setSmallIcon(R.mipmap.ic_launcher);
notificationManager.notify(1, notification.build());
}
private void setReceiver() {
myReceiver = new BlueToothBroadcastReceiver();
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
getApplicationContext().registerReceiver(myReceiver, filter);
}
}
以下是我的 BlueToothBroadcastReceiver.java 类,我在这里监听蓝牙状态的变化,并尝试在它关闭时打开它。当应用程序正在运行时,它能够正常工作。但是我希望它也可以在应用程序关闭时工作,但我无法实现它。
package com.example.workmanagersample;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BlueToothBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
switch (state) {
case BluetoothAdapter.STATE_OFF:
setBluetooth(true);
// Bluetooth has been turned off;
break;
case BluetoothAdapter.STATE_TURNING_OFF:
setBluetooth(true);
// Bluetooth is turning off;
break;
case BluetoothAdapter.STATE_ON:
// Bluetooth has been on
break;
case BluetoothAdapter.STATE_DISCONNECTING:
setBluetooth(true);
// Bluetooth is turning on
break;
case BluetoothAdapter.STATE_DISCONNECTED:
setBluetooth(true);
// Bluetooth is turning on
break;
}
}
}
public static boolean setBluetooth(boolean enable) {
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
boolean isEnabled = bluetoothAdapter.isEnabled();
if (enable && !isEnabled) {
return bluetoothAdapter.enable();
}
else if(!enable && isEnabled) {
return bluetoothAdapter.disable();
}
// No need to change bluetooth state
return true;
}
}
最后是我的清单文件;
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.workmanagersample">
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<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">
<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=".BlueToothBroadcastReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED"/>
<action android:name="android.bluetooth.adapter.action.STATE_OFF"/>
<action android:name="android.bluetooth.adapter.action.STATE_TURNING_OFF"/>
<action android:name="android.bluetooth.adapter.action.STATE_ON"/>
<action android:name="android.bluetooth.adapter.action.STATE_DISCONNECTING"/>
<action android:name="android.bluetooth.adapter.action.STATE_DISCONNECTED"/>
</intent-filter>
</receiver>
</application>
</manifest>
在周末进行了研究后,我选择使用Work Manager,但是当我关闭应用程序时它并没有起作用。是否有什么我错过的内容或者有任何限制?如果有,我该如何解决?非常感谢您的帮助!谢谢!
Service
进行后台工作有不同的目的,在您的情况下,我认为应该使用前台服务。无论如何,在测试期间我的更改都完美地运行。 - GensaGames