Binders 与 Window Tokens(窗体令牌)
原文地址:http://www.androiddesignpatterns.com/2013/07/binders-window-tokens.html
Binder 令牌(Tokens)
- 同一个进程中指向一个Binder对象的虚拟内存地址,或
- 一个唯一的32位句柄(由Binder内核驱动分配的)指向不同进程中Binder的虚拟内存地址.
/**
* An example activity that acquires a wake lock in onCreate()
* and releases it in onDestroy().
*/
public class MyActivity extends Activity {
private PowerManager.WakeLock wakeLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wakeLock.acquire();
}
@Override
protected void onDestroy() {
super.onDestroy();
wakeLock.release();
}
}
/**
* The interface that applications use to talk to the global power manager
* system service.
*
* @see frameworks/base/core/java/android/os/PowerManager.java
*/
public final class PowerManager {
// Our handle on the global power manager service.
private final IPowerManager mService;
public WakeLock newWakeLock(int levelAndFlags, String tag) {
return new WakeLock(levelAndFlags, tag);
}
public final class WakeLock {
private final IBinder mToken;
private final int mFlags;
private final String mTag;
WakeLock(int flags, String tag) {
// Create a token that uniquely identifies this wake lock.
mToken = new Binder();
mFlags = flags;
mTag = tag;
}
public void acquire() {
// Send the power manager service a request to acquire a wake
// lock for the application. Include the token as part of the
// request so that the power manager service can validate the
// application's identity when it requests to release the wake
// lock later on.
mService.acquireWakeLock(mToken, mFlags, mTag);
}
public void release() {
// Send the power manager service a request to release the
// wake lock associated with 'mToken'.
mService.releaseWakeLock(mToken);
}
}
}
- client程序在onCreate()中请求了PowerManager类的一个实例.PowerManager类提供给client程序一个与执行在系统服务进程中的负责设备电源状态(比如决定屏幕亮度,检查设备是否插入dock等)的全局PowerManagerService对话的接口.
- client程序在onCreate()中创建并获得了一个唤醒锁(wake lock).PowerManager发送了一个WakeLock的创建的唯一的Binder令牌作为acquire()请求的參数.当PowerManagerService接收到了请求,它将接收到的令牌安全的保存起来,并强制设备保持唤醒状态,直到...
- 客户程序在onDestroy()中释放了唤醒锁.PowerManager发送了WakeLock创建的唯一的Binder令牌作为请求的參数.当PowerManagerService接收到请求,它将这个令牌与它保存的全部令牌进行比較,假设发现同样的就释放唤醒锁.这额外的一步"确认步骤"是保证PowerManagerService不会被别的应用程序欺骗而释放唤醒锁的重要安全措施.
token)了,接下来我们来讨论它.
窗体令牌(Window Tokens)
权限的程序,即"在其它程序界面上绘制"权限,对此规则是个例外.Facebook Messenger和DicePlayer是两个经常使用的需求这个权限的程序,而且用此在后台服务中在其它程序的界面上加入窗体).假设令牌不匹配,窗体管理器拒绝请求并抛出一个BadTokenException,假设没有了窗体令牌,这必要的身份建议步骤就不可能实现,窗体管理器就没办法防止防止恶意程序了.
- 当一个应用程序第一次启动,ActivityMangerService(这是一个全局系统服务,执行于系统服务进程中,负责启动和管理新的组件,比如Activities和Services,同一时候它还涉及维护OOM调整,被用于内核低内存时的处理,权限,任务管理等)创建了一个特殊的窗体令牌称之为应用程序窗体令牌(application window token),它唯一地标识应用程序顶层容器的窗体(你能够通过调用getApplicationWindowToken()获得一个引用).Activity管理器将这个令牌同一时候传给应用程序和窗体管理器,然后每次应用程序想要加入窗体的时候都要向窗体管理器传入这个令牌.这确保了应用程序与窗体管理器的安全交互(由于使得别的程序不可能向顶层加入窗体),同一时候也让Activity管理器向窗体管理器直接发送请求变得更简单.比如,Activity管理器能够说,"隐藏这个令牌的全部窗体",然后窗体管理器就能正确的选择出须要关闭的窗体了.
- 实现自己定制桌面程序(Launchers)的开发人员能够与动态壁纸窗体交互,通过调用sendWallpaperCommand(IBinder
windowToken, String action, int x, int y, int z, Bundle extras)使之直接位于后面.为了确保除了桌面没有别的应用程序可以与动态壁纸交互,framework须要开发人员传入一个窗体令牌作为该方法的第一个參数.假设窗体令牌与当前位于壁纸前的Activity的窗体不匹配,这条命令将被忽略而且打印出一条警告. - 应用程序能通过调用hideSoftInputFromWindow(IBinder windowToken, int flags)方法请求InputMethodManager隐藏软键盘,可是必须提供一个窗体令牌作为參数,假设令牌不匹配当前接受输入的窗体令牌,InputMethodManager会拒绝请求,这确保恶意程序无法强制关闭由其它程序打开的软键盘.
- 手动加入新窗体到屏幕上的应用程序(比如,使用addView(View,WindowManager.LayoutParams)方法)可能须要通过设置WindowManager.LayoutParams.token属性来指定他们应用程序的窗体令牌.一般正常的程序都不太会这样做,由于在使用getWindowManager()方法时返回的WindowManager对象已经自己主动为你设置好了令牌值.也就是说,假设在以后你遇到须要从后台服务向屏幕加入一个窗体这样的情况时,你要知道你应该手动设置你程序的窗体令牌才干成功.
总结
Binders 与 Window Tokens(窗体令牌)的更多相关文章
- 【转载】Layered Window(分层窗体,透明窗体)
本文转载自花间醉卧<Layered Window(分层窗体,透明窗体)> //为窗体添加WS_EX_LAYERED属性,该属性使窗体支持透明 ModifyStyleEx(0, WS_EX_ ...
- WmS具体解释(二)之怎样理解Window和窗体的关系?基于Android7.0源代码
上篇博客(WmS具体解释(一)之token究竟是什么?基于Android7.0源代码)中我们简要介绍了token的作用,这里涉及到的概念非常多,当中出现频率最高的要数Window和窗体这一对搭档了,那 ...
- SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
这一章主要是介绍 窗体中的 Aggregate 函数, Rank 函数, Distribution 函数以及 Offset 函数. Window Aggregate 函数 Window Aggrega ...
- 信頼済みサイト对window.open窗体大小影响原因之一
如果某站点被添加进去之后,这个站点窗体限制被决定了,window.open里面,status bar 无效的设置不再起作用.而且,如果原来status bar被 任务栏挡住的话,这个时候它就会被显示出 ...
- SQL Server Window Function 窗体函数读书笔记一 - SQL Windowing
SQL Server 窗体函数主要用来处理由 OVER 子句定义的行集, 主要用来分析和处理 Running totals Moving averages Gaps and islands 先看一个简 ...
- 浏览器根对象window之窗体和工具条
1. 窗体和工具条 1.1 窗体 frames.self.window.parent.top.opener. frames 数组类型,页面中iframe的引用,如果页面有2个iframe,则frame ...
- Qt :非window子窗体的透明度设置
✿问题的由来 心血来潮,想利用QTimer 配合 setWindowOpacity()方法来实现一个窗体淡入的效果. ✿实验代码 粗糙的实验代码: void Widge ...
- Android应用程序窗体设计框架介绍
在Android系统中,一个Activity相应一个应用程序窗体.不论什么一个Activity的启动都是由AMS服务和应用程序进程相互配合来完毕的.AMS服务统一调度系统中全部进程的Activity启 ...
- window的对象有哪些(笔记)
window的主对象主要有如下几个: document 对象: frames 对象: history 对象: location 对象: navigator 对象: screen 对象: 全局变量和函数 ...
随机推荐
- 【手打】LZW编码的C/C++实现
LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩. LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期. 本代码只完毕了LZW的编码与解码算法功能 ...
- poj2533--Longest Ordered Subsequence(dp:最长上升子序列)
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33943 Acc ...
- android Context的理解
很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释: Context字面意思上下文,位于framework ...
- 集合简单总结 ArrayList、List、Hashtable、Dictionary
============================ 集合综述 ============================== 1.什么是泛型: 泛型就是限制了操作类型,意思如下: ...
- 【虚拟化实战】容灾设计之一VR vs SRM
作者:范军 (Frank Fan) 新浪微博:@frankfan7 从本文开始,我们将介绍一系列的关于容灾的解决方案.先探讨应用的场景,然后再深入介绍技术架构. 情景一: 某小型公司的虚拟化环境中,在 ...
- Android - Animation 贝塞尔曲线之美
概述 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算 ...
- Qt 中文乱码解决大全
源地址:http://blog.csdn.net/xcy2011sky/article/details/7168376 解决中文乱码,最好知道乱码是什么格式比如说:utf-8. 解决方案: 1.让整个 ...
- delphi与汇编
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...
- 基于visual Studio2013解决C语言竞赛题之1052求根
题目 解决代码及点评 /* 功能:用简单迭代法解方程 e^x - x - 2 = 0 它有两个根(如图),其迭代公式为: 1) x[n+1]= e^x*n-2 (初值X<0时) ...
- Python写入文件,但是发现文件为空,竟然未写入!
问题描述: fw=open(r'C:\test.txt','w') s="Hello World!" fw.write(s) ========== 此时查看C盘根目录,发现test ...