A. android的handler机制的原理
Android的handler机制的原理分为异步通信准备,消息发送,消息循环,消息处理。
1、异步通信准备
在主线程中创建处理器对象(Looper)、消息队列对象(Message Queue)和Handler对象。
2、消息入队
工作线程通过Handler发送消息(Message) 到消息队列(Message Queue)中。
3、消息循环
消息出队: Looper循环取出消息队列(Message Queue) 中的的消息(Message)。
消息分发: Looper将取出的消息 (Message) 发送给创建该消息的处理者(Handler)。
4、消息处理
处理者(Handler) 接收处理器(Looper) 发送过来的消息(Message),根据消息(Message) 进行U操作。
handler的作用
handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。
Handler的运行需要底层的 messagequeue和 looper做支撑。
B. 怎么利用android的Handler和message机制实现view中发送消息来实现view页面跳转
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0){
//界面跳转代码。。。。。
}
};
};
view 的事件 {
.....
Message msg = new Message();
msg.what = 0; (值随意定义,和handlemessage 匹配就可以)
msg.obj = "";//(传递的参数, 可不加)
handler.sendMessage(msg);
}
C. Android 异步消息处理机制的几种实现
public class Calcul { public static void main(String[] args) { circularArea(); } public static void circularArea(){ int r=2; float π=3.14f; float circularArea = π*r*r; System.out.println(circularArea); }
D. 请简述什么是android事件处理,并分析两种android事件处理机制的实现过程和区别
UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。
对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事件监听器;对于基于回调的事件处理而言,主要做法是重写Android组件特定的回调函数,Android大部分界面组件都提供了事件响应的回调函数,我们主要重写它们就行。
一 基于监听器的事件处理
相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象:
1)事件源Event Source:产生事件的来源,通常是各种组件,如按钮,窗口等。
2)事件Event:事件封装了界面组件上发生的特定事件的具体信息,如果监听器需要获取界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。
3)事件监听器Event Listener:负责监听事件源发生的事件,并对不同的事件做相应的处理。
基于监听器的事件处理机制是一种委派式Delegation的事件处理方式,事件源将整个事件委托给事件监听器,由监听器对事件进行响应处理。这种处理方式将事件源和事件监听器分离,有利于提供程序的可维护性。
举例:
View类中的OnLongClickListener监听器定义如下:(不需要传递事件)
[java] view plainprint?
public interface OnLongClickListener {
boolean onLongClick(View v);
}
public interface OnLongClickListener {
boolean onLongClick(View v);
}
View类中的OnLongClickListener监听器定义如下:(需要传递事件MotionEvent)
[java] view plainprint?
public interface OnTouchListener {
boolean onTouch(View v, MotionEvent event);
}
public interface OnTouchListener {
boolean onTouch(View v, MotionEvent event);
}
二 基于回调的事件处理
相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写Override组件类的事件处理函数实现事件的处理。
举例:
View类实现了KeyEvent.Callback接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义View来实现,自定义View时重写这些事件处理方法即可。
[java] view plainprint?
public interface Callback {
// 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于
// 标识该处理函数是否能完全处理该事件
// 返回true,表明该函数已完全处理该事件,该事件不会传播出去
// 返回false,表明该函数未完全处理该事件,该事件会传播出去
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyLongPress(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
}
public interface Callback {
// 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于
// 标识该处理函数是否能完全处理该事件
// 返回true,表明该函数已完全处理该事件,该事件不会传播出去
// 返回false,表明该函数未完全处理该事件,该事件会传播出去
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyLongPress(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
}
三 比对
基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现;
Android的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发;
某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。
四 基于自定义监听器的事件处理流程
在实际项目开发中,我们经常需要自定义监听器来实现自定义业务流程的处理,而且一般都不是基于GUI界面作为事件源的。这里以常见的app自动更新为例进行说明,在自动更新过程中,会存在两个状态:下载中和下载完成,而我们的程序需要在这两个状态做不同的事情,“下载中”需要在UI界面上实时显示软件包下载的进度,“下载完成”后,取消进度条的显示。这里进行一个模拟,重点在说明自定义监听器的事件处理流程。
4.1)定义事件监听器如下:
E. Android QQ消息实时接收机制
QQ的消息推送就是后台开启一个推送服务,这个服务会常驻内存,并且会不定时的发送心跳包来保持连接,像tcp传输一样,传输的协议qq用的是XMPP协议,基于XML解析的。主要是加了些消息检验、出错机制等,如果像自己了解推送的详细内容,可以去看看A...
F. android 状态栏接收通知,然后点击通知进入app,这个机制是怎么做到
1.添加软件部分推送程序(模块)到系统服务
2.推送模块常驻系统后台,只能把整个应用完全停止才会没有,这也是有的安卓机很卡的原因,应用里面自己写,也可以通过其他软件链式唤醒
3.平台统一推送服务,好比小米ov那个啥
4.点击进入的那个应用,多数是厂商作了专门适配的,进入特定页面,但这个也是可以通过代码实现的
G. Android中消息推送有哪几种方式
Android中消息推送有如下几种方式:H. 安卓 View层 和 Activity层 消息传递机制和焦点问题
其实是activity派送出来的事件,不是无人知晓。而是这种问题不容易弄出一个关键字来搜索。
一个activity的touch事件先由activity的dispatchtouchevent来处理,负责派送。
dispatchtouchevent把ACTION_DOWN事件首先交给view,然后view返回false再传递回activity的onTouchEvent中处理。
具体的部分代码如下:
if(ev.getAction()==MotionEvent.ACTION_DOWN){
onUserInteraction();
}
如果用户需要这个ACTION_DOWN,应该在自身的onTouchEvent中对 ACTION_DOWN采取return true的响应,表示这个ACTION_DOWN归我了。只有在dispatchtouchevent为ACTION_DOWN事件找到一个归属,也即是target之后,后面的ACTION_MOVE和ACTION_UP才会对这个target传送。
如果你这个页面就仅仅有一个这样需要捕捉事件的view,你是可以直接在dispatchtouchevent中直接传送给这个view然后return true的。
I. Android中轮询机制是怎么用的
这里使用service。
后台service进行定时的轮询,如果有新消息,获取后推送给自己的页面。