小小技术点

1.如何用TextView显示Html格式的数据

textView.setText(Html.fromHtml("<font size=\"3\" color=\"red\">你吃了吗?</font><font size=\"3\" color=\"green\">吃了</font>"));


2.基于HTTP协议的推送机制

一般分为定期轮询长期轮询

定期轮询:这种方式是使客户端每隔固定时间向服务器端以post方式发出HTTP请求。在一次请求的开始,客户端询问服务器是否存在需要推送的消息,服务器端收到请求并处理,随后向客户端响应处理结果,这样一次请求就结束了。一段固定时间后,客户端将再次向服务器端发出询问请求并等待服务器端的返回结果。
长期轮询:这种方式是服务器端在接收到客户端向其发出的请求时将请求挂起,直到该连接请求出现异常、超时、或者需要推送消息时再处理该请求,并向客户端返回响应,客户端接收到响应后会立即再向服务器端请求连接。这样就使得服务器与客户端之间的连接始终未中断,比客户端定期轮询的方式具有更好的实时性。

基于HTTP协议的推送机制实际上并不是真正的推送,而是依赖客户端请求-服务器端响应的模式。虽然该机制的实现简单快速且可控性强,但推送具有延迟性,实时性差。另外,虽然其中长轮询形式的推送具有一定的实时性,但是服务器端需要管理大量挂起的请求,会造成服务器端资源消耗,同时由于HTTP协议是无状态的,服务器端不能监控客户端的在线离线状态,因此就不能判断推送的消息能否达到客户端。

3.Android 广播机制

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:

1.同一app内部的同一组件内的消息通信(单个或多个线程之间);

2.同一app内部的不同组件之间的消息通信(单个进程);

3.同一app具有多个进程的不同组件之间的消息通信;

4.不同app之间的组件之间消息通信;

5.Android系统在特定情况下与App之间的消息通信。

从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:

1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;

2.广播发送者通过binder机制向AMS发送广播;

3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;

4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

 对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同。但总体流程大致如上。

由此看来,广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底是何时才能接收到。

4.Android 内存回收机制

从 Application Framework 和 Linux kernel 两个层次分析 Android 操作系统的资源管理机制。

Android 之所以采用特殊的资源管理机制,原因在于其设计之初就是面向移动终端,所有可用的内存仅限于系统 RAM,必须针对这种限制设计相应的优化方案。当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”。从而使得用户调用程序时能够在第一时间得到响应。当系统内存不足时,系统将激活内存回收过程。为了不因 内存回收影响用户体验(如杀死当前的活动进程),Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级(由高到低):

  IMPORTANCE_FOREGROUND:前台进程,目前正在屏幕上显示的进程和一些系统进程。
  IMPORTANCE_VISIBLE:可见进程,可见进程是一些不再前台,但用户依然可见的进程,比如输入法、天气、时钟等。
  IMPORTANCE_SERVICE:服务进程,拨号、邮件存储之类的。
  IMPORTANCE_BACKGROUND:后台进程,启动后被切换到后台的进程。
  IMPORTANCE_EMPTY:没有任何东西在内运行的进程(空进程),有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是  提高该程序下次的启动速度或者记录程序的一些历史信息。

5.Android 添加一个自定义字体

使用自定义字体
android Typeface使用ttf格式的字体文件设置字体

我们可以在程序中放入ttf字体文件,在程序中使用Typeface设置字体。

第一步,在assets目录下新建fonts目录,把ttf字体文件放到这。

第二步,程序中调用:

Typeface tf=Typeface.createFromAsset(getAssets(), "fonts/xxx.ttf");//根据路径得到Typeface
tv.setTypeface(tf);//设置字体
但是在很多TextView、Button等文本组件的情况下,我敢肯定你不会喜欢这个方法的

解决办法:

你可以为每个文本组件创建一个子类,如TextView、Button等,然后在构造函数中加载自定义字体。

public class BrandTextView extends TextView {

      public BrandTextView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
      }
     public BrandTextView(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
     public BrandTextView(Context context) {
          super(context);
     }
     public void setTypeface(Typeface tf, int style) {
           if (style == Typeface.BOLD) {
                super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/xxx_Bold.ttf"));
            } else {
               super.setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/xxx.ttf"));
            }
      }
 }


然后只需要将标准的文本控件替换成你自定义的就可以了(例如BrandTextView替换TextView)。


<com.your.package.BrandTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="View with custom font"/>
<com.your.package.BrandTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textStyle="bold"
         android:text="View with custom font and bold typeface"/>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值