android service 整理
项目经常要跟别的项目进行交互,比如说蓝牙打印机等,或者处理一些网络状态,或者调用baidu、高德等地图的时候就会用到,
或打开了音乐播放之后,便想去看看图片,或者下载文件的时候,我们看看博客。
Service有两种类型:
- 本地服务(Local Service):用于应用程序内部
- 远程服务(Remote Sercie):用于android系统的应用程序之间 RPC 这种方式跟Windows RPC一样
以下是Service处理的执行事件及流程图:
1) 本地服务只是处理一些业务,不跟Activity进行交互,这种情况我们只需要使用startService及stopService即可。
在使用的之前调用如下代码:
Intent i = new Intent("abc.cdf.xxxx"); Bundle bundle = new Bundle(); bundle.putInt("aa", 11); i.putExtras(bundle); startService(i);
方法说明:startService(Intent intent)
在退出或者结束的时候,调用stopService即可
stopService(i);
方法说明:stopService(Intent intent)
2) 本地服务需要与Activity进行交互,那么我们就要使用bindService及unbindService
Intent i = new Intent("abc.bdf.xxxx"); bindService(i, connection, Context.BIND_AUTO_CREATE);
unbindService(connection);
方法说明:
boolean bindService(Intent service, ServiceConnection conn, int flags)
void unbindService(ServiceConnection conn)
3) 远程服务(remote),不在一个应用中,也是使用bindService及unbindService
接口描述语言(AIDL)来定义远程服务的接口, 新建aidl文件,系统会自动生成aidl对应的.java文件
事例下载地址1,转自 http://yangguangfu.iteye.com/blog/699306
事件中几点说明:
图示1:
<service android:name=".receiverservice.BindMusicPlayerService" >
<intent-filter>
<action android:name="com.yang.bindMusic22" />
</intent-filter>
</service>
11.其中android:name这个是指的类,系统会根据默认的包,找到对应的java文件,
android:name=".receiverservice.BindMusicPlayerService这个系统找到com.yang.main.receiverservice.BindMusicPlayerService。
如果你写成android:name="receiverservice.BindMusicPlayerService"那么系统会到com.yang.mainreceiverservice.BindMusicPlayerService找文件,
然后系统就会直接Crashed
12. <action android:name="com.yang.bindMusic22" />
这里的action的name是你自已指定的名称,这个一般会用上你的包,保持唯一即可,假如这里是com.yang.bindMusic22那么
你在代码中调用service的时候,也要跟这个一样即可,
这里再引用二文,说的也挺详细:
http://www.cnblogs.com/yejiurui/p/3429451.html
http://blog.csdn.net/xiaanming/article/details/9750689
http://blog.csdn.net/ryantang03/article/details/8683921 广播的方式
在Service中处理业务,并且将结果发送广播,然后在Activity的注册广播接收器,接收到广播之后更新UI
这种方式只要注册接收器的都可以接收到广播信息。
以下是对http://blog.csdn.net/ryantang03/article/details/8683921事例的解析:
1)静态
// 静态注册 this.findViewById(R.id.btn1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //在Servie中处理,3s后弹出对话框 Intent serviceIntent = new Intent("com.ryan.service"); startService(serviceIntent); } });
startService开启了一个Service,对应的action是com.ryan.service,我们按下图找到对应的Service
是com.ryan.testserviceandbroadcastreceiver.MainService.java
开启一个Service要执行onCreate,onStartCommond
@Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); new Thread(new Runnable() { @Override public void run() { try { //To do something... Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(0); } }).start(); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //Send broadcast Intent boradcastIntent = new Intent(MainBroadcastReceiver.RECEIVER); sendBroadcast(boradcastIntent); } };
onStart里面又执行了handlerMessage,sendBroadcast发送广播类型MainBroadcastReceiver.RECEIVER==>
我们通过配制文件找到:
指定了接收者是MainBroadcastReceiver
这样系统就会给发广播,调用相应的onReceive方法
其实广播的方式也是简单的,观察者模式而已。
2)动态 系统代码注册,不在配制中
这里发了一个广播,只要是注册了MY_ACTION的都会收到。
这里加了一个注册接收者的代码:
指定了有receiver来接收。