libstreaming局域网构建Android相机实时流媒体流程分析
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 |
目前这些脚本对我来说,已无实际用途,不能保证准确性,只是做一个纪念,纪念那段无知却在挣扎的时光。
看过好几回了,但是还是好像每次都忘,可能是用得少,但是工作中看的一些源代码中用的太多了,可是每次用的时候都看一遍,有点浪费时间,还是自己做一个简单的总结,这样可能以后会快一些。
这篇在草稿箱里实在是存太久了。。。
启动型
通过调用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的大致使用步骤如下:
看到了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)' |