Activity和Service之间只相差了一个Window

从使用的角度来说:

- Activity主要处理需要用户参与的任务

- Service主要后台处理一些不需要用户参与的任务

从实现角度来看,是什么造成了它们之间的区别,我很好奇的翻了翻源码,发现:

Activity和Service 都是由共同的祖先派生下来的,其实Activty和Service之间最大的区别是 Activity包含了一个Window,但是Service没有。

那么Window是如何和Activity勾搭上的呢?

1. Activity里面所有的View都是放在Window里面管理的

对应每一个Activity来说,都包含了一个 Window,

在Acitivy里面有这个定义,

private Window mWindow;

当前Acitivy所有显示的view都是放在这个window里面的。window里面有一个非常重要的变量:

private DecorView mDecor;// This is the top-level view of the window, containing the window decor.

这个是window里面最顶层的View。然后用户自己定义的View是放在下面这个变量里面:

// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent

我们会在Activity 里面调用下面的函数,setContentView(R.layout. activity_test );

这个函数的作用就是把包含我们的 layout局部的View放到mContentParent 里面

它们的之间的关系如下图所示:

Activty如果想获取某个View,都是用下面这个函数

    public View findViewById(int id) {
        return getWindow().findViewById(id);
    }

可以看到,其实也是通过Window来得到某一个View

2. Acitivy响应用户事件也是通过Window响应的

用户操作屏幕的事件传递也是通过window 来进行的。具体流程如下:

事件传递给DecorView ,然后传递给ChildView,如果ChildView不处理,就把事件返回给上层处理。如果所有的View都不处理事件,就返回到Activity里面。

为什么最后能返回到Acitivity里面了,原来Acitivy实现了一个重要的回调接口 Window.Callback

代码如下:在为Acitivy创建window 的时候,为window设置了回调的入口:

 mWindow = PolicyManager.makeNewWindow(this);
 mWindow.setCallback(this);  //看一下这个callback接口的定义,

就发现里面包含了public boolean dispatchKeyEvent(KeyEvent event); 等事件传递的回调接口定义

 mWindow.setOnWindowDismissedCallback(this);

这样就能把事件从View传递到Activity里面了。

3.总结

我们可以看到其实所有的View都是是通过window来维护的。用户时间也是通过窗口系统来传递

- Activity有了Window之后,就可以展示界面给用户,也可以响应用户的操作了。

- Service没有Window,只能默默的处理一些后台的任务。

两者的使命不同决定的,也决定了两者的生命周期也不一样。

另外要注意的是Activity 和Service都是继承自ContextWrapper,他们都运行在主线程里面。所以Service在运行后台任务的时候,一般都需要额外创建一个线程。

时间: 2024-11-05 12:27:22

Activity和Service之间只相差了一个Window的相关文章

使用Messenger进行Activity与Service之间的相互通信

在Android开发中,有时候我们需要让一个Activity绑定一个Service,进行两者之间的通信.当Activity绑定成功以后,就可以调用Service中的public(或有对应可见级别)的方法.如果Service想把一些信息反馈给Activity,则需要将Activity的Listener传递给Service,由Service负责调用. 这样的做法是可以实现功能的,但有一些缺憾. 首先,Service需要把被调用的方法做成public的,不利于隐藏实现. 第二,调用显得凌乱,在Acti

activity 与 service 之间的通信

activity和service通信:通过binder 举个我实际项目中的例子:在service中下载更新应用 首先是下载更新apk的service: public class UpdateVersionService extends Service { private final String tag = "young"; private Context context = this; private BaseApplication application; private Down

window.open实现模式窗口(只弹出一个window.open)

父页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>父窗口</title> <script src="../Scri

Android基础笔记(十一)- Service基础和注意事项以及Activity与Service的通信

Service的基本概念 为什么要有Service Service的基本用法 电话窃听器的小案例 Service和Activity通信 Service和Thread的关系 向光明而行! Service的基本概念 Service是Android的四大组件之一,在每一个应用程序中都扮演者非常重要的角色. 它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候,我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 既然都是被用于处理耗时的操作,那么我们什么

android activity和service的交互介绍

android开发中,作为4大组件的service在开发中经常会使用到.很多时候,我们的activity和service之间需要进行相应的交互,activity需要调用service里面的方法实现某些功能,service需要调用activity的方法,实现界面更新等的交互. 实现2者之间相互交互的主要方式是:service中有个类部类继承Binder,然后提供一个公有方法,返回当前service的实例. activity通过bindService来开启一个service,service通过onB

Android Studio开发基础之启动Service,并通过从Activity向Service传递数据

本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Service,并敲如下代码: package com.example.lhb.startservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.view.ViewDebug; import android.widget.Toast; public

Android四大组件应用系列——Activity与Service交互实现APK下载

Servic与Activity相比它没有界面,主要是在后台执行一些任务,Service有两种启动方法startService()和bindService(),startService方式Service不可交互,可一直在后台即便应用结束,bindService方式可通过ServiceConnection获得运行的Service实例的方式实现Activity和Service之间的交互,通常Activity退出则绑定的服务也就取消了.我们可以通过同时执行启动服务和绑定服务的方式实现Service交互同

你与优秀源码之间只差一个 Star

fir.im Weekly - 你与优秀源码之间只差一个 Star 说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者心生向往.那么如何正确的使用 Github,也许是编程学习之必要.来看下@googdev 的 关于如何选择开源项目 ,如何正确使用开源项目,如何发现优秀的开源项目,同时作者还出了几篇从0开始学习 GitHub的系列文章,对于迫切需要成长的开发者会有所帮助. 本期fir.im Weekly 收集了不少好的

Activity与Service通信(不同进程之间)

使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处: 1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多 2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的.如果你的