跨进程(同一app不同进程之间通信)——Android自动化测试学习历程
视频地址: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自动化测试学习历程的更多相关文章
- app电池续航上&&下--Android自动化测试学习历程
章节:自动化基础篇——电池续航自动化测试上&&下 主要讲解内容及笔记: 一.影响手机电量的因素和理论: 下面是一个表格:当今主流手机显示屏技术.机型与功耗对照表: 技术 类型 ...
- 【linux】mkfifo 命令创建命名管道实现进程之间通信
mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...
- 进程与进程之间通信Manager
#!/usr/bin/env python from multiprocessing import Process,Manager #Manager进程与进程之间通信 def Foo(i,dic): ...
- IPC进程之间通信的几种方式
概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- swoole父进程和子进程之间通信的例子
<?php /** 这是一个swoole父进程和子进程之间通信的例子 */ //进程创建成功后回调处理 function handle(swoole_process $worker){ //从进 ...
- 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程)
[源码下载] 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程) 作者:webabcd 介绍背水一 ...
- Android利用LocalSocket实现Java端进程与C端进程之间的IPC
Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...
- [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系
引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高 ...
随机推荐
- Activity之间数据交流(onActivityResult的用法)
http://www.blogjava.net/mixer-a/archive/2012/03/23/375014.html http://www.cnblogs.com/linjiqin/archi ...
- 20151215单选按钮列表,复选框列表:CheckBoxList
单选框:RadioButton GroupName:组名,如果要实现单选效果每个单选按钮的组名必须一样 是否被选中 RadioButton.checked 单选按钮列表:RadioButtonList ...
- jsonpath
1. java 类库 jayway/JsonPath maven 使用方法 <dependency> <groupId>com.jayway.jsonpath</grou ...
- [转]Windows多进程编程
转自:http://blog.csdn.net/bxhj3014/article/details/2082255 一.进程的概念 进程是是一个正在运行的程序的实例(飘---),是系统分配资 ...
- jQuery:获取浏览器中的分辨率
JQuery: <script type="text/javascript"> $(document).ready(function(){ alert($(window ...
- python学习-day20、装饰器【图片缺失可看】印象笔记博客备份
前言: 装饰器用于装饰某些函数或者方法,或者类.可以在函数执行之前或者执行之后,执行一些自定义的操作. 1.定义:装饰器就是一个函数,为新定义的函数.把原函数嵌套到新函数里面.以后就可以在执行新函数的 ...
- Hadoop学习12-配置集群环境
由于之前虚拟机都是用的桥接方式,有时候没有网络可用,想学习的时候,就狠不方便. 于是研究了一下,希望搭建一个多台虚机组成一个局域网的集群,即host-only方式 1.安装VM,网络选择“host-o ...
- OAF_文件系列4_实现OAF上传显示数据库动态图片Image(案例)
20150805 Created By BaoXinjian
- windows与OSX双操的时区-黑苹果之路
问题由来已久,原因好像是windows识别时间的方式跟OSX不一样,方法如下: 1,改苹果系统时区为冰岛 2,改window系统的注册表 在管理员cmd下运行 Reg add HKLM\SYSTEM\ ...
- ssh整合(http://blog.csdn.net/songanling/article/details/22454973)
http://blog.csdn.net/songanling/article/details/22454973