`

1.Android中进程与进程、线程与线程之间如何通信?

 
阅读更多

1. Android 中进程与进程、线程与线程之间如何通信?
1)
一个 Android 程序开始运行时,会单独启动一个Process。
默认情况下,所有这个程序中的Activity或者Service都会跑在这个Process。
默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个Thread。
2)一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。

3) 一个Android程序创建之初,一个Process呈现的是单线程模型--即MainThread,所有的任务都在一个线程中运行,所 以,MainThread所调用的每一个函数,其耗时应该越短越好,而对于比较耗时的工作,应该交给子线程去做,以避免主线程(UI线程)被阻塞,导致程 序出现ANR(Application not response)

一个Activity就运行在一个线程中吗?或者编码时,如果不是明确安排在不同线程中的两个Activity,其就都是在同一个线程中?那从一个Activity跳转到另一个Activity时,是不是跳出的那个Activity就处在睡眠状态了?
【答】  每个Activity都有一个Process属性,可以指定该Activity是属于哪个进程的。当然如果不明确指明,应该就是从属于默认进程(Application指定的,如其未指定,应该就是默认主进程)。

      Android 中有Task的概念,而同一个Task的各个Activity会形成一个栈,只有站定的Activity才有机会与用户交互。

原文地址: Android中的进程与线程     原文作者: 江鹏

当应用程序的组件第一次运行时,Android将启动一个只有一个执行线程的Linux进程。默认,应用程序所有的组件运行在这个进程和线程中。然而,你可以安排组件运行在其他进程中,且你可以为进程衍生出其它线程。本文从下面几点来介绍Android的进程与线程:

1 、进程

组 件运行于哪个进程中由清单文件控制。组件元素—— <activity>、<service>、<receiver>、<provider>,都有一个 process属性可以指定组件运行在哪个进程中。这个属性可以设置为每个组件运行在自己的进程中,或者某些组件共享一个进程而其他的不共享。他们还可以 设置为不同应用程序的组件运行在同一个进程中——假设这些应用程序共享同一个Linux用户ID且被分配了同样的权 限。<application>元素也有process属性,为所有的组件设置一个默认值。

所 有的组件都在特定进程的主线程中实例化,且系统调用组件是由主线程派遣。不会为每个实例创建单独的线程,因此,对应这些调用的方法——诸如 View.onKeyDown()报告用用户的行为和生命周期通知,总是运行在进程的主线程中。这意味着,没有组件当被系统调用时应该执行很长时间或阻塞 操作(如网络操作或循环计算),因为这将阻塞进程中的其它组件。你可以为长操作衍生独立的线程。

public boolean onKeyDown (int keyCode,KeyEvent event) :默认实现KeyEvent.Callback.onKeyMultiple(),当按下视图的KEYCODE_DPAD_CENTER或KEYCODE_ENTER然后释放时执行,如果视图可用且可点击。

参数

keyCode - 表示按钮被按下的键码,来自KeyEvent
event -定义了按钮动作的KeyEvent对象

返回值

如果你处理事件,返回true;如果你想下一个接收者处理事件,返回false。

当内存剩余较小且其它进程请求较大内存并需要立即分配,Android要回收某些进程,进程中的应用程序组件会被销毁。当他们再次运行时,会重新开始一个进程。

当 决定终结哪个进程时,Android会权衡他们对用户重要性的相对权值。例如,与运行在屏幕可见的活动进程相比(前台进程),它更容易关闭一个进程,它的 活动在屏幕是不可见(后台进程)。决定是否终结进程,取决于运行在进程中的组件状态。关于组件的状态,将在后面一篇——组件生命周期 中介绍。

2 、线程

虽然你可能会将你的应用程序限制在一个进程中,但有时候你会需要衍生一个线程做一些后台工作。因为用户界面必须很快地响应用户的操作,所以活动寄宿的线程不应该做一些耗时的操作如网络下载。任何不可能在短时间完成的操作应该分配到别的线程。

线程在代码中是用标准的Java线程对象创建的,Android提供了一些方便的类来管理线程——Looper用于在线程中运行消息循环、Handler用户处理消息、HandlerThread用户设置一个消息循环的线程。

Looper

该 类用户在线程中运行消息循环。线程默认没有消息循环,可以在线程中调用prepare()创建一个运行循环;然后调用loop()处理消息直到循环结束。 大部分消息循环交互是通过Handler类。下面是一个典型的执行一个Looper线程的例子,分别使用prepare()和loop()创建一个初始的 Handler与Looper交互:

  class LooperThread extends Thread {
      public Handler mHandler;
      
      public void run() {
          Looper.prepare();
         
          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
         
          Looper.loop();
      }
  }

更多的关于Looper的信息及Handler、HandlerThread请参阅相关资料。

2.1 、远程过程调用(Remote procedure calls,RPCs)

Android 有 一个轻量级的远程过程调用机制——方法在本地调用却在远程(另外一个进程中)执行,结果返回给调用者。这需要将方法调用和它伴随的数据分解为操作系统能够 理解的层次,从本地进程和地址空间传输到远程进程和地址空间,并重新组装调用。返回值以相反方向传输。Android提供了做这些工作的所有代码,这样我 们可以专注于定义和执行RPC接口本身。

一 个RPC接口仅包含方法。所有的方法同步地执行(本地方法阻塞直到远程方法执行完成),即使是没有返回值。简言之,该机制工作原理如下:首先,你用简单的 IDL(interface definition language,接口定义语言)声明一个你想实现的RPC接口。从这个声明中,aidl工具生成一个Java接口定义,提供给本地和远程进程。它包含两 个内部类,如下图所示:
11.PNG


内部类有管理你用IDL定义 的接口的远程过程调用所需要的所有代码。这两个内部类都实现了IBinder接口。其中之一就是在本地由系统内部使用,你写代码可以忽略它。另外一个是 Stub,扩展自Binder类。除了用于有效地IPC(interprocess communication)调用的内部代码,内部类在RPC接口声明中还包含方法声明。你可以定义Stub的子类实现这些方法,如图中所示。

通常情况下,远程过程有一个服务管理(因为服务能通知系统关于进程和它连接的其它进程的信息)。它有由aidl工具生成的接口文件和Stub子类实现的RPC方法。服务的客户端仅有由aidl工具生成的接口文件。

下面介绍服务如何与它的客户端建立连接:

·       服务的客户端(在本地端的)应该实现onServiceConnected() 和onServiceDisconnected() 方法,因此当与远程服务建立连接成功和断开连接是会通知它。然后调用bindService() 建立连接。

·       服务的onBind()方法将实现为接受或拒绝连接,者取决于它接受到的意图(该意图传送到binServive())。如果连接被接受,它返回一个Stub子类的实例。

·       如果服务接受连接,Android调用客户端的onServiceConnected()方法且传递给它一个IBinder对象,返回由服务管理的Stub子类的一个代理。通过代理,客户端可以调用远程服务。

这里只是简单地描述,省略了一些RPC机制的细节。你可以查阅相关资料或继续关注Android开发 之旅,后面将为你奉上。

2.2 、线程安全方法

在 一些情况下,你实现的方法可能会被不止一个线程调用,因此必须写成线程安全的。这对远程调用方法是正确的——如上一节讨论的RPC机制。当从 IBinder进程中调用一个IBinder对象中实现的一个方法,这个方法在调用者的线程中执行。然而,当从别的进程中调用,方法将在Android维 护的IBinder进程中的线程池中选择一个执行,它不在进程的主线程中执行。例如,一个服务的onBind()方法在服务进程的主线程中被调用,在 onBind()返回的对象中执行的方法(例如,实现RPC方法的Stub子类)将在线程池中被调用。由于服务可以有一个以上的客户端,所以同时可以有一 个以上的线程在执行同一个IBinder方法。因此,IBinder的方法必须是线程安全的。

同 样,一个内容提供者可以接受其它进程产生的数据请求。虽然ContentResolver 和 ContentProvider 类隐藏进程通信如何管理的,对应哪些请求的ContentResolver 方法——query()、insert()、delete()、update()、getType(),在内容提供者的进程的线程池中被调用,而不是在这 一进程的主线程中。因为这些方法可以同时从任意数量的线程中调用,他们也必须实现为线程安全的。

分享到:
评论

相关推荐

    Android Task 进程与线程详解

    "Android Task 进程与线程详解" Android 中的 Task 概念是指一组以栈的模式聚集在一起的 Activity 组件集合,具有潜在的前后驱关联。Task 的主要作用是将组件之间的连接,从进程概念的细节中剥离出来,可以以一种...

    Android下线程与进程

    总之,理解和掌握Android中的线程与进程是开发高质量应用的基础,它们直接影响到应用的响应速度、稳定性以及资源利用率。`WorkThreadDemo`这样的实例代码可以帮助开发者更好地理解并实践这些概念。

    Android中线程间通信.pdf

    ### Android中线程间通信详解 #### 一、引言 在Android开发中,线程间的通信是一项重要的技术。为了确保应用的响应性和流畅性,开发者必须了解如何正确地管理和同步多个线程之间的数据交换。本文将深入探讨Android...

    android aidl 不同进程间通信

    Android进程通信的重要性** Android系统设计时,每个应用运行在自己的进程中,为了保护应用间的隔离性和安全性。但有时我们需要让一个应用调用另一个应用的服务或共享数据,这就需要进程间通信。Aidl便是Android为...

    安卓 进程/线程绑定cpu

    在安卓开发中,进程和线程的管理是优化应用程序性能的关键环节。特别是在处理密集型计算或者需要高效利用硬件资源的任务时,将特定的线程或进程绑定到特定的CPU核心上,可以有效提升效率,减少上下文切换带来的开销...

    android进程和新城之间的通信

    在Android系统中,进程和线程的通信是应用程序运行的核心组成部分。Android系统为每个应用程序启动一个单独的Linux进程,这个进程在默认情况下承载了应用程序的所有组件,如Activity、Service等。每个应用程序至少有...

    android 进程与线程 - 开发文档翻译 - 进程.doc

    在Android系统中,进程和线程是应用程序执行的基础。每个应用组件的启动都可能伴随着新进程的创建或已有进程的重用。默认情况下,同一应用的所有组件在同一进程中运行,共享一个主线程。这是因为主线程负责处理用户...

    Android 进程和线程

    在Android系统中,进程和线程是应用程序运行的基础,它们决定了程序如何管理和执行任务。深入理解这两个概念对于优化应用性能、提高用户体验至关重要。 首先,我们要明白什么是进程。在计算机科学中,进程是程序的...

    Android进程结束杀掉子线程Demo

    http://blog.csdn.net/qq_28690547/article/details/50375997;关于demo的文章详解,有兴趣的童鞋可以看看,解决popupwindow/dialog的BadTokenException异常

    详解Android进程和线程

    Android进程和线程是Android应用程序运行的基础,理解这两个概念对于开发高质量的Android应用至关重要。在Android系统中,每个应用都是一个独立的Linux进程,这意味着它们在各自的沙箱环境中运行,互不影响,提高了...

    Android 中三种启用线程的方法总结

    在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而...

    Android-AndroidIPC多进程通信aidl

    在Android系统中,IPC(Inter-Process Communication)是不同应用程序之间进行数据交换的重要方式,而Android Interface Definition Language(aidl)则是实现这种通信的一种机制。本文将深入探讨Android IPC以及...

    进程和线程-Android Developers1

    在Android系统中,进程和线程是应用程序执行和资源管理的核心概念。这篇文章主要阐述了Android应用如何使用进程和线程,以及系统如何管理和优化这些资源。 首先,Android系统中的进程有五种不同的生命周期状态,...

    Android使用AIDL实现跨进程通信

    在Android系统中,进程间的通信(Inter-Process Communication, 简称IPC)是一个重要的功能,它允许不同的应用程序之间共享数据和服务。AIDL(Android Interface Definition Language)是Android提供的一种工具,...

    线程/进程绑定CPU代码

    当我们谈论"线程/进程绑定CPU代码"时,我们通常指的是通过编程手段将特定的进程或线程与特定的CPU核心关联,以优化系统性能或解决某些并发问题。 在多核处理器系统中,进程和线程的绑定可以带来以下好处: 1. **...

    Android使用AIDL实现进程间通信

    在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。Android提供多种IPC方式,其中AIDL(Android Interface Definition Language)是一种强大的工具,用于...

    Android线程和进程介绍.pdf

    在Android系统中,线程和进程是两个关键概念,它们对于理解应用程序的执行环境和多任务处理至关重要。本文将深入探讨Android线程和进程的工作原理,以及如何在Android应用程序开发中正确地使用它们。 首先,Android...

    Android线进程间通信

    ### Android进程间通信详解 #### 一、线程间通信 在Android开发中,线程间的通信至关重要,尤其是在UI线程和其他线程之间的交互。线程间的通信主要依赖于`Handler`机制。 ##### 1. 主(UI)线程 **1.1 建立Handler...

    Android-可保持线程日志统一输出多线程不混乱

    "Android-可保持线程日志统一输出多线程不混乱"这个主题关注的是如何在多线程环境中,有效地组织和打印线程相关的日志,以便于开发者追踪和理解程序执行流程。在多线程环境下,如果不对日志进行适当的管理,不同线程...

Global site tag (gtag.js) - Google Analytics