安卓开发中,service和activity通信方式简述

首先给出综述,一共有4中形式:intent、messenger、绑定服务以及广播


第一种:Intent

设定现在一个app,包含一个计时器功能,用户点击activity启动按钮执行计时器,并且在service中执行计时的操作;同时,activity还要获取当前的计时时间并显示在界面上。

给出伪代码:

// 在Activity中启动Service,并传递数据
Intent intent = new Intent(this, TimerService.class);
intent.putExtra("start_time", System.currentTimeMillis());
startService(intent);

// 在Service中获取传递的数据
long startTime = getIntent().getLongExtra("start_time", 0);

第二种:Messenger

首先阐述一下messenger的原理:

  1. 创建一个messenger:发送端也叫做客户端,创建一个Handler对象,并且将其和一个Messenger实例关联起来;接收端也叫做服务端,需要创建一个Handler对象,并且将其和一个已经存在的Messenger实例关联起来。
  2. 绑定messenger:发送端利用bindService方法,把客户端和服务端绑定,获取到一个IBinder对象;将这个IBinder对象传递给Messenger构造函数,在客户端创建Messenger对象;在服务端,利用onBind方法返回一个IBinder对象,供客户端使用。
  3. 通过messenger发送消息:在发送端,当需要将消息发送给服务端时,创建一个Message对象,并设置其中的数据、目标Messenger等属性;调用目标Messenger的send()方法,将消息发送出去。
  4. 在服务端接收消息:在服务端,实现一个Handler对象,并重写其handleMessage()方法;这个方法会在服务端接收到消息时被调用,可以在该方法中处理收到的消息。
  5. 回复消息:在服务端接收到消息后,可以通过Message对象的replyTo属性获取到客户端的Messenger实例;服务端可以使用这个Messenger对象将消息回复给客户端。类似于客户端发送消息的方式。

给出示例的代码:

// 在Activity中创建Messenger对象,并将其作为参数传递给Service
Messenger messenger = new Messenger(new Handler() {
    @Override
    public void handleMessage(@NonNull Message msg) {
        // 处理从Service返回的消息
    }
});
Intent intent = new Intent(this, TimerService.class);
intent.putExtra("messenger", messenger);
startService(intent);

// 在Service中处理消息并回复
Messenger messenger = (Messenger) getIntent().getParcelableExtra("messenger");
if (messenger != null) {
    messenger.send(Message.obtain(null, MSG_TIME_UPDATED, currentTime));
}

同时,给出基于服务端和客户端的示例代码:

// TODO:服务端创建Handler并关联一个新的Messenger对象
Handler serviceHandler = new Handler() {
    @Override
    public void handleMessage(Message message) {
        // 处理接收到的消息
        switch (message.what) {
            case 1:
                // 执行相应操作
                // 回复消息给客户端
                Messenger clientMessenger = message.replyTo;
                Message replyMessage = Message.obtain(null, 2);
                // 设置回复消息中的数据
                Bundle replyData = new Bundle();
                replyData.putString("key", "reply value");
                replyMessage.setData(replyData);
                try {
                    clientMessenger.send(replyMessage);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
            // 处理其他消息...
        }
    }
};
Messenger serviceMessenger = new Messenger(serviceHandler);

// 在onBind()方法中返回服务端的Messenger实例
IBinder onBind(Intent intent) {
    return serviceMessenger.getBinder();
}
// 客户端创建Handler并关联一个新的Messenger对象
Handler clientHandler = new Handler() {
    @Override
    public void handleMessage(Message message) {
        // 处理接收到的消息
        switch (message.what) {
            case 1:
                // 执行相应操作
                break;
            // 处理其他消息...
        }
    }
};
Messenger clientMessenger = new Messenger(clientHandler);

// 将客户端与服务端绑定
bindService(intent, serviceConnection, BIND_AUTO_CREATE);

// 客户端发送消息给服务端
if (serviceMessenger != null) {
    Message message = Message.obtain(null, 1);
    // 设置消息中的数据
    Bundle data = new Bundle();
    data.putString("key", "value");
    message.setData(data);
    // 设置消息中的回复Messenger
    message.replyTo = clientMessenger;
    try {
        serviceMessenger.send(message);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

第三种:广播通信

直接给出如下伪代码实现:

// 在Activity中发送广播
Intent intent = new Intent("com.example.timer.broadcast");
intent.putExtra("current_time", currentTime);
sendBroadcast(intent);

// 在Service中注册广播接收器,在接收到广播时处理数据
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        long currentTime = intent.getLongExtra("current_time", 0);
        // 处理接收到的数据
    }
};

@Override
public void onCreate() {
    super.onCreate();
    registerReceiver(receiver, new IntentFilter("com.example.timer.broadcast"));
}

第四种:共享数据源(例如数据库)

// 在Activity中写入数据
// 创建一个ContentValues对象,用于存储要写入的数据。
ContentValues values = new ContentValues();
// 使用put()方法将数据以键值对的形式存储到ContentValues对象中,其中"time"是键,currentTime是值。
values.put("time", currentTime);
// 传入相应的URI和ContentValues对象,将数据插入到指定的内容提供者(content provider)中。
getContentResolver().insert(Uri.parse("content://com.example.timerprovider/timer"), values);

// 在Service中读取数据
Cursor cursor = getContentResolver().query(Uri.parse("content://com.example.timerprovider/timer"),
                null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
    long currentTime = cursor.getLong(cursor.getColumnIndex("time"));
    // 处理读取到的数据
    cursor.close();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发Android系统有两种运行Service的方式: 1. startService()方法:使用startService()方法启动Service时,Service会在后台运行,即使Activity已经被销毁或应用程序已经被杀死,Service仍将继续运行。当我们使用startService()方法启动Service时,Service的生命周期方法会依次被调用,包括onCreate()、onStartCommand()和onDestroy()等方法。此外,使用startService()方法启动Service时,我们还可以向Service传递参数,以便Service在运行时根据参数执行不同的操作。 2. bindService()方法:使用bindService()方法绑定Service时,Activity可以与Service建立连接,并与Service进行通信。当ActivityService建立连接时,Service的onBind()方法会被调用,我们可以在onBind()方法返回一个IBinder对象,以便Activity可以使用该对象与Service进行通信。与startService()方法不同,使用bindService()方法绑定Service时,Service会与Activity绑定在一起,并在Activity销毁时被销毁。当ActivityService之间的连接被断开时,Service的onUnbind()和onDestroy()方法会被调用。 需要注意的是,使用startService()方法启动的Service可以在后台长时间运行,并且可以执行一些独立于应用程序的操作,例如下载文件或与服务器通信。而使用bindService()方法绑定的Service通常用于向Activity提供一些服务,例如音乐播放器或定时器。在实际开发,我们可以根据具体的需求选择使用哪种方式来运行Service

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值