在 Android O 及更高版本中,应用程序在后台运行时,前台服务需要显示一个通知,以便用户知道服务正在运行。当应用程序被杀死或重新启动时,前台服务需要能够与活动进行通信。以下是一个处理与活动通信的示例:
首先,在 AndroidManifest.xml 文件中声明前台服务:
接下来,创建一个前台服务类 MyForegroundService:
public class MyForegroundService extends Service {
private static final String CHANNEL_ID = "ForegroundServiceChannel";
private static final String ACTION_STOP_SERVICE = "StopService";
private MyBroadcastReceiver receiver;
@Override
public void onCreate() {
super.onCreate();
receiver = new MyBroadcastReceiver();
registerReceiver(receiver, new IntentFilter(ACTION_STOP_SERVICE));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
createNotificationChannel();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Intent stopIntent = new Intent(this, MyForegroundService.class);
stopIntent.setAction(ACTION_STOP_SERVICE);
PendingIntent stopPendingIntent = PendingIntent.getService(this, 0, stopIntent, 0);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Foreground Service")
.setContentText("Service is running")
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(pendingIntent)
.addAction(R.drawable.ic_stop, "Stop Service", stopPendingIntent)
.build();
startForeground(1, notification);
// 在此处处理与活动的通信逻辑
if (intent != null && intent.hasExtra("message")) {
String message = intent.getStringExtra("message");
sendMessageToActivity(message);
}
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Foreground Service Channel",
NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
}
private void sendMessageToActivity(String message) {
Intent intent = new Intent(MainActivity.ACTION_MESSAGE_RECEIVED);
intent.putExtra("message", message);
sendBroadcast(intent);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_STOP_SERVICE)) {
stopSelf();
}
}
}
}
在活动 MainActivity 中,你可以接收来自前台服务的广播消息:
public class MainActivity extends AppCompatActivity {
public static final String ACTION_MESSAGE_RECEIVED = "MessageReceived";
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new MyBroadcastReceiver();
registerReceiver(receiver, new IntentFilter(ACTION_MESSAGE_RECEIVED));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_MESSAGE_RECEIVED)) {
String message = intent.getStringExtra("message");
// 处理来自前台服务的消息
Toast.makeText(MainActivity.this, "Received message: " + message, Toast.LENGTH_SHORT).show();
}
}
}
}
这样,你就可以在前台服务中使用 sendMessageToActivity()
方法发送消息,然后在 MainActivity 中接收并处理这些消息了。