视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&courseId=712011

一、问题:

1、如何做到一个app不同进程通信?

2、多个app通信(不同app)

3、注入事件运行脚本和调用隐藏api

二、一个app不同进程通信:

知识点:

1、Intent、binder

2、Service、Activity

3、Handler、view

4、Messenger、Message、ServiceConnection、IPC(Internal process communication)

5、bundle

6、remote

7、pid

然后接下来说明一下程序实现的原理及过程:

1、定义一个继承自Service的类,使用onBind的生命周期,在服务端定义一个Messenger对象,然后将这个对象的getBinder()通过onBind()方法return给客户端,具体是在绑定的时候会使用到

2、需要给Messenger传递一个Handler对象,需要实现一个继承自Handler类的子类,然后复写HandleMessage()方法,这个就是用来处理从客户端传来的Message,并且根据客户端的内容,做出相应的操作

3、然后在AndroidManifest.xml中注册上面定义的Service类,增加android:process=":remote"

4、然后定义一个客户端程序,如一个Activity类,增加绑定服务和解绑服务的button,然后增加响应时间,主要是调用bindService()方法和unbindService()方法,然后在bindService里面需要使用一个ServiceConnection的对象,需要在定义这个对象的过程中,实现两个方法,分别是onServiceConnected()和onServiceDisconnected(),然后在这里得到Service端的IBinder对象,从而得到Service端的信使,然后通过这个信使,给服务端发消息,服务端就能接收到Msg,之后就会处理这个消息,就是第2步的处理

5、以上实现从客户端到服务端的单向通信,如何实现双向通信?就是在client端依然编写一个Handler类,然后用这个Handler类的对象初始化一个客户端的Messenger对象,然后将本地信使赋值给msg.replyTo,然后服务端Messenger对象.send(msg)就可以将消息发送出去;然后服务端就能获得一个客户端的信使,client和service之间就可以互相通信了。

然后上程序代码:

com.example.twomessengerservice.service中的service程序
package com.example.twomessengerservice.service;

import android.app.Service;
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 { public static final int SAY_HELLO = 0X1; private Messenger myMessenger = new Messenger(new IncomingHandler()); class IncomingHandler extends Handler{ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub switch(msg.what){
case SAY_HELLO:
Toast.makeText(getApplicationContext(), "service的处理", Toast.LENGTH_SHORT).show(); //当需要返回一个值的时候,通过Message来进行传送
Message newmsg = Message.obtain();
newmsg.what = SAY_HELLO; //从msg.reply中获取到客户端的信使
Messenger cMessenger = msg.replyTo; try{
cMessenger.send(newmsg);
}catch(RemoteException e){
e.printStackTrace();
}
break; default:
break; } super.handleMessage(msg);
} } @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return myMessenger.getBinder();
} }
com.example.twomessengerservice中的client程序:
package com.example.twomessengerservice;

import com.example.twomessengerservice.service.MessengerService;

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.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity { private Button buttonbind;
private Button buttonunbind; boolean isBound = false;
Messenger rMessenger = null;
Messenger mMessenger = null; private final String tag = "Activity"; class mHandler extends Handler{ @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case MessengerService.SAY_HELLO:
Toast.makeText(MainActivity.this, "client的toast",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} } ServiceConnection conn = new ServiceConnection() { @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
rMessenger = null;
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
rMessenger = new Messenger(service); //获取到service的信使
mMessenger = new Messenger(new mHandler()); //本地信使
sendMessage();
}
}; protected void sendMessage() {
// TODO Auto-generated method stub
Message msg = Message.obtain(null, MessengerService.SAY_HELLO);
msg.replyTo = mMessenger;
try {
rMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); buttonbind = (Button) findViewById(R.id.buttonbind);
buttonunbind = (Button) findViewById(R.id.buttonunbind); buttonbind.setOnClickListener(l);
buttonunbind.setOnClickListener(l); } View.OnClickListener l = new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.buttonbind:
Toast.makeText(getApplicationContext(), "绑定服务", Toast.LENGTH_SHORT).show();
Log.v(tag, "buttonbind");
isBound = bindService(new Intent(MainActivity.this, MessengerService.class), conn, Service.BIND_AUTO_CREATE);
Toast.makeText(getApplicationContext(), "接收从服务器端的消息", Toast.LENGTH_SHORT).show();
break;
case R.id.buttonunbind:
if(isBound = true){
Log.v(tag, "buttonunbind");
Toast.makeText(getApplicationContext(), "解除绑定", Toast.LENGTH_SHORT).show();
unbindService(conn);
}
break;
default:
break;
}
}
}; @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

AndroidManifest.xml配置文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.twomessengerservice"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.twomessengerservice.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service android:name = ".service.MessengerService"
android:process=":remote"></service> </application> </manifest>

跨进程(同一app不同进程之间通信)——Android自动化测试学习历程的更多相关文章

  1. app电池续航上&&下--Android自动化测试学习历程

    章节:自动化基础篇——电池续航自动化测试上&&下 主要讲解内容及笔记: 一.影响手机电量的因素和理论: 下面是一个表格:当今主流手机显示屏技术.机型与功耗对照表:   技术  类型   ...

  2. 【linux】mkfifo 命令创建命名管道实现进程之间通信

    mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...

  3. 进程与进程之间通信Manager

    #!/usr/bin/env python from multiprocessing import Process,Manager #Manager进程与进程之间通信 def Foo(i,dic): ...

  4. IPC进程之间通信的几种方式

    概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...

  5. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  6. swoole父进程和子进程之间通信的例子

    <?php /** 这是一个swoole父进程和子进程之间通信的例子 */ //进程创建成功后回调处理 function handle(swoole_process $worker){ //从进 ...

  7. 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程)

    [源码下载] 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程) 作者:webabcd 介绍背水一 ...

  8. Android利用LocalSocket实现Java端进程与C端进程之间的IPC

    Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...

  9. [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系

    引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高 ...

随机推荐

  1. SQL总结(三)其他查询

    SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT c ...

  2. DB2技术点

    ----定义 DECLARE CC VARCHAR(4000); DECLARE SQLSTR VARCHAR(4000); DECLARE st STATEMENT; DECLARE CUR CUR ...

  3. MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码

    MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查 ...

  4. Unity3D使用Assetbundle打包加载(Prefab、场景)

    之前有一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity游戏开发使用Assetbundle加载场景的原理 本篇文章我们将说说assetbund ...

  5. div 居中

    Found another solution: Just add position: relative; top: 50%; transform: translateY(-50%); to the i ...

  6. mac下删除svn账号

    以mac os x为例(Unix/Linux类似), 1.打开命令行窗口,即用户的根目录(用户的home目录) $ ls -al drwxr-xr-x   6 linxyz  staff    204 ...

  7. Python学习——基础篇

    1.python的安装     python下载地址:https://www.python.org/downloads/     安装完成后,运行cmd.exe,输入python     如果出现“p ...

  8. host DNS 访问规则

    昨天站点一直出现302循环重定向问题,捣鼓了半天才解决,原来是hosts和dns配置问题. 注:当你的站点出现循环重定向时,首先应该关注的hosts以及dns配置,确保无误. 下面记录下相关知识点: ...

  9. struts2 中 Actionsupport 的作用

    struts2 中 Actionsupport 的作用 Action 跟 Actionsupport 的区别     当我们在写action的时候,可以实现Action接口,也可以继承Actionsu ...

  10. ImageMagick之PDF转换成图片(image)

    安装完ImageMagick之后,直接执行“magick convert f:\parseWord\tmp\testpdf.pdf f:\parseWord\tmp\testpdf.jpg”,会报错: ...