`
waterlife
  • 浏览: 65736 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Android Framework系列之IPC(一)

阅读更多

原创文章,转载请标注出处----

 

说到Android的IPC(Inter-Process Conmmunication)首先想到的就是Handler和Looper,Handler用于多进程之间的通信和数据交换,将各进程之间通信的数据Message放置到Message Queue里,而Looper用于创建各进程自身的message queue,然后在适当的时候分发给相应的进程。

 

我们知道在Android中,每一个UI线程是一个主线程(Main Thread),Android为每一个主线程维护一个Message Queue,当用户需要长时间的背景线程操作的时候,需要create自己的new thread,这样的new thread是没有自己的message queue的,只能共享主线程的message queue并且将所做的运算结果和数据通过Handler发送到主线程的message queue里,被主线程共享。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <ProgressBar 
        android:id="@+id/ProgressBar01" 
        android:layout_width="150dip"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal">
    </ProgressBar>
    
</LinearLayout>

 这个xml文件创建了一个progressbar,并且将style设置成水平,

style="?android:attr/progressBarStyleHorizontal

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="waterlife.ipc.demo"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".IPCConmunication"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.INTERNET" />

</manifest> 

 为了访问网络,需要在manifest file里设置access internet的permission,

    <uses-permission android:name="android.permission.INTERNET" />

 

package waterlife.ipc.demo;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.widget.ProgressBar;


public class IPCConmunication extends Activity {
    static ProgressBar pb;
    final int UPDATE_PROGRESS_BAR = 1000;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pb = (ProgressBar)findViewById(R.id.ProgressBar01);
        Download dl = new Download();
        new Thread(dl).start();
        
    }


    Handler mHandle = new Handler()
    {
       public void handleMessage(Message msg)
        {
            switch(msg.what)
            {
                case UPDATE_PROGRESS_BAR:
                    pb.setProgress(msg.arg1);
                    break;
                default:
                    break;
            }
        }
    };

    class Download implements Runnable
    {

        @Override
        public void run() {
            int totalSize = 0;
            InputStream recevier = null;

             try {
                URL myUrl = new URL("http://bbs.nju.edu.cn");

                URLConnection urlConn = myUrl.openConnection();
                totalSize = urlConn.getContentLength();
                recevier = urlConn.getInputStream();
                byte[] b =new byte[256];
                int length = 0;
                length += recevier.read(b);
                while(length < totalSize)
                {
                    Message msg = mHandle.obtainMessage(UPDATE_PROGRESS_BAR);
                    msg.arg1 = (int)(length*100/totalSize);
                    if(mHandle.hasMessages(UPDATE_PROGRESS_BAR))
                    {
                        mHandle.removeMessages(UPDATE_PROGRESS_BAR);
                    }
                    mHandle.sendMessage(msg);
                    length += recevier.read(b);
                    Thread.sleep(1000);  //睡眠1S,这个方法是不值得推荐的,因为它会使线程独占CPU,在以后的例子会使用更加有效的方法
                }
                recevier.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (Exception ex)
            {
                ex.printStackTrace();
            }    
        }
    }
}

 

我们create出来的一个new thread,用这个线程去网络上下载数据包,并且把下载的进度更新到UI主线程的progressbar上。两个线程之间的通信是用Handler来传递的。在这里新的线程Download和UI main thread共用message queue。

 

当然,我们可以为自己新建的线程设置自身的message queue,方法如下:

package waterlife.ipc.demo;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.widget.ProgressBar;


public class IPCConmunication extends Activity {
    static ProgressBar pb;
    final int UPDATE_PROGRESS_BAR = 1000;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pb = (ProgressBar)findViewById(R.id.ProgressBar01);
        Download dl = new Download();
        new Thread(dl).start();
        
    }


    class Download implements Runnable
    {

        @Override
        public void run() {
            int totalSize = 0;
            InputStream recevier = null;

            HandlerThread threadLoop = new HandlerThread("Download");
            threadLoop.start();
            Looper mLooper = threadLoop.getLooper();
            Handler mHandle = new Handler(mLooper)
            {
                public void handleMessage(Message msg)
                {
                    switch(msg.what)
                    {
                        case UPDATE_PROGRESS_BAR:
                            pb.setProgress(msg.arg1);
                            break;
                        default:
                            break;
                    }
                }
            };
 
            try {
                URL myUrl = new URL("http://bbs.nju.edu.cn");

                URLConnection urlConn = myUrl.openConnection();
                totalSize = urlConn.getContentLength();
                recevier = urlConn.getInputStream();
                byte[] b =new byte[256];
                int length = 0;
                length += recevier.read(b);
                while(length < totalSize)
                {
                    Message msg = mHandle.obtainMessage(UPDATE_PROGRESS_BAR);
                    msg.arg1 = (int)(length*100/totalSize);
                    if(mHandle.hasMessages(UPDATE_PROGRESS_BAR))
                    {
                        mHandle.removeMessages(UPDATE_PROGRESS_BAR);
                    }
                    mHandle.sendMessage(msg);
                    length += recevier.read(b);
                    Thread.sleep(1000);
                }
                recevier.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (Exception ex)
            {
                ex.printStackTrace();
            }    
        }
    }
}

 

HandlerThread是一个专门用于新建Looper的线程类,它实现了Looper.prepare()和Looper.loop()的方法。HandlerThread ceate一个新的Looper并且绑定到新线程的Handler上,实现了对新线程创建自己的Message queue的目的。

分享到:
评论
1 楼 guoyu04 2011-04-09  
一个UI中,new 两个 handler 是什么情况?
是一个handler对象维护一个message queue
还是一个UI维护一个 message queue

相关推荐

    Deep Dive into Android IPC-Binder Framework

    Deep Dive into Android IPC-Binder Framework 深入Android IPB/Binder 框架

    android-framework-hal

    4.1 如何加入 API 至 Android Framework 4.2 如何编译并制作独立 JAR 档 4.3 上机实验:开发LedService API 与制作mokoid.jar 程式库 5.JNI & Runtime Library 5.1 什么是 JNI 5.2 如何撰写 JNI & Native Method ...

    Deep Dive into Android IPC & Binder.pdf

    IPC/Binder Framework at Android Builders Summit 2013 Binder Overview IPC Advantages of Binder Binder vs Intent/ContentProvider/Messenger-based IPC Binder Terminology Binder Communication and ...

    Android代码-简单易用的安卓进程间通信IPC框架

    A smart, novel and easy-to-use framework for Android Inter-Process Communication (IPC). Chinese Readme 中文文档 Hermes is a smart, novel and easy-to-use framework for Android Inter-Process ...

    Android的IPC机制——Binder

    android技术内幕--系统卷,第三章Android的IPC机制,关于Binder通信机制,详细讲解,并附有framework层代码说明,

    android开发与介绍

    Android 简介 Android开发环境 Android 开发基础 Android Application 开发细节 Android Framework Android 线程通信/ IPC 通信 Andorid 整合开发

    Android_IPC

    Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口,系统中 有一个进程管理所有的system service,Android不允许用户添加非授权的System service,当然现在源码开发...

    Android内训教程资料

    Android内训教程,包括Android 简介 Android开发环境 Android 开发基础 Android Application 开发细节 Android Framework Android 线程通信/ IPC 通信 Andorid 整合开发

    Android深入浅出之Binder机制.pdf

    Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞明白Binder的话,在很大程度上就能理解程序运行的流程。我们这里将以MediaService的例子来...

    Android代码-Android

    Deep Dive into Android IPC:Binder Framework android与linux的关系 (看前几页PPT就好了) Android的匿名共享内存机制是在内核实现的,也是基于Linux内核本身的共享内存机制,作了一层封装。Android提供了匿名共享...

    Fuzz技术的挖掘Android漏洞和如何防御经验分享-供大家学习研究参考

    它继承了IBinder接口 从IPC角度来说,Binder是Android中的一种跨进程通信方式,Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在Linux中没有 从Android Framework角度来说,...

    Android驱动开发权威指南

    第一篇Android的前世今生——Android概述篇 第1章Android的前世今生 1.1 Android的起源 1.2开放手机联盟 1.3开源与相关协议 1.4系统的升级与发展 第2章Android体系结构 2.1四层空间基本结构 2.1.1 Android系统底层...

    Android IBinder.pdf

    This doc tells you that how the IBinder IPC at Google Android framework works, using 1 ezxample code....

    新版Android开发教程.rar

    这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...

    android平台sensor从底层到上层流程介绍.doc

    值得从事android hal层开发的人一看。 从这个图来看Sensor的架构还是非常的清淅, 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,把驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor...

    高焕堂之五本android中文书

    高焕堂之五本android中文书: AndroidBook_001_GraphicThinking_V2.0 AndroidBook_002_EIT_Framework_V2.0 AndroidBook_003_ThreadModel_V2.0 AndroidBook_004_IPC_Binder_V2.0 AndroidBook005_JNI_Skills_V1.0

    Android核心分析

    Android 核心分析 之一 -------- 分析方法论探讨之设计意图 .......................................... 1 Android 核心分析 之二 ------- 方法论探讨之概念空间篇 .................................................

    Android传感器MotionSensor开发实验.pdf

    d) Android应⽤框架(ANDROIDFRAMEWORK) 应⽤程序框架是指定义了⼀个应⽤程序运⾏所必须的全部功能组件,开发者也可以访问核⼼应⽤程序所使⽤的API框架。在Android系统中, 开发⼈员也可以完全访问核⼼应⽤程序所使⽤...

    professional.Android.Application.Development.2009.pdf

    Introducing the Development Framework 11 What Comes in the Box 12 Understanding the Android Software Stack 12 The Dalvik Virtual Machine 14 Android Application Architecture 14 Android Libraries ...

    drozer-agent:Mercury安全评估框架的Android代理

    drozer允许您通过承担应用程序的角色并与Dalvik VM,其他应用程序的IPC端点和基础操作系统进行交互来搜索应用程序和设备中的安全漏洞。 drozer提供了可帮助您使用,共享和理解Android公共漏洞利用的工具。 它可以...

Global site tag (gtag.js) - Google Analytics