Android基础第八天

服务入门的基础上加深了一些内容,分别总结如下:

首先我们学习的startService()这种方式开启一个服务,虽然可以开启一个服务但是,它的特点为:
1,开启了服务之后,就和activity没有直接的关系了,就算activity关闭了,刚刚开启的service
也不会关闭。

2,如果要在activity里面传递数据给service,每次都要通过Intent意图发送一条数据给Service,
    然后service会在它的onStartCommand()方法里面把传过来的数据通过Intent取出来,根据不同的
    数据,然后再去做相对应的操作。

然后我们为了避免用上面这种麻烦的方式,就学习了新的一种开启服务的方法,叫做 bindService()
//conn 通讯频道. BIND_AUTO_CREATE如果服务不存在,会把服务创建出来.
bindService(intent, new MyConn(), BIND_AUTO_CREATE);

这种绑定服务的方式,需要让service里面去写一个 代理人 (service里面的一个内部类),然后定义各种各样的方法
public class MyBinder extends Binder {
//各种各样的方法

    method1()
    method2()
    .....
}

然后记得要在service的onBind方法里面返回这个MyBinder对象

最后,在activity里面onServiceConnected方法里面,拿到服务返回来的中间人对象(第二个参数)
随后就可以通过中间人调用服务里面的各种方法了

private class MyConn implements ServiceConnection{
//当服务被成功连接的时候调用的方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
    System.out.println("在Activity得到了服务返回的代理人对象,IBinder");
    myBinder = (MyBinder) service;

}
//当服务失去连接的时候调用的方法.
@Override
public void onServiceDisconnected(ComponentName name) {

}

}
三、通过接口隐藏代码内部实现的细节….

private class MyBinder extends Binder implements XXXXXX

我们可以让自己的MyBinder实现一个接口,这个接口的主要作用是暴露出我们想让别人看见的方法,
public interface IService {

/**
 * 定义的接口 小蜜一定有一个方法是拿钱办事 
 * @param name 姓名
 * @param money 钱
 */
public void callMethodInService(String name,int money);

public String 走私方法();

}

记得将service转为接口类型的对象,这样只能看见接口中定义的方法了,实现了隐藏其他方法,这样就可以保护一些特殊的方法,调用者就看不见了
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println(“在Activity得到了服务返回的代理人对象,IBinder”);
//转为接口类型
myBinder = (IService) service;
myBinder.走私方法();
}
四、绑定服务的生命周期

绑定服务(bindService)和前面第一次所学的(startService)启动方式不同,那么服务的生命周期是不同的

直接调用bindService() 如果服务不存在, 会执行oncreate—>onbind,服务的onstart和onstartcommand方法不会被执行.
并且通过bindService方式启动服务的话,如果想停掉服务直接调用stopService()方法是没有用的,必须执行
unbindService()方法, 然后它的生命周期方法会执行 onunbind()—>ondetroy()

以下是一些细节问题,要注意:

多次绑定服务,服务只会被创建一次,oncreate方法只会被执行一次
多次绑定服务,onbind方法不会被重复调用.
在实际开发的时候,如果需要调用服务的方法,就绑定服务,只能绑定一次
服务只可以被解绑一次,如果用同一个conn对象多次解绑,服务会抛出异常!

不求同时生,但求同时死. 如果开启者(Activity)退出了, 服务也会跟着挂掉.
但是如果service某种情况挂掉了,activity不会死掉,所以并不是完全的同时生,同时死
bindService开启的服务在系统设置界面看不到的.

五、混合启动服务 如果将我们前面学习的startService 和 bindService,两个方法结合起来用的话,会产生新的效果

应用场景: 为了保证服务又能长期后台运行,又能调用到服务里面的方法 就采用混合的方式开启服务.
如果使用混合服务,请严格按照以下步骤: 1. start的方式开启服务 (保证服务长期后台运行) 2. bind的方式绑定服务 (调用服务的方法) 3. unbind的方式解除绑定服务 4. stop的方式停止服务

重要概念

进程
操作系统分配的独立的内存空间.
IPC
inter process communication 进程间通讯
aidl
android interface definition language 安卓接口定义语言
本地服务和远程服务

本地服务 local service
服务的代码在当前应用程序的内部
远程服务 remote service
服务的代码在另外一个应用程序里面
远程服务实现流程(AIDL)

远程服务步骤:
1,创建一个Service,内部有一个方法供外部调用 比如 ( pay() );
2,写一个接口类比如(IService.java),里面定义需要暴露给别人用的方法 ( 比如 callPayMethod() )
3,然后到项目工程的文件夹里面将IService.java 改名字为—> IService.aidl ,然后回到eclipse刷新一下工程
再把IService.aidl 里面所有的public 修饰符给去掉!
4,在service里面写一个内部类继承 IService.Stub—-》public class MyBinder extends IService.Stub
然后eclipse会要求你重写 第二步接口里面定义的方法,在这个方法里面 再去调用 第一步的pay()方法
5,最后一定要记得在onBind方法里面返回自己刚刚写好的MyBinder对象
6,记得在清单文件里面配置service标签,并且要设置一个action!!!!,因为现在是给另外一个应用程序调用了!
例子:




调用者步骤:
1,将远程服务应用程序中的aidl文件复制到自己的项目工程里面来,但是注意,这个aidl文件必须放在它指定的包名下
假如aidl文件中的内容是这样的 :
package com.ithcl.remote;

    interface IService {
    void callMethodInService();
}

那么你就需要再当前src目录下新建一个目录为com.ithcl.remote,然后把aidl文件放进来

2,然后就去bindService了,注意写上刚才远程服务配置好的action
Intent intent = new Intent();
intent.setAction(“xxxxxxx”);!!!!!!!!!!!!!!!!!!!!
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);

3,最后注意转换的用法  :  IService asInterface = IService.Stub.asInterface(service);
    @Override
public void onServiceConnected(ComponentName name, IBinder service) {
    IService asInterface = IService.Stub.asInterface(service);
    try {
        asInterface.callMethodInService();
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

系统的服务

getSystemService() 可以获取到系统的服务
//这是获取到一个电话状态的系统服务,通过它可以获取到电话的各种状态信息
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

//这个方法底层其实是用到了一个填充气服务getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View.inflate(context, resource, root)

练习电话窃听的案例,体验一下TelephonyManager的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值