CN105204951A - 一种安卓系统中Activity间通信的方法和装置 - Google Patents
一种安卓系统中Activity间通信的方法和装置 Download PDFInfo
- Publication number
- CN105204951A CN105204951A CN201510651070.8A CN201510651070A CN105204951A CN 105204951 A CN105204951 A CN 105204951A CN 201510651070 A CN201510651070 A CN 201510651070A CN 105204951 A CN105204951 A CN 105204951A
- Authority
- CN
- China
- Prior art keywords
- activity
- data
- target activity
- app
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供一种安卓系统中Activity间通信的方法和装置,其中方法包括:源Activity调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据;如果源Activity和目标Activity处于同一个APP中,则触发所述APP的应用主线程;如果源Activity和目标Activity处于不同的APP中,则ActivityThread组件将数据发送请求传递给系统进程ActivityManagerService组件,ActivityManagerService组件将数据发送给目标Activity所在App进程的应用主线程;应用主线程调用receiveDataFromActivity函数将数据发送给目标Activity。本发明能够在Activity处于同一APP或不同APP时,均实现有效和快捷的通信。
Description
技术领域
本发明涉及通信技术领域,尤其涉及一种安卓(Android)系统中Activity间通信的方法和装置。
背景技术
Android组件包括Activity,服务(Service),内容提供者(ContentProvider)和广播接收器(BroadcastReceiver)。Activity的所有操作都与用户密切相关,是一个负责与用户交互的组件。在一个Android应用中,一个Activity通常是一个单独的屏幕,其上显示控件或者监听并处理事件。
Android系统中,应用进程的主线程负责管理应用(APP)下所有打开的Activity相关状态,系统进程的ActivityManagerService组件负责整个系统中所有Activity的生命周期的管理和调度。
由于每个Activity之间保持着独立性,除了在打开新的Activity时,能够传递数据外,在整个Activity生命周期内,Activity之间无法进行有效的通信。其中,同一APP下的Activity之间,只能通过共享和监控数据存储来进行有限的通信,例如同一APP的Activity之间要进行数据交互,需要定义一个数据存储方式,目标Activity需要监控数据存储变化,当源Activity改变了数据存储内容后,目标Activity就可以被调用来读取新的数据存储内容,这样才能完成Activity之间的数据通信,不仅要定义数据存储方式,整个过程还需要系统进程介入,操作起来麻烦且效率低下;不同APP下的Activity之间,仅仅只能通过广播消息来进行通信,而广播消息本身是点对多的通信方式,并不适合Activity之间的点对点的通信方式,从而导致各个Activity之间无法形成有效的互动,功能开发上形成局限。
发明内容
有鉴于此,本发明提供了一种安卓系统中Activity间通信的方法和装置,能够在Activity处于同一APP或不同APP时,均实现有效和快捷的通信。
本发明提供了一种安卓系统中Activity间通信的方法,包括:源Activity调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据,其中sendDataToActivity函数用来向其他Activity发送数据;如果ActivityThread组件判断出源Activity和目标Activity处于同一个应用APP中,则触发所述APP的应用主线程;如果ActivityThread组件判断出源Activity和目标Activity处于不同的APP中,则ActivityThread组件将数据发送请求传递给系统进程ActivityManagerService组件,ActivityManagerService组件确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程;应用主线程调用receiveDataFromActivity函数将数据发送给目标Activity,其中receiveDataFromActivity函数用来从其他Activity接收数据。
进一步地,所述调用sendDataToActivity函数,具体为:调用sendDataToActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,将Intentdata从源Activity向目标Activity发送。
进一步地,所述方法还包括:从APP中ActivityClientRecord对应的哈希表获取所述APP中所有已经打开的Activity;从ActivityClientRecord对应的ActivityThead组件的ComponentNamemComponent获取Activity的包名和类名;ActivityThread组件调用sendDataToActivity函数,将源Activity所处APP中所有已经打开的Activity的包名和类名与目标Activity的包名和类名进行匹配;如果匹配成功,则源Activity和目标Activity处于同一个APP中;如果匹配不成功,则源Activity和目标Activity处于不同的APP中。
进一步地,所述ActivityManagerService组件确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程,具体为:ActivityThread组件通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程ActivityManagerService组件;Binder线程匹配所有APP中打开的Activity,App的ActivityRecord中的ComponentNamerealActivity标识了Activity的包名和类名,通过搜索mHistory,匹配目标Activity的包名和类名;确认目标Activity打开后,记录目标Activity的ActivityRecord,并将目标Activity对应的ActivityRecord添加到MSG_DATA_TO_ACTIVITY消息发送给ActivityManagerService服务线程;ActivityManagerService服务线程根据目标Activity对应的ActivityRecord,通过IApplicationThread远程Binder调用接口将数据发送给目标Activity所在App进程的应用主线程。
进一步地,所述应用主线程调用目标Activity的receiveDataFromActivity函数将数据发送给目标Activity,具体为:应用主线程通过目标Activity的包名和类名从ActivityThread的mActivities哈希表中匹配到目标Activity;应用主线程调用receiveDataFromActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,应用主线程将数据发送给目标Activity。
本发明还提供了一种用于安卓系统中Activity间通信的装置,包括:源Activity处理子模块,用于调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据,其中sendDataToActivity函数用来向其他Activity发送数据;ActivityThread组件处理模块,用于判断源Activity和目标Activity处于同一个应用APP,如果是,则触发所述APP的应用主线程;如果否,则将数据发送请求传递给系统进程ActivityManagerService组件;ActivityManagerService组件处理模块,用于确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程;应用主线程处理子模块,用于调用receiveDataFromActivity函数将数据发送给目标Activity,其中receiveDataFromActivity函数用来从其他Activity接收数据;目标Activity处理子模块,用于通过receiveDataFromActivity函数接收来自源Activity的数据。
进一步地,所述源Activity处理子模块调用sendDataToActivity函数,具体为:源Activity处理子模块调用sendDataToActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,将Intentdata从源Activity向目标Activity发送。
进一步地,所述ActivityThread组件处理模块,还用于:从APP中ActivityClientRecord对应的哈希表获取所述APP中所有已经打开的Activity;从ActivityClientRecord对应的ActivityThead组件的ComponentNamemComponent获取Activity的包名和类名;ActivityThread组件调用sendDataToActivity函数,将源Activity所处APP中所有已经打开的Activity的包名和类名与目标Activity的包名和类名进行匹配;如果匹配成功,则源Activity和目标Activity处于同一个APP中;如果匹配不成功,则源Activity和目标Activity处于不同的APP中。
进一步地,所述ActivityManagerService组件处理模块确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程,具体为:ActivityThread组件处理模块通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程ActivityManagerService组件;Binder线程匹配所有APP中打开的Activity,App的ActivityRecord中的ComponentNamerealActivity标识了Activity的包名和类名,通过搜索mHistory,匹配目标Activity的包名和类名;确认目标Activity打开后,记录目标Activity的ActivityRecord,并将目标Activity对应的ActivityRecord添加到MSG_DATA_TO_ACTIVITY消息发送给ActivityManagerService服务线程;ActivityManagerService服务线程根据目标Activity对应的ActivityRecord,通过IApplicationThread远程Binder调用接口将数据发送给目标Activity所在App进程的应用主线程。
进一步地,所述应用主线程处理子模块调用目标Activity的receiveDataFromActivity函数将数据发送给目标Activity,具体为:应用主线程处理子模块通过目标Activity的包名和类名从ActivityThread的mActivities哈希表中匹配到目标Activity;调用receiveDataFromActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,将数据发送给目标Activity。
和现有技术相比,本发明的有益效果在于:本发明的Activity之间的通信机制,在Activity运行期间,能够向任何指定的目标Activity发送数据,不论源Activity和目标Activity是否处于同一APP中,均可以实现有效和快捷的通信。
附图说明
图1为本发明所公开的安卓系统中Activity间通信的方法的流程示意图。
图2为本发明所公开的安卓系统中Activity间通信的方法的详细流程示意图。
图3为本发明所公开的ActivityThread中sendDataToActivity处理流程示意图。
图4为本发明所公开的用于安卓系统中Activity间通信的装置的结构示意图。
具体实施方式
以下将结合附图所示的具体实施方式对本发明进行详细描述,但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所做出的结构、方法、或功能上的变换均包含在本发明的保护范围内。
在本发明中,Android系统可以同时打开多个APP,每个APP可以打开多个Activity。Activity之间发送数据时,源Activity和目标Activity可能处于同一APP中,也可能处于不同的APP中。对于处于同一APP中的两个Activity,能够直接通过应用主线程来完成数据的传递;对于不同APP中的Activity,由于分处于不同的进程,需要通过系统进程的ActivityManagerService来进行数据传递。
图1为本发明所公开的安卓系统中Activity间通信的方法的流程示意图。参照图1,包括:
步骤101,预先在Activity中定义接口函数sendDataToActivity和receiveDataFromActivity;
在本步骤中,sendDataToActivity函数用来发送数据到其他Activity中;receiveDataFromActivity函数用来接收其他Activity发送过来的数据并进行处理。
步骤102,源Activity调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据。
在本步骤中,sendDataToActivity接口函数被调用后,进入ActivityThread组件,ActivityThread组件是应用的主线程结构,负责与系统进程中的ActivityManagerService组件进行交互,管理和调度Activity/Service/Broadcast等操作。
步骤103,ActivityThread组件判断源Activity和目标Activity是否处于同一个APP中,如果处于不同的APP中,进行步骤104;如果处于同一个APP中,进行步骤105。
在本步骤中,ActivityThread组件根据目标Activity的包名和类名来匹配源Activity所在APP中所有已经打开的Activity列表,以确定源Activity和目标Activity是否处于同一个APP。
步骤104,通过系统进程ActivityManagerService组件将数据发送给目标Activity所在的APP进程,然后进行步骤105。
在本步骤中,通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程进行处理,IActivityManager对应的Binder线程收到该请求后,根据目标Activity的包名和类名匹配整个系统中所有已经打开的Activity,如果目标Activity已经打开,则记录目标Activity对应的信息,然后发送消息给ActivityManagerService服务线程,ActivityManagerService服务线程根据目标Activity相关信息,通过IApplicationThread远程调用接口将数据发送给目标Activity所在的APP进程,IApplicationThread接口对应的Binder线程直接发送消息到应用主线程。
步骤105,应用主线程调用receiveDataFromActivity函数将数据发送给目标Activity。
在本步骤中,如果源Activity和目标Activity处于同一个APP中,ActivityThread组件直接发送消息MSG_DATA_FROM_ACTIVITY给应用主线程,应用主线程收到消息后,调用目标Activity的receiveDataFromActivity进行Activity间的数据传递。
如果源Activity和目标Activity处于不同的APP中,ActivityManagerService服务线程通过IApplicationThread接口向应用主线程发送消息,应用主线程收到消息后,调用目标Activity的receiveDataFromActivity进行Activity间的数据传递。
图2为本发明所公开的安卓系统中Activity间通信的方法的详细流程示意图。如图2所示,包括:
步骤201,源Activity调用sendDataToActivity函数发送数据到目标Activity中。
当Activity需要发送数据到其他Activity时,通过Intent数据结构组织好需要发送的数据后,需要调用Activity中的sendDataToActivity接口函数,具体定义如下:
publicbooleansendDataToActivity(Intentdata,StringtargetName);
其中,Intentdata是需要发送的数据,StringtargetName是目标Activity的包名加类名。接口采用标准的Android数据接口,返回值为boolean类型,false标识目标Activity不存在,无法发送数据,true标识目标Activity已经打开,数据发送成功。
由于Activity中有一个成员ComponentNamemComponent,该成员中有Activity所在的包名以及Activity对应的包名和类名,所以sendDataToActivity能够直接获取源Activity的名称,获取源Activity的名称后调用sendDataToActivity函数,具体定义如下:
publicbooleansendDataToActivity(Intentdata,StringsourceName,
StringtargetName);
其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名加类名,StringtargetName是目标Activity的包名加类名。
步骤202,通过匹配源Activity所处APP中所有已经打开的Activity来判断源Activity和目标Activity是否处于同一个APP中。
ActivityThread组件中的sendDataToActivity函数负责确定目标Activity和源Activity是否处于同一个APP中。ActivityThread组件定义了IBinder与ActivityClientRecord对应的哈希表:
finalHashMap<IBinder,ActivityClientRecord>mActivities
=newHashMap<IBinder,ActivityClientRecord>();
每个APP都有ActivityThead组件,以及IBinder与ActivityClientRecord对应的哈希表,记录了APP中所有已经打开的Activity;ActivityClientRecord结构中有对应的ActivityThead组件,通过ActivityThead组件中的成员ComponentNamemComponent,就可以获得对应Activity的包名和类名,这样就可以和目标Activity的包名和类名进行匹配。
ActivityThread中sendDataToActivity处理流程如图3所示,sendDataToActivity函数遍历ActivityThread实体的mActivities列表,判断目标Activity是否处于mActivities列表。如果匹配成功,则源Activity和目标Activity处于同一个APP中,发送消息给应用主线程进行处理;如果否,匹配不成功,则源Activity和目标Activity处于不同的APP中,获取IActivityManager远程Binder接口,调用系统进程的sendDataToActivity进行处理。
步骤203,如果源Activity和目标Activity处于同一个APP中,发送MSG_DATA_FROM_ACTIVITY消息给应用主线程,然后进行步骤207。
如果源Activity和目标Activity处于同一个APP中,就不需要经过系统进程的调度,直接发送消息MSG_DATA_FROM_ACTIVITY给应用主线程。
步骤204,如果源Activity和目标Activity处于不同的APP中,通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程ActivityManagerService组件进行处理。
当源Activity与目标Activity处于不同的应用中时,这就需要通过系统进程的ActivityManagerService组件来完成处理,应用到ActivityManagerService之间通过IActivityManager远程调用接口来通信,需要在IActivityManager中定义新的接口:
publicbooleansendDataToActivity(Intentdata,StringsourceName,
StringtargetName)throwsRemoteException;
参数和返回值与sendDataToActivity相同,具体实现如下:
将参数打包成Parcel结构,然后通过远程调用到系统进程中对应Binder线程对该接口的功能实现,定义在ActivityManagerService组件中,由IActivityManager对应的Binder线程调用,具体如下:
publicbooleansendDataToActivity(Intentdata,StringsourceName,
StringtargetName)。
步骤205,Binder线程匹配系统中所有打开的Activity,如果确定目标Activity打开,则发送消息MSG_SEND_TO_ACTIVITY到ActivityManagerService服务线程。
与ActivtyThread不同的是,ActivityThread仅仅只管理对应APP下的Activity,而ActivityManagerService组件管理和调度所有已经打开的Activity,即不管Activity属于哪个APP,均要在ActivityManagerService中管理和调度。ActivityManagerService定义了所有打开Activity的列表:
finalArrayList<ActivityRecord>mHistory=newArrayList<ActivityRecord>();
ActivityRecord组件中的成员ComponentNamerealActivity标识了Activity对应的包名和类名,通过搜索mHistory,匹配目标Activity的包名和类名,就可以确定目标Activity是否已经打开,如果目标Activity没有打开,sendDataToActivity函数会直接返回false,如果目标Activity存在与mHistory列表中,则记录目标Activity对应的ActivityRecord,然后发送MSG_DATA_TO_ACTIVITY消息给ActivityManagerService服务线程进行处理,sendDataToActivity函数会返回true。IActivityManager对应的Binder线程调用结束,进入ActivityManagerService服务线程。
步骤206,ActivityManagerService服务线程获取目标Activity的调用接口,通过IApplicationThread远程接口将数据传递到目标Activity所在的应用进程中。
ActivityManagerService服务线程收到MSG_DATA_TO_ACTIVITY消息后,根据记录的目标Activity对应的ActivityRecord,通过IApplicationThread远程调用接口中新定义的函数receiveDataFromActivity将数据发送给对应的应用,接口函数receiveDataFromActivity定义如下:
该接口函数将参数打包后,发送给IApplicationThread接口对应的Binder线程进行处理。目标Activity所在的应用进程中的Binder线程收到该请求后,直接发送消息MSG_DATA_FROM_ACTIVITY给应用主线程,然后Binder线程返回。
步骤207,应用主线程调用目标Activity的receiveDataFromActivit函数将数据发送给目标Activity处理。
应用主线程收到该消息后,通过目标Activity的包名和类名从ActivityThread定义的mActivities哈希表中匹配到对应的Activity实体,然后调用对应Activity的receiveDataFromActivity函数来完成数据的接收和处理。Activity的receiveDataFromActivity函数定义如下:
publicvoidreceiveDataFromActivity(Intentdata,StringsourceName);
具体实现由每个Activity自身根据实际需要处理的数据来进行实现。
步骤208,目标Activity通过receiveDataFromActivity函数完成数据接收和处理。
本发明还提供了一种用于安卓系统中Activity间通信的装置,如图4所示,包括:
Activity组件处理模块41,包括源Activity处理子模块411和目标Activity处理子模块412,其中,源Activity处理子模块,用于调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据,其中sendDataToActivity函数用来向其他Activity发送数据;
ActivityThread组件处理模块42,包括判断子模块421、发送子模块422和应用主线程处理子模块423,其中,判断子模块用于判断源Activity和目标Activity处于同一个应用APP,如果是,则发送子模块422发送消息触发所述APP的应用主线程;如果否,则将数据发送请求传递给系统进程ActivityManagerService组件;
ActivityManagerService组件处理模块43,包括Binder线程处理子模块431和ActivityManagerService服务线程处理子模块432,其中,Binder线程处理子模块用于匹配所有打开的Activity,如果目标Activity没有打开,则直接返回,否则发送消息MSG_SEND_TO_ACTIVITY到ActivityManagerService服务线程子模块进行处理;ActivityManagerService服务线程处理子模块用于获取目标Activity的调用接口,通过IApplicationThread远程接口将数据传递到目标Activity所在的应用进程中;
应用主线程处理子模块423,用于调用receiveDataFromActivity函数将数据发送给目标Activity,其中receiveDataFromActivity函数用来从其他Activity接收数据;
目标Activity处理子模块412,用于通过receiveDataFromActivity函数接收来自源Activity的数据。
本发明的用于安卓系统中Activity间通信的装置中的具体技术细节和安卓系统中Activity间通信的方法类似,故在此不赘述。
本发明的Activity之间的通信机制,在Activity运行期间,能够向任何指定的目标Activity发送数据,不论源Activity和目标Activity是否处于同一APP中,均可以实现有效和快捷的通信。
虽然本发明已以较佳实施例披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。
Claims (10)
1.一种安卓系统中Activity间通信的方法,其特征在于,包括:
源Activity调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据,其中sendDataToActivity函数用来向其他Activity发送数据;
如果ActivityThread组件判断出源Activity和目标Activity处于同一个应用APP中,则触发所述APP的应用主线程;
如果ActivityThread组件判断出源Activity和目标Activity处于不同的APP中,则ActivityThread组件将数据发送请求传递给系统进程ActivityManagerService组件,ActivityManagerService组件确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程;
应用主线程调用receiveDataFromActivity函数将数据发送给目标Activity,其中receiveDataFromActivity函数用来从其他Activity接收数据。
2.如权利要求1所述的安卓系统中Activity间通信的方法,其特征在于,所述调用sendDataToActivity函数,具体为:
调用sendDataToActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;
根据Intentdata,StringsourceName和StringtargetName,将Intentdata从源Activity向目标Activity发送。
3.如权利要求2所述的安卓系统中Activity间通信的方法,其特征在于,所述方法还包括:
从APP中ActivityClientRecord对应的哈希表获取所述APP中所有已经打开的Activity;
从ActivityClientRecord对应的ActivityThead组件的ComponentNamemComponent获取Activity的包名和类名;
ActivityThread组件调用sendDataToActivity函数,将源Activity所处APP中所有已经打开的Activity的包名和类名与目标Activity的包名和类名进行匹配;如果匹配成功,则源Activity和目标Activity处于同一个APP中;如果匹配不成功,则源Activity和目标Activity处于不同的APP中。
4.如权利要求3所述的安卓系统中Activity间通信的方法,其特征在于,所述ActivityManagerService组件确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程,具体为:
ActivityThread组件通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程ActivityManagerService组件;
Binder线程匹配所有APP中打开的Activity,App的ActivityRecord中的ComponentNamerealActivity标识了Activity的包名和类名,通过搜索mHistory,匹配目标Activity的包名和类名;
确认目标Activity打开后,记录目标Activity的ActivityRecord,并将目标Activity对应的ActivityRecord添加到MSG_DATA_TO_ACTIVITY消息发送给ActivityManagerService服务线程;
ActivityManagerService服务线程根据目标Activity对应的ActivityRecord,通过IApplicationThread远程Binder调用接口将数据发送给目标Activity所在App进程的应用主线程。
5.如权利要求4所述的安卓系统中Activity间通信的方法,其特征在于,所述应用主线程调用目标Activity的receiveDataFromActivity函数将数据发送给目标Activity,具体为:
应用主线程通过目标Activity的包名和类名从ActivityThread的mActivities哈希表中匹配到目标Activity;
应用主线程调用receiveDataFromActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;
根据Intentdata,StringsourceName和StringtargetName,应用主线程将数据发送给目标Activity。
6.一种用于安卓系统中Activity间通信的装置,其特征在于,包括:
源Activity处理子模块,用于调用sendDataToActivity函数,通过ActivityThread组件向目标Activity发送数据,其中sendDataToActivity函数用来向其他Activity发送数据;
ActivityThread组件处理模块,用于判断源Activity和目标Activity处于同一个应用APP,如果是,则触发所述APP的应用主线程;如果否,则将数据发送请求传递给系统进程ActivityManagerService组件;
ActivityManagerService组件处理模块,用于确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程;
应用主线程处理子模块,在ActivityThread组件处理模块中,用于调用receiveDataFromActivity函数将数据发送给目标Activity,其中receiveDataFromActivity函数用来从其他Activity接收数据;
目标Activity处理子模块,用于通过receiveDataFromActivity函数接收来自源Activity的数据。
7.如权利要求6所述的用于安卓系统中Activity间通信的装置,其特征在于,所述源Activity处理模块调用sendDataToActivity函数,具体为:
源Activity处理模块调用sendDataToActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,将Intentdata从源Activity向目标Activity发送。
8.如权利要求7所述的用于安卓系统中Activity间通信的装置,其特征在于,所述ActivityThread组件处理模块,还用于:
从APP中ActivityClientRecord对应的哈希表获取所述APP中所有已经打开的Activity;从ActivityClientRecord对应的ActivityThead组件的ComponentNamemComponent获取Activity的包名和类名;调用sendDataToActivity函数,将源Activity所处APP中所有已经打开的Activity的包名和类名与目标Activity的包名和类名进行匹配;如果匹配成功,则源Activity和目标Activity处于同一个APP中;如果匹配不成功,则源Activity和目标Activity处于不同的APP中。
9.如权利要求8所述的用于安卓系统中Activity间通信的装置,其特征在于,所述ActivityManagerService组件处理模块确认目标Activity打开后,将数据发送给目标Activity所在App进程的应用主线程,具体为:
ActivityThread组件处理模块通过IActivityManager远程Binder调用接口将数据发送请求传递给系统进程ActivityManagerService组件;Binder线程匹配所有APP中打开的Activity,App的ActivityRecord中的ComponentNamerealActivity标识了Activity的包名和类名,通过搜索mHistory,匹配目标Activity的包名和类名;确认目标Activity打开后,记录目标Activity的ActivityRecord,并将目标Activity对应的ActivityRecord添加到MSG_DATA_TO_ACTIVITY消息发送给ActivityManagerService服务线程;ActivityManagerService服务线程根据目标Activity对应的ActivityRecord,通过IApplicationThread远程Binder调用接口将数据发送给目标Activity所在App进程的应用主线程。
10.如权利要求9所述的用于安卓系统中Activity间通信的装置,其特征在于,所述应用主线程处理子模块调用目标Activity的receiveDataFromActivity函数将数据发送给目标Activity,具体为:
应用主线程处理子模块通过目标Activity的包名和类名从ActivityThread的mActivities哈希表中匹配到目标Activity;调用receiveDataFromActivity函数获取Intentdata,StringsourceName和StringtargetName,其中,Intentdata是需要发送的数据,StringsourceName是源Activity的包名和类名,StringtargetName是目标Activity的包名和类名;根据Intentdata,StringsourceName和StringtargetName,将数据发送给目标Activity。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510651070.8A CN105204951A (zh) | 2015-10-10 | 2015-10-10 | 一种安卓系统中Activity间通信的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510651070.8A CN105204951A (zh) | 2015-10-10 | 2015-10-10 | 一种安卓系统中Activity间通信的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105204951A true CN105204951A (zh) | 2015-12-30 |
Family
ID=54952646
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510651070.8A Pending CN105204951A (zh) | 2015-10-10 | 2015-10-10 | 一种安卓系统中Activity间通信的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105204951A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107517188A (zh) * | 2016-06-16 | 2017-12-26 | 大唐软件技术股份有限公司 | 一种基于安卓系统的数据处理方法和装置 |
US20220156133A1 (en) * | 2019-07-29 | 2022-05-19 | Huawei Technologies Co., Ltd. | Cross-Process Communication Method, Apparatus, and Device |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102520936A (zh) * | 2011-11-30 | 2012-06-27 | 厦门雅迅网络股份有限公司 | 一种在Android上实现Socket通讯服务共享的方法 |
US8689114B2 (en) * | 2006-12-08 | 2014-04-01 | International Business Machines Corporation | Activity objectification for non-activity objects in an activity-centric collaboration |
CN103902390A (zh) * | 2014-03-12 | 2014-07-02 | 深圳创维-Rgb电子有限公司 | 基于Android的应用层的进程间通信方法及基础应用通信系统 |
CN104092815A (zh) * | 2014-05-22 | 2014-10-08 | 中兴通讯股份有限公司 | 一种基于安卓系统的应用间信息交互方法及装置 |
CN104486389A (zh) * | 2014-12-04 | 2015-04-01 | 上海斐讯数据通信技术有限公司 | 一种窗口管理服务与app间的通信通道建立方法和系统 |
US9009856B2 (en) * | 2011-12-16 | 2015-04-14 | Dell Products L.P. | Protected application programming interfaces |
-
2015
- 2015-10-10 CN CN201510651070.8A patent/CN105204951A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8689114B2 (en) * | 2006-12-08 | 2014-04-01 | International Business Machines Corporation | Activity objectification for non-activity objects in an activity-centric collaboration |
CN102520936A (zh) * | 2011-11-30 | 2012-06-27 | 厦门雅迅网络股份有限公司 | 一种在Android上实现Socket通讯服务共享的方法 |
US9009856B2 (en) * | 2011-12-16 | 2015-04-14 | Dell Products L.P. | Protected application programming interfaces |
CN103902390A (zh) * | 2014-03-12 | 2014-07-02 | 深圳创维-Rgb电子有限公司 | 基于Android的应用层的进程间通信方法及基础应用通信系统 |
CN104092815A (zh) * | 2014-05-22 | 2014-10-08 | 中兴通讯股份有限公司 | 一种基于安卓系统的应用间信息交互方法及装置 |
CN104486389A (zh) * | 2014-12-04 | 2015-04-01 | 上海斐讯数据通信技术有限公司 | 一种窗口管理服务与app间的通信通道建立方法和系统 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107517188A (zh) * | 2016-06-16 | 2017-12-26 | 大唐软件技术股份有限公司 | 一种基于安卓系统的数据处理方法和装置 |
US20220156133A1 (en) * | 2019-07-29 | 2022-05-19 | Huawei Technologies Co., Ltd. | Cross-Process Communication Method, Apparatus, and Device |
US11853820B2 (en) * | 2019-07-29 | 2023-12-26 | Huawei Technologies Co., Ltd. | Cross-process communication method, apparatus, and device |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106712904B (zh) | 数据传输的控制方法及装置、终端 | |
CN107041171B (zh) | 低功耗蓝牙ble设备、数据更新系统及方法 | |
CN105471628A (zh) | 智能设备分组系统、方法及装置 | |
JP6893243B2 (ja) | Harqフィードバックを入手するための方法および装置、ならびにharqフィードバックを伝送するための方法および装置 | |
AU2003212704A1 (en) | Method for providing a software module to an automotive vehicle control unit, and computer program for executing the method | |
US11449319B2 (en) | Method and apparatus for downloading bundle to smart secure platform by using activation code | |
CN108833578B (zh) | 基于fifo命名管道进行双工通信的方法及相关设备 | |
CN110249585B (zh) | 用于信息请求和/或信息供应的装置和方法 | |
CN111800443A (zh) | 数据处理系统和方法、装置以及电子设备 | |
EP3038292B1 (en) | Method, apparatus and system for device management | |
CN109743757B (zh) | 数据处理方法、装置、无线模组和物联网设备 | |
CN104462033A (zh) | 在设备间实现编辑操作的方法及设备 | |
US20240314564A1 (en) | Remote triggering of events by personal devices | |
CN108882053B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN114090483A (zh) | 一种基于协程的rdma通信方法、装置及存储介质 | |
CN105204951A (zh) | 一种安卓系统中Activity间通信的方法和装置 | |
CN106302093B (zh) | 一种通信方法、系统及服务器 | |
CN104954462A (zh) | 一种高并发可扩展的智能家居通信方法和系统 | |
KR101584286B1 (ko) | 사용자 위치 기반 스마트 여행 기록 시스템 | |
CN106658388A (zh) | 蓝牙网关 | |
CN112995095B (zh) | 数据处理方法、装置及计算机可读存储介质 | |
CN108881991B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN108025209B (zh) | 流传输计算设备的无线控制 | |
CN113286378A (zh) | 一种无线设备监听方法及装置 | |
CN116347488B (zh) | 网络卡顿的处理方法、设备以及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
AD01 | Patent right deemed abandoned |
Effective date of abandoning: 20190628 |
|
AD01 | Patent right deemed abandoned |