Android基础——Service IPC通讯(Messenger实现)

本文介绍如何使用 Messenger 在 Android 应用的不同进程中实现 IPC (进程间通信)。客户端和服务端通过 Messenger 发送消息,利用 Handler 形式处理,确保线程安全。文章详细展示了 ClientActivity 和 Service 的代码实现。

Messager实现IPC通信,底层也是使用了AIDL方式。和AIDL方式不同的是,Messager方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的,支持并发处理,因此,我们使用AIDL方式时需要保证代码的线程安全。大部分情况下,我们应用中不需要并发处理。因此,我们通常只需要使用Messager方式。

在我们的例子中:ClientActivity和Service分数不同的进程,我们在Client绑定Service的时候可以获得Service端的Messenger,在Client端通过Messenger发送消息到Service端,将消息交给handler 去处理,同样Service端也可以通过Client端的Messenger进行同样的操作。

为了让Service运行在其他的进程,我们需要在Manifest.xml中做一些设置:

<service
            android:name="com.flyingduck.servicedemo2.MessengerService"
            android:process=":remote" >
        </service>
android:name=“:remote”写法是任意的,可以写成其他的字符串,但是必须要加上‘:’的前缀。

客户端进程:

package com.flyingduck.servicedemo2;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class ClientActivity extends Activity {

	private TextView showTxt;
	private Button sendMsg;
	private Button boundBtn;
	private Button unboundBtn;

	private ServiceConnection conn;

	private final Messenger mMessenger = new Messenger(new IncomingHandler());

	/** 服务端的Messenger **/
	private Messenger serviceMessenger;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_client);
		showTxt = (TextView) findViewById(R.id.show_message);
		sendMsg = (Button) findViewById(R.id.send_set_value_message);
		boundBtn = (Button) findViewById(R.id.bound_service);
		unboundBtn = (Button) findViewById(R.id.unbound_service);

		boundBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				doInBindService();
			}
		});
		unboundBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				doInUnBindService();
			}
		});
		sendMsg.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				showTxt.setText("send set_value_message");
				if (serviceMessenger != null) {
					try {
						// 发送一个100 值到service
						Message msg = Message.obtain(null,
								MessengerService.MSG_SET_VALUE, 100, 0);
						msg.replyTo = mMessenger;
						serviceMessenger.send(msg);
					} catch (RemoteException e) {
						e.printStackTrace();
					}
				}
			}
		});

		conn = new ServiceConnection() {

			@Override
			public void onServiceDisconnected(ComponentName name) {
				showTxt.setText("disconnectes");
			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				serviceMessenger = new Messenger(service);
				showTxt.setText("connectes");
				try {
					Message msg = Message.obtain(null,
							MessengerService.MSG_REGISTER_CLIENT);
					msg.replyTo = mMessenger;
					serviceMessenger.send(msg);
				} catch (RemoteException e) {
					e.printStackTrace();
				}
			}
		};

	}

	private void doInBindService() {
		showTxt.setText("bind");
		bindService(new Intent(this, MessengerService.class), conn,
				Service.BIND_AUTO_CREATE);
	}

	private void doInUnBindService() {
		showTxt.setText("unbind");
		unbindService(conn);

		if (serviceMessenger != null) {
			try {
				Message msg = Message.obtain(null,
						MessengerService.MSG_UNREGISTER_CLIENT);
				msg.replyTo = mMessenger;
				serviceMessenger.send(msg);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
	}

	/** 用于处理服务发过来的消息 **/
	class IncomingHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MessengerService.MSG_SET_VALUE:
				showTxt.setText("received from service:" + msg.arg1);
				break;
			default:
				super.handleMessage(msg);
			}
		}
	}

}



Service端:

package com.flyingduck.servicedemo2;

import java.util.ArrayList;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.widget.Toast;

public class MessengerService extends Service {

	private NotificationManager notifyM;
	/** 用于记录所有绑定service的客户端 这里只有一个client绑定这个service**/
	ArrayList<Messenger> clients = new ArrayList<Messenger>();

	private final Messenger mMessenger = new Messenger(new IncomingHandler());

	/** 定义几种Handler的消息类型 **/
	static final int MSG_REGISTER_CLIENT = 1;
	static final int MSG_UNREGISTER_CLIENT = 2;
	static final int MSG_SET_VALUE = 3;

	/** 用于发送消息时使用 **/
	private int value = 100;

	/** 用于处理客户端发过来的消息 **/
	class IncomingHandler extends Handler {

		@Override
		public void handleMessage(Message msg) {

			switch (msg.what) {
			case MSG_REGISTER_CLIENT:
				clients.add(msg.replyTo);
				break;
			case MSG_UNREGISTER_CLIENT:
				clients.remove(msg.replyTo);
				break;
			case MSG_SET_VALUE:
				for (int index = clients.size() - 1; index >= 0; index--) {
					try {
						//接收到ClientActivity发送过来的值“100”,再加上value ,发送给ActivityClient
						clients.get(index).send(
								Message.obtain(null, MSG_SET_VALUE, value+msg.arg1, 0));
					} catch (RemoteException e) {
						clients.remove(index);
					}

				}
				break;
			default:
				super.handleMessage(msg);
				break;
			}
		}
	}

	@Override
	public void onCreate() {
		notifyM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
		showNotification();
	}

	@Override
	public IBinder onBind(Intent intent) {
		return mMessenger.getBinder();
	}

	private void onDestor() {
		notifyM.cancel(100);
		Toast.makeText(this, "service distory", Toast.LENGTH_SHORT).show();
	}

	private void showNotification() {
		Notification notification = new Notification(R.drawable.ic_launcher,
				"Service start...", System.currentTimeMillis());
		notification.setLatestEventInfo(this, "content-title",
				"service started", null);
		notifyM.notify(100, notification);
	}

}


client 发送了一个100整数给service端,service将 其加上100发送给client端显示。

运行截图:



内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值