文档章节

android 四大组件之---Service

Jusenr
 Jusenr
发布于 2016/05/17 00:23
字数 1511
阅读 3
收藏 0
点赞 2
评论 0

服务

服务的生命周期

---
  1 开启服务的生命周期
完整的生命周期:onCreate()-->onStartCommand()-->onDestroy()

* 开启服务:onCreate()-->onStartCommand()
* 停止服务:onDestroy()

* 特点:
        1. 服务可以被多次开启,每次开启都执行onStartCommand()方法
        2. 服务只能被停止一次,多次停止服务
        3. 长期运行在后台

  2 bind绑定服务的生命周期
完整的生命周期:onCreate()-->onBind()-->onUnbind()-->onDestroy()

* 绑定服务:onCreate()-->onBind()
* 解绑服务:onUnbind()-->onDestroy()

* 特点:
        1. 服务只能被绑定一次,多次绑定无效
        2. 服务只能被解绑一次,多次解绑会抛出异常
        3. 不可以长期运行在后台
        4. Activity和绑定他的服务同生共死
        5. 可以调用服务里的方法

* 区别: 1. 能不能长期运行在后台
        2.  能不能调用服务里的方法

绑定服务调用方法

---
  3 绑定服务调用服务里的方法
服务被绑定成功后,拿到服务返回的中间人,用中间人间接调用服务里的方法

    Activity:
       

 1 /**
 2      * bind方式绑定服务
 3      */
 4     public void bind(View v) {
 5         /**
 6          * service :意图 ServiceConnection:Activity和service连接通道
 7          * BIND_AUTO_CREATE:绑定服务时,如果服务不存在,则创建
 8          */
 9         Log.d(TAG, "bind:1. 绑定服务");
10         conn = new MyConn();
11         bindService(intent, conn, BIND_AUTO_CREATE);
12     }
13 
14     /**
15      * 解绑服务
16      */
17     public void unbind(View v) {
18 
19         Log.d(TAG, "unbind:服务被解绑啦。。。");
20         unbindService(conn);
21     }
22 
23     /**
24      * 调用服务里的方法
25      * 
26      */
27     public void diao(View v) {
28 
29         xiaowu.qianShouMM(99999);
30         Log.d(TAG, "diao:6. 用服务的内部类间接调用服务里的方法");
31     }
32 
33     class MyConn implements ServiceConnection {
34 
35         // Activity和service已经连接成功喽
36         @Override
37         public void onServiceConnected(ComponentName name, IBinder service) {
38 
39             Log.d(TAG, "onServiceConnected:4. 服务连接成功了");
40             xiaowu = (WuMiShu) service;
41             Log.d(TAG, "onServiceConnected:5. 在Activity中拿到了服务里的内部类");
42         }
43 
44         // 失去连接了
45         @Override
46         public void onServiceDisconnected(ComponentName name) {
47 
48             Log.d(TAG, "onServiceDisconnected: 失去连接了...");
49         }
50     }
51 
52     @Override
53     protected void onDestroy() {
54 
55         unbindService(conn);
56         super.onDestroy();
57     }


    Service:
         

 1 /**
 2      * 服务里的方法
 3      */
 4     public void methodInService() {
 5 
 6         Toast.makeText(this, "我是服务里的方法,来吊我啊。。。", 0).show();
 7     }
 8 
 9     @Override
10     public IBinder onBind(Intent intent) {
11 
12         Log.d(TAG, "onBind:2. 服务被绑定成功喽");
13         Log.d(TAG, "onBind 3. 服务绑定成功后,返回WuMiShu");
14         return new WuMiShu();
15     }
16 
17     /**
18      * 服务里的内部类, 内部类调用外部类的方法 中间人 小蜜
19      */
20     public class WuMiShu extends Binder {
21 
22         /**
23          * 调用外部类的方法
24          * 
25          * @param money
26          */
27         public void qianShouMM(int money) {
28 
29             if (money > 5000) {
30                 methodInService();
31             } else {
32                 Toast.makeText(MyService.this, "屌丝注定单身", 0)
33                         .show();
34             }
35         }
36     }
37 
38     @Override
39     public boolean onUnbind(Intent intent) {
40 
41         Log.d(TAG, "onUnbind:");
42         return super.onUnbind(intent);
43     }
44 
45     @Override
46     public void onCreate() {
47 
48         super.onCreate();
49         Log.d(TAG, "onCreate:");
50     }
51 
52     @Override
53     public int onStartCommand(Intent intent, int flags, int startId) {
54 
55         Log.d(TAG, "onStartCommand:");
56         return super.onStartCommand(intent, flags, startId);
57     }
58 
59     @Override
60     public void onDestroy() {
61 
62         super.onDestroy();
63         Log.d(TAG, "onDestroy:");
64     }

 

  

  4 绑定服务抽取接口
隐藏具体的实现细节,只暴露程序员想暴露的方法

1. 写一个接口,接口里写一个方法
2. 让服务的内部类ChenMiShu实现IService接口
3. 当Activity这边连接成功后,Binder强转成IService接口类型
4. 用IService接口间接调用服务里的方法

  5 混合方式开启服务
为什么要用混合方式启动服务:即想服务长期运行在后台,又想调用服务里的方法

开发中推荐的步骤:startService()保证服务长期运行在后台
                 bindService()可以调用服务里的方法
                 unBindService()解除绑定服务
                stopService()后台就没有这个服务了
远程服务

---
  6 本地服务和远程服务
* 本地服务:服务组件在自己的应用程序里
* 远程服务:服务组件不在自己的应用程序里

  7 本地应用调用远程服务中的方法
AIDL:android interface defination language 安卓接口定义语言

    编写步骤:
        远程服务工程:
            1. 把IService.java改成.aidl文件
            2. 去掉public 修饰符
            3. 让服务里的内部类继承IService.Stub

  Service:

 

 1 @Override
 2     public IBinder onBind(Intent intent) {
 3         Log.d(TAG, "onBind");
 4         return new ChenMiShu();
 5     }
 6     /**
 7      * 陈秘书
 8      */
 9     class ChenMiShu extends IService.Stub{
10 
11         @Override
12         public void callMethodInRemoteService() {
13             qianShouYangNiu();
14         }
15         
16     }
17     
18     /**
19      * 远程服务里的方法
20      */
21     public void qianShouYangNiu(){
22         Log.e(TAG, "qianShouYangNiu:我来了,你在哪?我在美国,咱们中间隔着一个太平洋....");
23     }

 

 

  IService.aidl

1  interface IService {
2 
3     /**
4      * 调用远程服务里 的方法
5      */
6      void callMethodInRemoteService();
7 }

 


        本地应用:
            4. 创建一个和远程服务.aidl文件所在的一样包
            5. 吧06工程里的IService.aidl文件复制到这个包里
            6. 用IService.Stub.asInterface(service)强转成IService
            7. 间接调用远程服务了的方法,处理RemoteException

  

  Activity

 

 1 /**
 2      * start开启服务
 3      * 
 4      * @param v
 5      */
 6     public void start(View v) {
 7         intent = new Intent();
 8         // 设置动作
 9         intent.setAction("wo.kan.dai.ma.ru.chu.lian");
10         // 可选,设置数据
11         // 默认是DEFAULT,可以不写
12         startService(intent);
13     }
14 
15     /**
16      * stop停止服务
17      * 
18      * @param v
19      */
20     public void stop(View v) {
21         stopService(intent);
22     }
23 
24     /**
25      * bind绑定服务
26      * 
27      * @param v
28      */
29     public void bind(View v) {
30         Intent service = new Intent();
31         // 设置动作
32         service.setAction("wo.kan.dai.ma.ru.chu.lian");
33 
34         mConn = new MyConn();
35         bindService(service, mConn, BIND_AUTO_CREATE);
36     }
37 
38     /**
39      * Activity和远程服务里的连接通道
40      */
41     class MyConn implements ServiceConnection {
42         @Override
43         public void onServiceConnected(ComponentName name, IBinder service) {
44             Log.d(TAG, "onServiceConnected:连接成功");
45             // service强转成 IService接口类型
46             mService = IService.Stub.asInterface(service);
47         }
48 
49         @Override
50         public void onServiceDisconnected(ComponentName name) {
51         }
52 
53     }
54 
55     /**
56      * 解绑服务
57      * 
58      * @param v
59      */
60     public void unbind(View v) {
61         unbindService(mConn);
62     }
63 
64     /**
65      * 调用远程服务里的方法
66      */
67     public void callremotemethod(View view) {
68         try {
69             mService.callMethodInRemoteService();
70         } catch (RemoteException e) {
71             e.printStackTrace();
72         }
73     }

 

 

  IService.aidl

1  interface IService { 2 3 /** 4  * 调用远程服务里 的方法 5 */ 6 void callMethodInRemoteService(); 7 }

 

 

  清单代码:

  

1  <activity
2             android:name="cn.zxr.local.MainActivity"
3             android:label="@string/app_name" >
4             <intent-filter>
5                 <action android:name="android.intent.action.MAIN" />
6 
7                 <category android:name="android.intent.category.LAUNCHER" />
8             </intent-filter>
9         </activity>

 

© 著作权归作者所有

共有 人打赏支持
Jusenr
粉丝 0
博文 20
码字总数 10876
作品 0
西安
Android工程师
Android 平台上轻量级的组件间通信框架 - Andromeda

Andromeda是爱奇艺开源的一个Android平台上轻量级的组件间通信框架,主要特征如下: 不需要开发者进行bindService操作,即可实现不同进程的任意两个组件间的IPC通信; 即使不在同一进程,也可同...

匿名 ⋅ 04/20 ⋅ 0

Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

Android 面试技能树梳理

相信大家都有面试的经历,相对比面试官的问的一些问题其实都是基础的知识,但就是一些基础的知识我们也不是很完美的回答出来,我们也知道现在的开发人员很多,一家公司一个岗位就会有很多的开...

liu3364575 ⋅ 05/05 ⋅ 0

Android 【插件化】"偷梁换柱"的高手-VirtualApk源码解析

关于VirtualApk VirtualApk github : https://github.com/didi/VirtualAPK VirtualAPK wiki : https://github.com/didi/VirtualAPK/wiki 工程介绍 工程结构 CoreLibrary是VirtualApk(以下简称......

qq_17250009 ⋅ 04/12 ⋅ 0

Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 06/06 ⋅ 0

Android:手把手教你学会使用Google出品的序列化神器Protocol Buffer

前言 习惯用 数据存储格式的你们,相信大多都没听过 其实 是 出品的一种轻量 & 高效的结构化数据存储格式,性能比 真的强!太!多! 由于 出品,我相信已经具备足够的吸引力 今天,我将详细介...

Carson_Ho ⋅ 04/16 ⋅ 0

Android性能优化:这是一份详细的布局优化 指南(含、、)

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢。 目录 /** 实例说明:在上述例子,在布局B中 通过标签引用布局C 此时:布局层级为 = RelativeLa...

Carson_Ho ⋅ 05/14 ⋅ 0

Android性能优化:那些不可忽略的绘制优化

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的绘制优化,希望你们会喜欢。 目录 // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除 优化方案2:移除 控件...

Carson_Ho ⋅ 05/21 ⋅ 0

通读《疯狂Android讲义》笔记 01 ___Android基础篇

文 | 莫若吻 注: 1.本文内容参考 李刚的《疯狂Android讲义》一书。 2.此书适合有一定Java基础、初学Android的同学阅读与学习。我最近想巩固下Android基础知识就来拜读一下此书。 3.本文笔记...

莫若吻 ⋅ 2017/11/06 ⋅ 0

Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析

每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。与Activity组件所关联的窗口对象的实际类型为PhoneWindow。 那么创建...

lonamessi ⋅ 05/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 57分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部