package com.zzl.home; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.WindowManager; /** * Home键的屏蔽测试 * Zzl */ public class MainActivity extends Activity { private boolean flag = true;//true为屏蔽,false、为不屏蔽 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public void onAttachedToWindow() { if(flag) { this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } super.onAttachedToWindow(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME){ return true; } return super.onKeyDown(keyCode, event); } }
今天就学学有关makefile中有关变量的内容(这周偷懒偷懒, 内容比较少)。
1.变量的使用:
- 变量的命名规则:数字字母下划线,但是不应该含有“: # = ”或者空字符(空格、回车等)
- 变量的大小写敏感
- 变量在声明时需要付初值,在使用时需要在变量名前加上$符号,最好使用()或者{}将变量给包括起来。
- 如果需要使用真实的$,那么你需要使用$$表示
2.变量赋值(= := ?= =+)
- “=”:
左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,在右侧变量中不一定非要使用已定义好的值,其也可以使用后面定义的值。
eg
foo=$(bar)
bar=$(ugh)
ugh=Huh?
all:
echo $(foo)
当我们执行 make all 将会打印出变量$(foo)的值“Huh?”
- “:=”:
左侧是变量,右侧是变量的值,右侧变量的值只能定义在前面
eg
x:=foo
y:=$(x) bar
如果写成下面的样子:
y:=$(x) bar
x:=foo
那么y值只是 bar 而不是 foo bar
- ?=
FOO?=bar
其含义是:如果变量FOO没有被定义过,那么变量FOO的值就是bar,如果FOO定义过了,则这条语句什么都不做。等价于
ifeq($(origin FOO),undefined)
FOO=bar
endif
变量的值作为变量
eg
x=y
y=z
z=u
a:=$($($(x)))
过程如下:
$(x)值y
将y作为变量
$(y)值z
将z作为变量
$(z)值u
所以
S(a)的值为u
复杂一点的例子:
first_second=Hello
a=first
b=second
all=$($a_$b)
过程如下:
$a:first
$b:second
所以
$a_$b组成“first_second”
故$all值为Hello
- 追加变量
操作符:+=
eg.
objects=main.o foo.o bar.o
objects+=another.o
那么$(objects)值为:main.o foo.o bar.o another.o
等价于
objects=main.o foo.o bar.o
objects:=$(objects) another.o
注:
如果变量之前没有被定义过,则+=会自动变成=
本章来主要分析Service是如何绑定到Binder的
我们从activity调用bindService开始
Activity.bindService ->
ContextWrapper.bindService ->
ContextImpl.bindService ->
ActivityManagerNative.getDefault().bindService(ActivityManagerProxy)->
ActivityManagerService. bindService
requestServiceBindingLocked(r.app.thread.scheduleBindService)->
ActivityThread. scheduleBindService
下面简单介绍下ActivityManagerNative,ActivityManagerProxy,ActivityManagerService的关系。这个是通过aidl实现的跨进程通信的基本应用。如第二章例子里面的aidl的实现一样,ActivityManagerNative,ActivityManagerProxy是通过eclipse自动生成的类文件。ActivityManagerNative相当于Stub,ActivityManagerProxy相当于Proxy,ActivityManagerService相当于继承了Stub的MyBinder。所以一般bindService的调用方式是:getDefault()获取ActivityManagerProxy对象,然后调用ActivityManagerProxy的bindService,然后调用mRemote.transact,调到ActivityManagerNative的onTransact,它里面调用bindService调到ActivityManagerService的bindService。
操作:
1. 先从HashMap<IBinder, Service >:mServices里找出目的Service。如下指令:
Service s = mServices.get(data.token);
2. 执行了onBind()函数,得到myBinder对象。
IBinder binder = s.onBind(data.intent);
3. 在取得binder之后,通过ActivityManagerProxy的publishService方法
ActivityManagerNative.getDefault().publishService(data.token, data.intent, binder);
4. 在该方法内,会通过data.writeStrongBinder(JNI调用)操作C环境,创建myBinder相对的BBinderHolder对象,然后创建一个和java环境交互的BBinder对象。这样就在C环境搭建了一个和java环境交互的接口。下面就该在java环境创建另一个交互接口了。
5. 在ActivityManagerNative中data.readStrongBinder()函数中,在得到C环境的binder对象bpBinder时,会创建一个BinderProxy,并且将bpBinder赋值给BinderProxy的mObject。至此就完成了binder的绑定操作。
Binder整体结构如下图:
Service绑定binder如下图:
参考:http://blog.csdn.net/zhanghw0917/article/details/5629865