0、binder
客户端向服务端获取服务的引用的工具,在内核层
1、Bundle
在两个activity中跳转 ,使用 Intent即可达到从class A-〉class B;如果跳转的过程中要传递信息 可以使用 Bundle,Bundle可以创建键值对对象;使用put**()创建
使用get**()读取;
2、handler
接受子线程的数据,并用此数据配合主线程更新UI;
在主线程中不推荐执行耗时的操作
所以放在子线程中执行
但是执行完毕之后子线程要更新UI,Android中更新线程是不安全的机制;所以又得放回主线程进行更新UI;
handler机制出现了:
handler存在于主线程中,和子线程交流可以通过Message对象进行交互,子线程通过SendMessage发送Message传递有用的数据到主线程队列中
配合主线程进行更新UI;
handler的几个重要函数
(1)obtainMessage();通过此函数获取Message对象
(2)sendMessage();通过此函数发送Message对象
(3)Post();通过此函数把Runnable函数加入主线程队列
多线程handler搭建结构:
在主线程中创建一个 Handler对象,并且覆盖其handleMessage方法
在创建的工作线程中创建一个Message对象,设置其响应的属性
使用这个Handler对象把Message对象发送到主线程消息队列当中
主线程的Looper对象会不断监听消息队列里面的内容,如果消息队列有新的内容,就会拿到此消息,并交给发送此消息的handler对象处理
(0)Handler handler =new Handler(){
实现 handleMessage(msg){
To do...
handler.post(runnable)
}
}
(1)handler.post(runnable);//插入消息队列,通知主线程监听更新UI
(2)Runnable runnble=new Runnale(){
Message msg = handler.obtainMessage();
To do...to change msg
handler.sendMessage(msg);
}
此处链接一篇好文(图文并茂): http://blog.csdn.net/zh19900207/article/details/8580203
------------------------------------------积累的分割线------------------------------------------
如果没有调用start方法是不会建立新线程,这样就是在原有线程中直接调用run方法
1、匿名内部类:
形式:不显示声明子类继承接口,而采用借口对象直接new一个对象的形式
作用:使用借口对象来“直接”调用接口中声明的函数
举个例子:
interface A{
XXX fn(){};
}
class B{
A a = new A{
XXX fn(){}// 这就是内部类
}
}
XXX main{
a.fn();
}
----------------------------------------------积累的分割线-----------------------------------------
三种监听机制的实现:
(1)
ex1:
- playBtn.setOnClickListener(this);
- stopBtn.setOnClickListener(this);
- pauseBtn.setOnClickListener(this);
- exitBtn.setOnClickListener(this);
- closeBtn.setOnClickListener(this);
-
- }
-
- @Override
- public void onClick(View v) {
- int op = -1;
- intent = new Intent("com.homer.service.musicService");
-
- switch (v.getId()) {
- case R.id.play:
- op = 1;
- break;
- case R.id.stop:
- op = 2;
- break;
- case R.id.pause:
- op = 3;
- break;
- case R.id.close:
- this.finish();
- break;
- case R.id.exit:
- op = 4;
- stopService(intent);
- this.finish();
- break;
- }
-
- Bundle bundle = new Bundle();
- bundle.putInt("op", op);
- intent.putExtras(bundle);
-
- startService(intent);
- }
ex2:
- btnPlayUrl = (Button) this.findViewById(R.id.btnPlayUrl);
- btnPlayUrl.setOnClickListener(new ClickEvent());
-
- btnPause = (Button) this.findViewById(R.id.btnPause);
- btnPause.setOnClickListener(new ClickEvent());
-
- btnStop = (Button) this.findViewById(R.id.btnStop);
- btnStop.setOnClickListener(new ClickEvent());
-
- skbProgress = (SeekBar) this.findViewById(R.id.skbProgress);
- skbProgress.setOnSeekBarChangeListener(new SeekBarChangeEvent());
- player = new Player(surfaceView, skbProgress);
-
- }
-
- class ClickEvent implements OnClickListener {
-
- @Override
- public void onClick(View arg0) {
- if (arg0 == btnPause) {
- player.pause();
- } else if (arg0 == btnPlayUrl) {
- String url="http://daily3gp.com/vids/family_guy_penis_car.3gp";
- player.playUrl(url);
- } else if (arg0 == btnStop) {
- player.stop();
- }
-
- }
- }
-
- class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {
- int progress;
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
-
- this.progress = progress * player.mediaPlayer.getDuration()
- / seekBar.getMax();
- }
-
ex3:在ex1的this中直接new 接口,然后在接口的函数体内直接实现onClick