1 | v.setDrawingCacheEnabled(true); |
1 | mTextureView.getBitmap(); |
压缩成适配目标宽、高的Bitmap
1 | /** |
从Bitmap到byte[]
1 | int bytes = bmp.getByteCount(); |
从byte[]到Bitmap
1 | Bitmap stitchBmp = Bitmap.createBitmap(width, height, type); |
这是一个对之前写的脚本的记录档案,自己也看不太懂当时的写法了,羞愧。用一个 repo 放这些脚本代码感觉有些浪费,干脆整个文章记录曾经的那段历史吧!
这代码的主要目的就是想少敲点命令,一步到位,做一个快男!
Android run script tools for debugging system apps or frameworks. This was used by myself when debugging system apps or frameworks. In this project, module names was not given to avoid the project name, but the main structure was reminded.
此脚本主要分成一个入口与两个模块,详细的树状图如下:
1 | . |
名字叫 btool
,为啥起这个怪名字,我也不知道。
1 | !/bin/bash |
初始化:init.sh
1 | !/bin/bash |
打印带颜色的字符:printOperationTip.sh
1 | !/bin/bash |
模块未完成的告警提示:tipWhenNotImplement.sh
1 | /bin/bash |
参数错误提示:tipWhenParametersError.sh
1 | /bin/bash |
处理特定任务:handleSpecificTask.sh
1 | !/bin/bash |
Android Framework 处理:handleFramework.sh
1 | !/bin/bash |
桌面时钟:handleXxxx.sh
1 | /bin/bash |
多媒体应用:handleXxxxxx.sh
1 | !/bin/bash |
目前这些脚本对我来说,已无实际用途,不能保证准确性,只是做一个纪念,纪念那段无知却在挣扎的时光。
本文主要记录在做 ProjectA 时用到的 Python 脚本,因为用得频繁,所以做成了脚本,避免重复输命令。
项目树状结构图如下:
1 | . |
它主要的功能是:
1 | import CommonTips |
1 | tip_arg_error = '''-------------------------- |
1 | import os |
1 | # -*- coding:utf-8 -*- |
1 | import os |
Maven可以帮你搞定一些项目上的包依赖,与Android Studio中的Gradle有点类似,当然也有很大的不一样。目前认识还是有点粗浅,期待后续的深入。
虽然MyEclipse上面也集成了Maven,但是版本比官网上的低一些。从官网上面下载最新的软件包,找个合适的位置解压,然后在环境变量中加入所解压目录下的bin目录。
具体的配置方式,视不同的Shell
,修改不同的配置文件。再此处为zsh
,修改了~/.zshrc
的内容如下:
检查配置是否成功
还需要修改conf目录下的setting.xml
文件的localRepository
的路径。从注释我们可以看到,如果不设置的话,默认是在~/.m2/repository
目录下。该目录的主要功能就是存放Maven从仓库里面下下来的包。
接下来在MyEclipse中集成我们下载后解压的Maven。打开Preference
,依次选择Maven
中的Installations
与User Settings
,添加Maven的路径以及配置文件后如下:
到此基本配置完成。
看网上的博客,创建Maven项目的方式有很多,尚不清楚它们会不会有什么差异。不过能达到使用Maven的功能就没差了吧。
第一次创建Maven项目时,它从服务器上面下载jar包会花费很长的时间,请耐心等待
感觉这种方法流程较简单。创建流程如下:
New一个Web Project
,然后勾上Add Maven Support
选项
重复选择下一步,直到出现Maven的相关设置。这里被建议选择Standard Maven JEE project structure
。其实就是项目的目录结构不一样。之后,选择到Finish即可完成创建。
创建后如下,但是请注意啊,这已经是第二次创建了。所以再重复一下:
第一次创建Maven项目时,它从服务器上面下载jar包会花费很长的时间,请耐心等待
选择创建一个Maven Project
选择创建
后续按实际需求填写即可
在该项目的pom.xml
中添加依赖信息,然后点击Build Project
,Maven就会把相关的依赖信息都找齐到本项目中。
看过好几回了,但是还是好像每次都忘,可能是用得少,但是工作中看的一些源代码中用的太多了,可是每次用的时候都看一遍,有点浪费时间,还是自己做一个简单的总结,这样可能以后会快一些。
这篇在草稿箱里实在是存太久了。。。
启动型
通过调用startService()
启动,一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
绑定型
通过调用bindService()
绑定到服务,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行; 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。
因为其分两类,所以它的生命周期也有两种:
左边为启动型, 右边为绑定型.
android:exported
: 顾名思义,是否可以被导出,即是否可以被绑定用做服务端. false
:确保服务仅适用于您的应用.true
: 与false相反.请始终使用显式 Intent 启动或绑定 Service,且不要为服务声明 Intent 过滤器。
Service
若使用这种方法,则需要注意一个问题,那就是**Service
默认的线程是主线程**, 不要在其中做耗时的事情.
IntentService
使用这种方法, 就不需要担心线程的问题.因为其做为一个对Service
的简单封装,它内部已经将所有的事件都放在了子线程中.不妨对其做一个简单的分析来加深对Service
的理解.
1 |
|
在其onCreate()
中,将开启一个初始化好Looper
的子线程. 并为这个Looper
的消息队列添加一个Handler
.
1 | //IntentService.java |
其中的Handler
用来处理在这个子线程中的事务,其中的onHandleIntent()
正是我们在继承IntentService
时所需要实现的一个方法, 也就是说我们在其中写的方法都是在子线程中执行.
1 |
|
onStart()
并没有太大的意义,只是一个普通的函数,重要的是它里面做的事情。它将从onStartCommand()
里面得到的intent,通过message传递给handler,然后再是自己,对不同intent的处理。
对onStartCommand()
的返回值,有下面三种:
START_NOT_STICKY
START_STICKY
START_REDELIVER_INTENT
启动服务必须管理自己的生命周期。也就是说,除非系统必须回收内存资源,否则系统不会停止或销毁服务,而且服务在 onStartCommand() 返回后会继续运行。
因此,服务必须通过调用stopSelf()
自行停止运行,或者由另一个组件通过调用 stopService()
来停止它。一旦请求使用 stopSelf() 或 stopService() 停止服务,系统就会尽快销毁服务。
http://blog.csdn.net/baidu_31405631/article/details/52469093
对于此种类型的,感觉自己用得到的地方并不是很多,但是要能够看得懂这这种类型的Service的代码,尤其是AIDL,在Android中非常常见。
AIDL的大致使用步骤如下:
何为代理模式?代理,顾名思义可联想到代理人,代理人是干啥子的,帮别人做某件事的,且可能会根据一些具体的情况,做一些具体的处理。大概如此吧。
它提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。代理对象是对目标对象的扩展,并会调用目标对象。
好处:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
简而言之,就是代理对象与被代理对象都实现同一接口,在代理对象中,调用被代理对象的相应方法,并加上一些自定义的其它操作,要使用被代理对象的方法时,只需要调用代理对象的相应方法即可。
缺点:如果增加接口中的方法,那么代理对象以及被代理对象都需要进行相应的修改,难以维护。
不需要实现接口,利用JDK的API,在内存中动态地创建代理对象。代理对象不需要实现接口,但是被代理对象一定要实现接口,否则不能用动态代理。
代理类所在包:java.lang.reflect.Proxy
JDK实现代理只需要使用newProxyInstance
方法,但是该方法需要接收三个参数,完整的写法是:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
其中三个参数的含义依次为:
ClassLoader loader,
:指定当前目标对象使用类加载器,获取加载器的方法是固定的Class<?>[] interfaces,
:目标对象实现的接口的类型,使用泛型方式确认类型InvocationHandler h
:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入代码示例:
接口类IUserDao.java以及接口实现类,目标对象UserDao是一样的,没有做修改.在这个基础上,增加一个代理工厂类(ProxyFactory.java),将代理类写在这个地方,然后在测试类(需要使用到代理的代码)中先建立目标对象和代理对象的联系,然后代用代理对象的中同名方法
代理工厂类:ProxyFactory.java
1 | /** |
测试类:App.java
1 | /** |
其实对于上面的写法,有一个小小的疑问,如果接口中存在多个函数,那么这种做法是会为很一个函数都执行相同的附加操作,如果对每个函数做不同的操作呢?利用Method
的属性加以区别,然后对每个函数做分别处理?这样处理可以不。。
看到了ButterKnife
之后,感觉它实在是太棒了,可以省略掉一大堆无趣的findViewById()
,整个代码看起来都舒服多了。这篇使用说明来自它的官方网站的简易介绍,用起来非常简单,但是也是有挺多的情况,所以还是觉得自己翻译出来,方便以后查阅吧!
使用@BindView
和ID
注解相应的变量,ButterKnife
就会在你的layout
文件中找到所对应的View
并赋值给它。
1 | class ExampleActivity extends Activity { |
上面例子中,所生成的代码大致与下面代码等同:
1 | public void bind(ExampleActivity activity) { |
使用@BindBool
, @BindColor
, @BindDimen
, @BindDrawable
, @BindInt
, @BindString
与一个对应的ID
来绑定定义好的资源,
1 | class ExampleActivity extends Activity { |
我们还可以在已知View
的情况下,在任意的对象中,绑定该View
中所含有的控件。比如在Fragment
中:
1 | public class FancyFragment extends Fragment { |
另外一个是在ViewHolder
中:
1 | public class MyAdapter extends BaseAdapter { |
可使用Activity
当做一个根View
可以绑定任何对象。如果你使用了MVC
模式,你可以使用ButterKnife.bind(this, activity)
来绑定Controller
。
可使用ButterKnife.bind(this)
来绑定一个View
里面的子View
。如果你在layout
文件中使用了<merge>
标签并且在View
的构造器中填充,你可以在这之后立马调用它。或者,你也可以在onFinishInflate()
回调中调用。
将所需要的控件,全部填充到一个List
中。
1 |
|
apply()
方法可以对List
中所有的View
执行某个操作。
1 | ButterKnife.apply(nameViews, DISABLE); |
可以指定一些简单的动作。
1 | static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() { |
当然也可以在apply()
方法中指定一个Android
中控件的属性名。
ButterKnife.apply(nameViews, View.ALPHA, 0.0f);
监听器也可以自动配置到相应的View
上。
1 |
|
监听器函数的参数都是可选的。
1 |
|
指定一个确定的类型,它将会被自动转换成之。
1 |
|
还可以为将一个监听器函数,绑定到多个控件上。
1 |
|
自定义View
时,绑定自己的监听器函数不需要设置ID
。
1 | public class FancyButton extends Button { |
Fragment
和Activity
的生命周期不同。当在Fragment
的onCreateView()
中使用了绑定,就需要在onDestroyView()
中将变量置为null
。ButterKnife
在调用绑定时会返回一个Unbinder
的实例,在适当的生命周期回调中,调用这个实例的unbind()
方法。
1 | public class FancyFragment extends Fragment { |
通常@Bind
和监听器绑定都是必须的。如果在目标View
中为找到相应ID
的控件,则会抛出异常。
为了抑制住这中异常,创建一个可选的绑定,可以使用@Nullable
或@Optional
来注解变量或方法。
注 : 可使用任何名为@Nullable
的注解来注解变量,但推荐Android support-annotations
中的@Nullable
。
1 | TextView mightNotBeThere; |
可在注解中加入参数来区分。
1 |
|
1 | compile 'com.jakewharton:butterknife:(insert latest version)' |