Android IPC通信方式及其实现

一、Bundle

Bundle是Android系统中最基础的IPC通信方式,可以在Activity之间传递数据。可以向Bundle中存放各种基本数据类型,如字符串、整型、布尔值等,也可以存放复杂的Parcelable对象。

示例代码如下:

“`
//Activity1将数据存入Bundle并启动Activity2
Bundle bundle = new Bundle();
bundle.putInt(“intData”, 1);
bundle.putString(“stringData”, “hello”);
MyParcelableObject parcelableObject = new MyParcelableObject();
bundle.putParcelable(“parcelableData”, parcelableObject);
Intent intent = new Intent(this, Activity2.class);
intent.putExtras(bundle);
startActivity(intent);

//Activity2从Intent中获取数据
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
int intData = bundle.getInt(“intData”);
String stringData = bundle.getString(“stringData”);
MyParcelableObject parcelableObject = bundle.getParcelable(“parcelableData”);
“`

二、AIDL

AIDL全名为Android Interface Definition Language,是Android系统中远程服务通信的一种方式,支持进程间的方法调用。通过AIDL,我们可以定义接口,并用一个服务向外提供这个接口,其他进程通过绑定服务可以获取到该接口的代理对象,进而进行方法调用。

示例代码如下:

MyInterface.aidl文件定义

“`
interface MyInterface {
void sendData(in String data);
String getData();
}
“`

MyInterfaceImpl.java实现

“`
public class MyInterfaceImpl extends MyInterface.Stub {
private String mData;

@Override
public void sendData(String data) {
mData = data;
}

@Override
public String getData() {
return mData;
}
}
“`

MyService.java服务定义

“`
public class MyService extends Service {
private MyInterfaceImpl mBinder = new MyInterfaceImpl();

@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
“`

Activity中调用远程接口

“`
private MyInterface mInterface;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mInterface = MyInterface.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
mInterface = null;
}
};

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE);
}

private void sendDataToRemoteService(String data) {
try {
mInterface.sendData(data);
} catch (RemoteException e) {
e.printStackTrace();
}
}

private String getDataFromRemoteService() {
try {
return mInterface.getData();
} catch (RemoteException e) {
e.printStackTrace();
}
return null;
}
“`

三、Messenger

Messenger是AIDL的一种简化版,它是Google提供的一种轻量级IPC方式,通过Handler实现进程间的通讯。Messenger是基于AIDL实现的,但对于进程间传输数据,只能使用Bundle类型。

示例代码如下:

MyService.java定义Messenger

“`
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SEND_DATA:
Bundle bundle = msg.getData();
String data = bundle.getString(“data”);
mData = data;
Messenger clientMessenger = msg.replyTo;
Message replyMsg = Message.obtain(null, MSG_REPLY_DATA);
replyMsg.getData().putString(“reply_data”, “reply ” + mData);
try {
clientMessenger.send(replyMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
super.handleMessage(msg);
}
}
}
private Messenger mMessenger = new Messenger(new MyHandler());
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
“`

Activity中与远程进程通讯

“`
private Messenger mMessenger;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MyService.class);
Messenger messenger = new Messenger(new MyHandler());
intent.putExtra(“messenger”, messenger);
bindService(intent, mConnection, BIND_AUTO_CREATE);
}

private void sendDataToRemoteService(String data) {
Message msg = Message.obtain(null, MSG_SEND_DATA);
Bundle bundle = new Bundle();
bundle.putString(“data”, data);
msg.setData(bundle);
msg.replyTo = mMessenger;
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}

private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REPLY_DATA:
String replyData = msg.getData().getString(“reply_data”);
break;
default:
super.handleMessage(msg);
}
}
};

private Messenger mClientMessenger = new Messenger(mHandler);

private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMessenger = new Messenger(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
mMessenger = null;
}
};
“`

四、ContentProvider

ContentProvider是Android系统中数据共享的一种方式,由一个进程提供数据,其他进程通过URI访问数据。可以用它在不同应用程序之间共享数据,而且还可以保证数据的完整性和安全性。

示例代码如下:

MyContentProvider.java

“`
public class MyContentProvider extends ContentProvider {
private MyDatabaseHelper mDbHelper;
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sUriMatcher.addURI(“com.example”, “table1”, 1);
sUriMatcher.addURI(“com.example”, “table1/#”, 2);
}
@Override
public boolean onCreate() {
mDbHelper = new MyDatabaseHelper(getContext());
return true;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mDbHelper.getReadableDatabase();
Cursor cursor;
switch (sUriMatcher.match(uri)) {
case 1:
cursor = db.query(“table1”, projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2:
String id = uri.getPathSegments().get(1);
cursor = db.query(“table1”, projection, “_id = ?”, new String[]{id}, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException(“Unknown URI: ” + uri);
}
return cursor;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
long rowId = db.insert(“table1”, null, values);
if (rowId > 0) {
Uri insertUri = ContentUris.withAppendedId(uri, rowId);
getContext().getContentResolver().notifyChange(insertUri, null);
return insertUri;
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case 1:
count = db.delete(“table1”, selection, selectionArgs);
break;
case 2:
String id = uri.getPathSegments().get(1);
count = db.delete(“table1”, “_id = ?”, new String[]{id});
break;
default:
throw new IllegalArgumentException(“Unknown URI: ” + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
int count;
switch (sUriMatcher.match(uri)) {
case 1:
count = db.update(“table1”, values, selection, selectionArgs);
break;
case 2:
String id = uri.getPathSegments().get(1);
count = db.update(“table1”, values, “_id = ?”, new String[]{id});
break;
default:
throw new IllegalArgumentException(“Unknown URI: ” + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
“`

Activity中访问数据

“`
private void accessData() {
Uri uri = Uri.parse(“content://com.example/table1”);
String[] projection = {“_id”, “name”, “description”};
Cursor cursor = getContentResolver().query(uri, projection, null, null,null);
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
String description = cursor.getString(2);
}
cursor.close();
}
“`

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/195540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-02 20:35
下一篇 2024-12-02 20:35

相关推荐

  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Python在线编辑器的优势与实现方式

    Python在线编辑器是Python语言爱好者的重要工具之一,它可以让用户方便快捷的在线编码、调试和分享代码,无需在本地安装Python环境。本文将从多个方面对Python在线编辑…

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • Java表单提交方式

    Java表单提交有两种方式,分别是get和post。下面我们将从以下几个方面详细阐述这两种方式。 一、get方式 1、什么是get方式 在get方式下,表单的数据会以查询字符串的形…

    编程 2025-04-27
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Java多版本支持实现方式

    本文将从以下几个方面阐述如何实现Java多版本支持,并给出可行的代码示例。 一、多版本Java环境概述 Java是一门跨平台的编程语言,但是在不同的应用场景下,可能需要使用不同版本…

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27

发表回复

登录后才能评论