`
ictch
  • 浏览: 135465 次
  • 性别: 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代码 
<?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代码 
<?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" />

Java代码 
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,方法如下:
Java代码 
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的目的。
分享到:
评论

相关推荐

    android framework 开发揭秘

    Service Manager是Android Binder IPC(Inter-Process Communication)机制的一部分,它维护了一个服务注册表,使得不同进程间能安全有效地通信。Service Server则是实现特定服务的进程,如Activity Manager Service...

    Deep Dive into Android IPC-Binder Framework

    其中,Binder是Android IPC框架的核心组件,它为对象导向的服务提供了一个高效的通信机制。 Binder框架为Android开发者提供了一个非常重要的机制,使得进程之间可以像调用本地对象的方法一样调用远程服务。这种方式...

    Android framework详细分析 PDF

    Android系统作为当今最流行的移动操作系统之一,拥有庞大的开发者社区和丰富的系统组件,为开发者提供了强大的开发平台。了解和分析Android系统的工作原理以及它的框架结构对于开发高质量的应用程序至关重要。本文将...

    字节面试Android11.0最新Framework解析

    《字节面试Android11.0最新Framework解析》是一份专为程序员面试准备的资料,主要聚焦于Android系统的深层机制,特别是针对Android 11.0版本的Framework层进行了深入剖析。Framework是Android系统的核心部分,它定义...

    android framework

    2. 框架层(Framework):这一层是用Java编写的Android核心代码,提供了一系列的API供开发者使用。它包括了Android的Java核心库以及各种服务和扩展功能。 3. 库层:包含了许多原生库,这些库通常用C或C++编写,提供...

    Android-framework详细分析[1]

    ### Android Framework 详细分析 #### 一、设计意图与研究方法论 在开始对Android框架进行深入探索之前,我们首先要明确为什么要研究Android及其框架层。Android不仅是一个移动操作系统,更是一个集成了各种技术和...

    Android Framework 框架分析

    Android Framework的复杂性与精妙设计是其成为全球最广泛使用的移动操作系统之一的关键。通过对框架核心组件的深入分析,我们不仅能更好地理解Android系统的运作机制,还能在开发过程中做出更优化的设计决策,提升...

    android bluetooth framework,application 层分析

    Android Bluetooth Framework 应用层分析 AndroidBluetooth Framework 是 Android 操作系统中的蓝牙协议栈,负责管理蓝牙设备的连接、数据传输和蓝牙 Profile 的管理。整个蓝牙系统可以分为四个层次:蓝牙嵌入式...

    Android_Framework详细分析

    Binder 机制是 Android Framework 中实现 IPC 的核心技术之一。它允许不同进程间的对象进行通信,从而实现了 Android 系统的模块化设计。Binder 机制主要包括以下几个方面: - **Binder 对象**:每个 Binder 对象都...

    Android framework详细分析.pdf

    Android不仅仅是一个手机的代名词,它是一个完整的软件生态系统,包括手机开发平台、虚拟Java操作系统、开发社区、标准规范,以及包含着Activity、Manifest、Intent、Service、Binder、Dalvik虚拟机、Framework、...

    Android framework详细分析1

    综上所述,Android Framework的分析涵盖了系统设计、组件交互、服务管理、启动流程、输入输出、电话功能和图形显示等多个方面,每一个部分都是Android系统不可或缺的元素,它们共同构建了这个强大的移动平台。...

    android framework詳細分析

    IPC(Inter-Process Communication)框架是Android中用于进程间通信的一个重要组件,它包括Binder、Service、Servicemanager等概念。Binder是一种高效的远程过程调用(RPC)机制,它允许不同应用程序组件之间进行轻...

    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-framework-hal

    - **Éclair新增**:stagefright是Android 2.0 Éclair版本中引入的一个媒体框架,负责处理多媒体数据的播放、录制等功能。 ### Android的电话系统 #### 10.1 电话系统结构 - **Android电话系统的层次结构**:...

    Android核心剖析之Framework概述

    Binder驱动提供了一种高效的IPC(进程间通信)机制,使服务端与客户端之间能够安全地交换数据和消息,是Android系统内部通信的基石。 #### 五、APK程序的运行机制 APK程序的执行始于ActivityThread的main()函数,...

    android_framework.ppt

    这份名为"android_framework.ppt"的文档资料主要探讨了Android框架层的交互机制,特别是Android架构的层次、服务之间的通信方式,以及Binder IPC的工作原理。 首先,Android架构主要分为三层:App层、Runtime ...

    Android-framework详解

    ### Android Framework 层面的核心技术解析 #### 一、引言与设计意图 在深入了解Android框架之前,我们首先需要理解其设计背后的核心理念。本文档旨在揭示Android框架的设计初衷及其实现方式,帮助读者从宏观角度...

    An Introduction to the Android Framework

    2. Binder IPC:Binder是一种进程间通信(IPC)机制,它允许Android的不同组件之间相互通信,包括应用组件、系统服务和其他进程。Binder IPC机制是实现Android组件间通信的基础。 3. 线程操作:Android中的线程操作...

Global site tag (gtag.js) - Google Analytics