21 December 2014

小米12月第四周工作记录

12.21 IntentService 处理异步请求

这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候接着得到Intent对象通过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下载任务结束后服务自身就会结束退出

IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。

IntentService有以下特点:

(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4) 默认实现的onBind()返回null

(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中

1.服务不是单一的进程。服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中。

2.服务不是线程。可以在线程中工作。

一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。

同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。

二.如果任务占用CPU时间多,资源大的情况下,要使用线程。

关于Service

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i = new Intent(this, MyService.class);
this.startService(i);//Service的onCreate里面也有一个Log,但是会是下面一行Log先打印,这就是坤哥著名理论,单线程异步
                     //原理是startService都是丢消息到消息队列中
Log.d("CSM", "onCreate Over");
}

实时监听通讯录变化 静态广播 动态广播 ContentObserver


12.22

adb root

adb pull /data/data/com.android.providers.contacts/databases/contacts2.db contact2.db

将系统通讯录拉过来看看 使用 navicat sqlite版进行查看

<!-- 读取联系人权限 -->   
<uses-permission android:name="android.permission.READ_CONTACTS"/> 
<!-- 拨打电话权限 --> 
<uses-permission android:name="android.permission.CALL_PHONE"/> 

12.25

canvas clip剪切,能实现许多蒙层效果。但好像sdk版本太低不支持

Bitmap.createBitmap可以剪切图片


12.27

将view通过canvas转成bitmap

Bitmap b = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(b);
view.draw(canvas);

12.28

问题:切图计算不正确,为什么我ImageLoader进来是720*1280,而实际mBitmap的大小却是920*1632. 坐标系需要重新换算

使用merge标签时虽然许多属性IDE都不提示,但是都可以用,只要你自己确保包裹他的ViewGroup都支持这些属性即可


12.30

android:descendantFocusability=”blocksDescendants” 致使listview中的子控件无法获得焦点,list中item可以点击

设置listview不可点击,listview.setEnable(false),但会有listview难以滑动的问题, 可以在其Adapter中覆盖public boolean isEnable(int position)来设定这一行是否可以点击;

Button不可点击也是这么设置

ListView的数据源也要在main线程更新,然后调用notifiDataSetChange();


12.31

使用命令查看 Activity栈信息 adb shell dumpsys activity | grep mFocusedActivity



blog comments powered by Disqus