安卓开发中,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 Activity显示Service数据,您需要使用绑定服务(Bound Service)或者广播(Broadcast)的方式将数据传递给Activity。 使用绑定服务: 1.在Service创建一个Binder类,该类提供公共方法来返回要显示的数据。 2.在Activity创建一个ServiceConnection对象,并在onServiceConnected方法绑定服务。 3.在ServiceConnection对象的回调方法获取Binder对象,并使用它来调用公共方法来获取要显示的数据。 4.使用获取的数据更新Activity UI。 示例代码: 在Service创建Binder类: ``` public class MyBinder extends Binder { public String getData() { return "Hello from Service!"; } } ``` 在Service返回Binder对象: ``` private final IBinder mBinder = new MyBinder(); @Override public IBinder onBind(Intent intent) { return mBinder; } ``` 在Activity绑定服务: ``` private MyService mService; private boolean mBound = false; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { MyBinder binder = (MyBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; @Override protected void onStart() { super.onStart(); Intent intent = new Intent(this, MyService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if (mBound) { unbindService(mConnection); mBound = false; } } ``` 在Activity获取数据并更新UI: ``` if (mBound) { String data = mService.getData(); TextView textView = findViewById(R.id.textView); textView.setText(data); } ``` 使用广播: 1.在Service创建一个BroadcastReceiver,该接收器用于接收要显示的数据。 2.在Service发送广播并传递数据。 3.在Activity创建一个BroadcastReceiver,该接收器用于接收广播。 4.在BroadcastReceiver的回调方法获取数据并使用它来更新Activity UI。 示例代码: 在Service发送广播: ``` Intent intent = new Intent("com.example.myapp.DATA_READY"); intent.putExtra("data", "Hello from Service!"); sendBroadcast(intent); ``` 在Activity注册BroadcastReceiver: ``` private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); TextView textView = findViewById(R.id.textView); textView.setText(data); } }; @Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter("com.example.myapp.DATA_READY"); registerReceiver(mReceiver, filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(mReceiver); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值