Android O 前台服务 - 如何处理与活动的通信,即使应用程序被从后台杀死或重新启动
创始人
2024-08-14 21:00:45
0

在 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 中接收并处理这些消息了。

相关内容

热门资讯

1分钟辅助挂!川娱竞技辅助,鄱... 1分钟辅助挂!川娱竞技辅助,鄱阳翻精辅助软件,存在挂教程(原来是真的有挂)所有人都在同一条线上,像星...
第4分钟辅助!掌中乐游戏中心辅... 第4分钟辅助!掌中乐游戏中心辅助器,情怀莆仙吹牛脚本,揭秘教程(都是真的是有挂);1)掌中乐游戏中心...
九分钟了解!菜鸟黑桃a3作弊,... 九分钟了解!菜鸟黑桃a3作弊,大巴杭州辅助,靠谱教程(真是真的是有挂);1、金币登录送、破产送、升级...
2分钟了解!禅游指尖四川修改器... 2分钟了解!禅游指尖四川修改器,决战卡五星辅助器,技巧教程(本来存在有挂)1、该软件可以轻松地帮助玩...
三分钟了解!赣牌圈修改器,新道... 三分钟了解!赣牌圈修改器,新道游app辅助器,玩家教你(确实是有挂)1、新道游app辅助器系统规律教...
六分钟了解!家乡大二辅助免费,... 六分钟了解!家乡大二辅助免费,山西扣点辅助工具,软件教程(其实是真的有挂)1、完成山西扣点辅助工具的...
2分钟辅助挂!广东雀神智能插件... 2分钟辅助挂!广东雀神智能插件,鱼乐吧游戏脚本,软件教程(都是是有挂)所有人都在同一条线上,像星星一...
第五分钟辅助!朱雀开心罗松辅助... 第五分钟辅助!朱雀开心罗松辅助器,财神十三张脚本效果图,存在挂教程(好像有挂)1、财神十三张脚本效果...
7分钟了解!多乐手游辅助,安庆... 7分钟了解!多乐手游辅助,安庆胡乐麻将辅助器,2025教程(总是真的有挂);运安庆胡乐麻将辅助器辅助...
三分钟了解!西兵互娱辅助插件a... 三分钟了解!西兵互娱辅助插件app,老友辅助工具下载,科技教程(竟然真的是有挂)1、全新机制【西兵互...