android service与activity交互的方试
16lz
2021-01-26
android service与activity交互的方试
1:android通过Handler与activity交互
这个实现起来比较简单,只需要把handler传递给service然后通过handler的handleMessage来更新界面就可以了,没什么难点。 我们来看看service里面的代码。 [java] view plain copy print ?- publicclassSingleServiceextendsService{
- privatestaticHandlermhandler;//更新给前台的handler
- publicstaticvoidSetHandler(Handlerhandler)
- {
- mhandler=handler;
- }
- @Override
- publicvoidonCreate(){
- //TODOAuto-generatedmethodstub
- super.onCreate();
- if(mhandler!=null)
- {
- Messagemessage=newMessage();
- message.obj="serviceaction";
- mhandler.sendMessage(message);//更新消息
- }
- }
- @Override
- publicIBinderonBind(Intentarg0){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- }
- publicclassMainActivityextendsActivity{
- privateHandlerhandler=newHandler(){
- //处理消息
- @Override
- publicvoidhandleMessage(Messagemsg){
- //TODOAuto-generatedmethodstub
- super.handleMessage(msg);
- Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //传递handler
- SingleService.SetHandler(handler);
- //启动service
- startService(newIntent(MainActivity.this,SingleService.class));
- }
- }
2:利用bindservice
都知道service有两种启动方式,一种是startservice这种方式是不管你调用startservice再多次都service的oncreate方法都只执行一次,但是onstart方法会照样执行,它的生命周期也更启动它的activity没有关系,当activity销毁的时候service不会销毁,第二种方式是bindservice这种时候不管你怎么启动它也是只执行一次,但是他的生命周期却是和宿主activity绑定在一起的我们在activity中通过调用bindService来获取连接引用然后可以通过这个引用实现对service里面的数据操作。 这里我们定义一个接口 [java] view plain copy print ?- /**
- *用户接口
- *@authorbobo
- *
- *@param<T>
- */
- publicinterfaceIService<T>{
- //用户接口
- publicTqury(intn);
- }
然后写我们的service [java] view plain copy print ?
- publicclassSingleServiceextendsService{
- privateStringname[]={"小红","小名","张三","李四"};
- IBinderbinder=newMyBinder();
- @Override
- publicvoidonCreate(){
- //TODOAuto-generatedmethodstub
- }
- //自己的业务处理方法
- publicStringqurys(intd){
- if(d>0&&0<4){
- returnname[d-1];
- }else
- returnnull;
- }
- @Override
- publicIBinderonBind(Intentarg0){
- //TODOAuto-generatedmethodstub
- //返回我们自定义的binder对象
- returnbinder;
- }
- /***
- *绑定类
- *@authorbobo
- *
- */
- publicclassMyBinderextendsBinderimplementsIService<String>{
- @Override
- //实现接口
- publicStringqury(intn){
- //TODOAuto-generatedmethodstub
- returnqurys(n);
- }
- }
- }
最后看看我们的activity里面的交互情况 [java] view plain copy print ?
- publicclassMainActivityextendsActivity{
- privateIService<String>iService;//定义接口
- privatemyConnectionconnection;//连接对象
- privateHandlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //TODOAuto-generatedmethodstub
- //刷新界面
- Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Intentservice=newIntent(MainActivity.this,SingleService.class);
- //实例化连接
- connection=newmyConnection();
- //启动service
- bindService(service,connection,BIND_AUTO_CREATE);
- //startService(newIntent(MainActivity.this,SingleService.class));
- }
- /***
- *通过这个类就与service绑定在了一起
- *@authorbobo
- *
- */
- classmyConnectionimplementsServiceConnection{
- @Override
- publicvoidonServiceConnected(ComponentNamename,IBinderservice){
- //TODOAuto-generatedmethodstub
- //获取到连接接口
- iService=(IService<String>)service;
- Messagemsg=newMessage();
- //调用service里面的方法
- msg.obj=iService.qury(3);
- handler.sendMessage(msg);
- }
- @Override
- publicvoidonServiceDisconnected(ComponentNamename){
- //TODOAuto-generatedmethodstub
- iService=null;
- }
- }
- }
3:利用broadcast
在前面讲到的方法中都不能太好的适应一个service对多个activity服务的情况,但是现在我们利用Broadcast可以较好的实现一个service给多个activity服务情况,业务逻辑是这样的,当我们的数据在service里面处理完成过后就可以通过发送广播通知activity更新界面在activity里注册广播监听。 service里面的代码 [java] view plain copy print ?- publicclassSingleServiceextendsService{
- @Override
- publicvoidonCreate(){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent();
- intent.setAction("service.selection.test");//创建过滤条件
- intent.putExtra("key","serviceselection");//传递参数
- sendBroadcast(intent);
- }
- @Override
- publicIBinderonBind(Intentarg0){
- //TODOAuto-generatedmethodstub
- //返回我们自定义的binder对象
- returnnull;
- }
- }
然后是activity里面的代码 [java] view plain copy print ?
- publicclassMainActivityextendsActivity{
- privateHandlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //TODOAuto-generatedmethodstub
- //刷新界面
- Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //注册广播事件并创建过滤器
- registerReceiver(newmyreceiver(),newIntentFilter("service.selection.test"));
- //启动service
- startService(newIntent(MainActivity.this,SingleService.class));
- }
- classmyreceiverextendsBroadcastReceiver{
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- //获取传递过来的值
- Stringkey=intent.getStringExtra("key");
- Messagemessage=newMessage();
- message.obj=key;
- handler.sendMessage(message);
- }
- }
- }
4:自定义交互方式
前面都说道了,基本上这些交互方式就够一般的需求了,但是我就在想有没有一种方法可以更好的让一个service给多个activity服务,这样就不用每次都要在activity里面注册广播事件,这里就就写写我自己是怎么实现的方法。 [java] view plain copy print ?- publicclassSingleServiceextendsService{
- publicstaticList<UIFresh>allactivity=newArrayList<UIFresh>();//创建一个容器来存取activity
- @Override
- publicvoidonCreate(){
- //TODOAuto-generatedmethodstub
- getActivityByName("MainActivity").refresh("Serviceaction");
- }
- /****
- *根据名字获取activity
- *@paramname
- *@return
- */
- privateUIFreshgetActivityByName(Stringname){
- UIFreshia=null;
- for(UIFreshac:allactivity){
- if(ac.getClass().getName().indexOf(name)>=0){
- ia=ac;
- }
- }
- returnia;
- }
- @Override
- publicIBinderonBind(Intentarg0){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- }
然后是activity里面 [java] view plain copy print ?
- publicclassMainActivityextendsActivityimplementsUIFresh{
- privateHandlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- //TODOAuto-generatedmethodstub
- //刷新界面
- Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
- super.handleMessage(msg);
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //把activity加入管理列表
- SingleService.allactivity.add(this);
- //启动service
- startService(newIntent(MainActivity.this,SingleService.class));
- }
- /****
- *实现接口
- */
- @Override
- publicvoidrefresh(Object...objects){
- Messagemessage=newMessage();
- message.obj=objects[0];
- handler.sendMessage(message);
- }
- }
这样就可以很好的根据自己的需要与service交互了
更多相关文章
- Android(安卓)AsyncTask和Handler对比
- android源码下载方法 批量下载 基于windows os
- Android(安卓)Phonebook编写联系人UI加载及联系人保存流程(四)
- Android(安卓)Studio使用AIDL技术进行SDK开发
- 在Android(安卓)Studio中运行java main方法
- 用GDB远程调试android native程序
- Android定时器Timer.schedule
- [Android(安卓)Studio] 关于*.SO压缩问题
- Android-EventBus(手写简易版)