博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activity 调用Service的方法
阅读量:6935 次
发布时间:2019-06-27

本文共 3633 字,大约阅读时间需要 12 分钟。

一般来说,Activity调用Service 分为两种:进程内调用和进程间调用。进程内调用时比较常用的一种,在进程内调用中我们常常使用的是bindService来启动Service(关于这种启动方式的好处,才疏学浅就不再这卖弄了)。下面就这两种调用方式分别进行简单介绍:

1.通过bindService来启动Service,并调用Service中的方法。

1.一个简单的Service:

package gu.chuan.hang;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class MyService extends Service {    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return new MyBinder();    }    public class MyBinder extends Binder{        public MyService getMyService(){            return MyService.this;        }    }    /**     * 在Service中定义这个方法,用于测试     * @return     */    public String getAuthorName(){        return "guchuanhang";    }}

2.在Activity中绑定Service并测试效果:

package gu.chuan.hang;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.widget.Toast;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Intent myServiceIntent = new Intent(MainActivity.this, MyService.class);        bindService(myServiceIntent, mServiceConnection,                Context.BIND_AUTO_CREATE);    }    ServiceConnection mServiceConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            MyService myService = ((MyService.MyBinder) service).getMyService();            String authorName = myService.getAuthorName();            Toast.makeText(MainActivity.this, "author name is: " + authorName,                    Toast.LENGTH_LONG).show();        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };}

3.截个图吧,更清楚一点: 

这里写图片描述

2.进程间启动Service并调用Service中的方法

1.首先定义一个aidl文件(扩展名为.aidl):

package gu.chuan.hang.remoteservice.aidl;interface AuthorInfo{ String getAuthorName();}

2.定义一个实现了aidl的服务:

package gu.chuan.hang.remoteservice.aidl;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class MyService extends Service{    @Override    public IBinder onBind(Intent intent) {        return new MyStub();    }    private class MyStub extends AuthorInfo.Stub{        @Override        public String getAuthorName() throws RemoteException {            return "guchuanhang";        }    }}

3.在同一个app中模拟进程间调用的效果,给Service设置remote属性:

4.启动并调用Service中的方法:

public class MainActivity extends Activity {       @Override       public void onCreate(Bundle savedInstanceState){           super.onCreate(savedInstanceState);           Intent intent=new Intent(this,MyService.class);           startService(intent);           bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);       }        private ServiceConnection  mServiceConnection=new ServiceConnection(){        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            AuthorInfo authorInfo=AuthorInfo.Stub.asInterface(service);            try {                String authorName=authorInfo.getAuthorName();            Toast.makeText(MainActivity.this, "author name is: "+authorName, Toast.LENGTH_LONG).show();            } catch (RemoteException e) {                e.printStackTrace();            }        }        @Override        public void onServiceDisconnected(ComponentName name) {        }       };}

5.附上效果截图: 

这里写图片描述 
6.关于aidl进程间调用是参考了 
大神之作,进行的精简修改。

3.附上Demo下载地址:

你可能感兴趣的文章
GreenDao使用注意事项
查看>>
HTTP协议
查看>>
Filter 设计模式编码实践
查看>>
华山论剑之浅谈iOS的生产线 工厂模式
查看>>
人人都能学会的python编程教程14:高级特性1
查看>>
sticky list item
查看>>
如何用树莓派和PHP开发一个比特币和以太坊交易机器人
查看>>
为什么说百度教育大脑3.0,是中国教育迎来的真正智慧大脑?
查看>>
Raft只读操作实现要点
查看>>
逆向世界杯直播App 央视影音-iOS客户端
查看>>
MediaCodec 解码后数据对齐导致的绿边问题
查看>>
Netty源码解析4-Handler综述
查看>>
Hey, 看看小程序的page-frame.html把~
查看>>
源码阅读:SDWebImage(十九)——UIImage+ForceDecode/UIImage+GIF/UIImage+MultiFormat
查看>>
Python学习笔记(随笔)
查看>>
HTML中显示数学公式
查看>>
flask学习笔记之blueprint
查看>>
MAC 终端 命令 记录
查看>>
基于Swoole和Redis实现的并发队列处理系统
查看>>
前端项目如何管理
查看>>