当前位置:首页 » 安卓系统 » android进程间的通信

android进程间的通信

发布时间: 2022-05-23 19:43:52

1. android 进程间的通信(IPC)方式有哪些

Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信!组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Service,不论这个Activity或Service是属于当前应用还是其它应用的。
一、Intent包含两部分:
1、目的[action]--要往哪里去
2、内容[category、data]--路上带了些什么,区分性数据或内容性数据
二、Intent类型:
1、显式--直接指定消息目的地,只适合同一进程内的不同组件之间通信
new Intent(this,Target.class)
2、隐式--AndroidMainifest.xml中注册,一般用于跨进程通信
new Intent(String action)

IPC机制:有了Intent这种基于消息的进程内或进程间通信模型,我们就可以通过Intent去开启一个Service,可以通过Intent跳转到另一个Activity,不论上面的Service或Activity是在当前进程还是其它进程内即不论是当前应用还是其它应用的Service或Activity,通过消息机制都可以进行通信!

2. android进程间通信有几种方式

这里进程间通信有几种方式,它总有三种方式,这个可以进行。

3. android开发中跨进程通信有几种方式

  • 在android SDK中提供了4种用于跨进程通讯的方式,Activity、Content Provider、Broadcast和Service。

  • 介绍

  1. Activity可以跨进程调用其他应用程序;

  2. Content Provider可以跨进程访问其他应用程序中的数据;

  3. Broadcast可以向android系统中所有应用程序发送广播;

  4. Content Provider返回的是Cursor对象,而Service返回的是java对象,这种可以跨进程通讯的服务叫AIDL服务;

4. android线程间通信有哪些方式

进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
  线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
  区别:
  (1)、一个程序至少有一个进程,一个进程至少有一个线程;
  (2)、线程的划分尺度小于进程,使得多线程程序的并发性高;
  (3)、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
---------------------
一、Android进程间通信方式
1.Bundle
  由于Activity,Service,Receiver都是可以通过Intent来携带Bundle传输数据的,所以我们可以在一个进程中通过Intent将携带数据的Bundle发送到另一个进程的组件。
  缺点:无法传输Bundle不支持的数据类型。
2.ContentProvider
  ContentProvider是Android四大组件之一,以表格的方式来储存数据,提供给外界,即Content Provider可以跨进程访问其他应用程序中的数据。用法是继承ContentProvider,实现onCreate,query,update,insert,delete和getType方法,onCreate是负责创建时做一些初始化的工作,增删查改的方法就是对数据的查询和修改,getType是返回一个String,表示Uri请求的类型。注册完后就可以使用ContentResolver去请求指定的Uri。
3.文件
  两个进程可以到同一个文件去交换数据,我们不仅可以保存文本文件,还可以将对象持久化到文件,从另一个文件恢复。要注意的是,当并发读/写时可能会出现并发的问题。
4.Broadcast
  Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播。
5.AIDL方式
  Service和Content Provider类似,也可以访问其他应用程序中的数据,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。
6.Messenger
  Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
  双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
7.Socket
  Socket方法是通过网络来进行数据交换,注意的是要在子线程请求,不然会堵塞主线程。客户端和服务端建立连接之后即可不断传输数据,比较适合实时的数据传输
二、Android线程间通信方式
  一般说线程间通信主要是指主线程(也叫UI线程)和子线程之间的通信,主要有以下两种方式:
1.AsyncTask机制
  AsyncTask,异步任务,也就是说在UI线程运行的时候,可以在后台的执行一些异步的操作;AsyncTask可以很容易且正确地使用UI线程,AsyncTask允许进行后台操作,并在不显示使用工作线程或Handler机制的情况下,将结果反馈给UI线程。但是AsyncTask只能用于短时间的操作(最多几秒就应该结束的操作),如果需要长时间运行在后台,就不适合使用AsyncTask了,只能去使用Java提供的其他API来实现。
2.Handler机制
  Handler,继承自Object类,用来发送和处理Message对象或Runnable对象;Handler在创建时会与当前所在的线程的Looper对象相关联(如果当前线程的Looper为空或不存在,则会抛出异常,此时需要在线程中主动调用Looper.prepare()来创建一个Looper对象)。使用Handler的主要作用就是在后面的过程中发送和处理Message对象和让其他的线程完成某一个动作(如在工作线程中通过Handler对象发送一个Message对象,让UI线程进行UI的更新,然后UI线程就会在MessageQueue中得到这个Message对象(取出Message对象是由其相关联的Looper对象完成的),并作出相应的响应)。
三、Android两个子线程之间通信
  面试的过程中,有些面试官可能会问Android子线程之间的通信方式,由于绝大部分程序员主要关注的是Android主线程和子线程之间的通信,所以这个问题很容易让人懵逼。
  主线程和子线程之间的通信可以通过主线程中的handler把子线程中的message发给主线程中的looper,或者,主线程中的handler通过post向looper中发送一个runnable。但looper默认存在于main线程中,子线程中没有Looper,该怎么办呢?其实原理很简单,把looper绑定到子线程中,并且创建一个handler。在另一个线程中通过这个handler发送消息,就可以实现子线程之间的通信了。
  子线程创建handler的两种方式:
  方式一:给子线程创建Looper对象:
new Thread(new Runnable() {
public void run() {
Looper.prepare(); // 给这个Thread创建Looper对象,一个Thead只有一个Looper对象
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
Looper.loop(); // 不断遍历MessageQueue中是否有消息
};
}).start();
---------------------
方式二:获取主线程的looper,或者说是UI线程的looper:
new Thread(new Runnable() {
public void run() {
Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
};
}).start();

5. Android 进程间通信的几种实现方式

Android 进程间通信的几种实现方式

主要有4种方式:

这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。

主要实现原理:

由于应用程序之间不能共享内存。为了在不同应用程序之间交互数据(跨进程通讯),AndroidSDK中提供了4种用于跨进程通讯的方式进行交互数据,实现进程间通信主要是使用sdk中提供的4组组件根据实际开发情况进行实现数据交互。

详细实现方式:

Acitivity实现方式

Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的 Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过 Intent构造方法的第2个参数指定)。 在android系统中有很多应用程序提供了可以跨进程访问的Activity,例如,下面的代码可以直接调用拨打电话的Activity。

IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);


Content Provider实现方式

Android应用程序可以使用文件或SqlLite数据库存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)

应用程序可以利用Content Provider完成下面的工作

1. 查询数据
2. 修改数据
3. 添加数据
4. 删除数据

Broadcast 广播实现方式

广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。


Service实现方式

常用的使用方式之一:利用AIDL Service实现跨进程通信

这是我个人比较推崇的方式,因为它相比Broadcast而言,虽然实现上稍微麻烦了一点,但是它的优势就是不会像广播那样在手机中的广播较多时会有明显的时延,甚至有广播发送不成功的情况出现。

注意普通的Service并不能实现跨进程操作,实际上普通的Service和它所在的应用处于同一个进程中,而且它也不会专门开一条新的线程,因此如果在普通的Service中实现在耗时的任务,需要新开线程。

要实现跨进程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨进程服务其实是采用C/S的架构,因而AIDL的目的就是实现通信接口。


总结

跨进程通讯这个方面service方式的通讯远远复杂于其他几种通讯方式,实际开发中Activity、Content Provider、Broadcast和Service。4种经常用到,学习过程中要对没种实现方式有一定的了解。

6. android进程间通讯方式有哪些

Android中实现不同应用进程间通讯,需要用到AIDL技术,以下为AIDL服务端和客户端实现步骤:

一、服务端:
1、在AndroidManifest.xml中定义的包路径下新建一个文件,扩展名为.aidl(如:IXxxService.aidl),系统会在gen中自动生成对应的.java文件(如:IXxxService.java)
2、在aidl文件中编写接口方法,语法同java区别不大。注意:方法参数支持java基本类型(int、long、boolean等)和(String、List、Map、CharSequence)
其它复杂类型需要自定义(实现Parcelable.Creator接口及其方法)。
3、在包路径新建一个继承 android.app.Service 的服务类,在该类中定义继承 IXxxService.Stub 抽象类的内部类并实现抽象方法,如:

[java] view plainprint?

public class XxxService extends Service {
public class XxxServiceImpl extends IXxxService.Stub {
//implements methods
...

}

@Override
public IBinder onBind(Intent intent) {
XxxServiceImpl impl = new XxxServiceImpl();
return impl; //必须返回 XxxServiceImpl 的实例
}
}

4、在AndroidManifest.xml中注册上面定义的服务

[java] view plainprint?

<!-- 注册服务 -->
<service android:name="包路径.XxxService" >
<intent-filter>
<!-- 指定调用AIDL服务的ID -->
<action android:name="包路径.IXxxService" />
</intent-filter>
</service>

二、客户端
1、将服务端中自动生成的IXxxService.java文件拷贝到客户端工程,注意:文件所在包路径必须和服务端完全一致。
2、服务可以封装成帮助类调用,也可以直接在Activity中调用,后者如:

[java] view plainprint?

// Activity 中声明服务接口变量
private IXxxService serviceInterface;

// Activity onCreate()方法中创建ServiceConnection对象,并初始化serviceInterface
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获得AIDL服务对象
serviceInterface = IXxxService.Stub.asInterface(service);
}

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

// 绑定服务,AIDL_SERVICE_ID 为 "一、服务端 4、" 中提到的“指定调用AIDL服务的ID”
bindService(new Intent(AIDL_SERVICE_ID), serviceConnection, Context.BIND_AUTO_CREATE);

注意:在Activity 的 onDestory 方法中调用解除绑定服务的方法:unbindService(serviceConnection);

3、在按钮点击等事件中就可以调用服务中定义的方法了,如:serviceInterface.xxxMethod();

注意:服务端 XxxService 不能定义为单例的,否则无法调用

7. 在android中进程间通信机制是怎样的

一般都是基于ARM处理器的吧 安卓的内核也是基于linux的吧。 网络实现依靠TCP/IP协议栈实现实行封包和解包以及连接的建立和控制,还涉及到你手机的硬件网卡等。 进程间通信方式一般采用的消息队列,共享内存,套接字,还有管道了。 多线程是由操作系统来管理每个线程的CPU时间和资源的分配。也是比较复杂的,涉及到线程间通信,线程同步等。 内存管理是由操作系统进行分段,分页。分配机制比较复杂的,涉及到碎片的减少,内存的回收等。 要想了解详细内容,可以看看Linux操作系统原理。或者google提供的相关文档。

8. android中eventbus能够实现进程间通信吗

不可以用于多进程。EventBus貌似就是订阅者模式,而在多进程中,对象是不一致的,需要通过binder才能进行多进程通信,在这方面EventBus不支持,自然就不支持多进程了。

9. 关于Android进程间通信

先来解释一下AIDL,这东西其实算是提供了一种自定义客户端和服务器之间RPC通信协议的通用方法,并由Android的编译器自动生成这个协议的接口实现程序,包括客户端的interface和服务器端的stub。
其实你的需求用AIDL和socket都可以实现,AIDL比socket强的一点就是,用它定义了协议之后,客户端和服务器程序直接把aidl文件拿过去就可以自动生成实现这个协议的部分框架代码,而不需要自己重头写,而如果你用socket来做这个,那么可能客户端和服务器端分别需要写一些代码来把函数调用和socket通信之间做转换,这不光带来工作量的增加,也增加了因为客户端和服务器端代码不匹配造成的bug风险。当然,反过来说,socket也有灵活的优势,比如你的客户端和服务器可以不光是Android程序,也可以是其他支持同一协议的比如linux程序。
然后说服务器程序的启动,其实不管用AIDL还是socket,跟服务器启动都是两码事,一般如果用service组件实现服务器,启动它是使用Context.startService方法,service组件自己提供了避免重复启动的机制,与AIDL和socket无关,service启动之后,如果是socket方式则由service程序开socket端口(但这个端口需要由其他方法通知客户端,因为想用的端口有可能被其他程序占用),如果是AIDL方式则什么都不用做了。
最后说绑定,所谓AIDL的绑定,只是说在一个客户端和一个服务器之间建立一个连接,类似于一个数据库的connection,或者一个socket,这个连接并不会独占服务器进程,服务器可以同时接受多个客户端的访问请求,所以在这一点上说用AIDL和用socket没有什么不同。
至于最后选择哪种实现由你自己分析决定,只是觉得如果是Android App的话,AIDL会简单一些。

10. Android中线程与线程,进程与进程之间如何通信

使用handler发送message,消息队列排队

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。

热点内容
服务器搭建题目 发布:2024-05-18 23:01:29 浏览:27
下载武装突袭后怎么进服务器 发布:2024-05-18 22:56:17 浏览:825
c语言字符串大写变小写 发布:2024-05-18 22:56:16 浏览:438
重启删除的文件夹 发布:2024-05-18 22:34:11 浏览:638
视频软件源码 发布:2024-05-18 22:22:24 浏览:429
安卓换苹果sim卡去哪里换 发布:2024-05-18 22:21:29 浏览:637
顺丰薪资默认密码是多少 发布:2024-05-18 22:15:04 浏览:791
浏览器打不开服务器通信怎么办 发布:2024-05-18 21:32:22 浏览:961
创建存储空间 发布:2024-05-18 21:20:57 浏览:122
sql日期和时间 发布:2024-05-18 21:16:19 浏览:143