跨进程(同一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>
时间: 2024-08-02 16:39:51

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

app电池续航上&amp;&amp;下--Android自动化测试学历历程

章节:自动化基础篇——电池续航自动化测试上&&下 主要讲解内容及笔记: 一.影响手机电量的因素和理论: 下面是一个表格:当今主流手机显示屏技术.机型与功耗对照表:   技术  类型  主流机型  功耗  LCD  LCD+LED背光   四颗星  TFT-LCD   三颗星   IPS iphone  三颗星   SLCD HTC.三星Nexus S(19023)  两颗星   OLED  AMOLED  三星Nexus S(19020) 一颗星  Super  AMOLED  三星 一颗

进程与进程之间通信Manager

1 #!/usr/bin/env python 2 from multiprocessing import Process,Manager 3 4 #Manager进程与进程之间通信 5 def Foo(i,dic): 6 dic[i] = 100+i 7 print(dic.values()) 8 if __name__ == '__main__': 9 manage = Manager() 10 dic = manage.dict() 11 for i in range(2): 12 p =

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

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

进程之间通信

IPC 指的是进程间通讯 之所以开启子进程 ,肯定需要他帮我们完成任务,很多情况下,需要将数据返回给父进程. 然而进程内存是物理隔离的 解决方案: 1.将共享数据放在文件中,就是慢 2.管道 subprocess 中那个管道只能单向通讯,必须有父子关系 3.共享一块内存区域 得操作系统帮你分配,速度快 第三钟实现Manager from multiprocessing import Process,Manager import time def task(dic): print("子进程&quo

Linux下的进程通信方式(IPC)——管道通信

Unix IPC: 管道.命名管道(FIFO)      管道 1.概念 管道是单向的(半双工).先进先出.无结构的字节流,它把一个进程的输出和另一个进程的输入连接在一起. 写进程在管道的尾端写入数据,读进程在管道的首端读出数据.数据读出后将从管道中移走,其它读进程都不能再读到这些数据. 管道提供了简单的流控制机制.进程试图读一个空管道时,在数据写入管道前,进程将一直阻塞.同样,管道已经满时,进程再试图写管道,在其它进程从管道中读走数据之前,写进程将一直阻塞. 2.管道的特点 (1)单向数据通信

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

原文:http://www.cnblogs.com/leslies2/archive/2012/03/06/2379235.html 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助.在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助. 一.进程的概念与作用 进程(Process)是Windo

线程和进程的区别以及进程通信方法

进程是资源分配的最小单位,线程是CPU调度的最小单位 对比维度 多进程 多线程 总结 数据共享.同步 数据共享复杂,需要用IPC:数据是分开的,同步简单 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 各有优势 内存.CPU 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优 创建销毁.切换 创建销毁.切换复杂,速度慢 创建销毁.切换简单,速度很快 线程占优 编程.调试 编程简单,调试简单 编程复杂,调试复杂 进程占优 可靠性 进程间不会互相影响

细说进程、应用程序域与上下文之间的关系

引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作.虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助.在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助.因为时间仓促,文中有错误的地方敬请点评. 目录 一.进程的概念与作用 二.应用程序域 三.深入了解.NET上下文 四.进程应用程序域与线程的关系 一.进程的概念与作用 进程(Proces

[C#参考]细说进程、应用程序域与上下文之间的关系

原文转载链接:http://www.cnblogs.com/leslies2/archive/2012/03/06/2379235.html Written by:风尘浪子 引言 本文主要是介绍进程(Process).应用程序域(AppDomain)..NET上下文(Context)的概念与操作. 虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助. 在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助. 因为时