文档章节

android 四大组件之---Service

Jusenr
 Jusenr
发布于 2016/05/17 00:23
字数 1511
阅读 4
收藏 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(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
584
1
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1
Web开发组件管理器--Bower

Bower 是一个针对Web开发的包管理器。该工具主要用来帮助用户轻松安装CSS、JavaScript、图像等相关包,并管理这些包之间的依赖。 功能有些类似于Component。不同之处是,Component是围绕Git...

匿名
2013/02/01
1.2W
2
Flash 皮肤样式--Windows8UIStyle

Windows8UIStyle 模仿 Windows 8 的桌面用户界面,使得 FlashSwing 应用程序在 Windows 8 系统中拥有与传统应用程序一致的用户界面。 Windows8UIStyle 对 FlashSwing 默认主题的修改: 提供和...

Gregary
2013/02/19
1.3K
1
Android3D应用与游戏开发框架--JQGL

JQGL 是一款针对Android设备上3D应用、游戏的开发框架。 核心功能是OpenGL-ES的使用框架,相对于大部分开发者而已,OpenGL是陌生的,没有专门研究无法进行相关的开发。 本框架针对于Android...

Jping
2013/02/21
1.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

2020年西安未来五年哪些编程语言更有发展前景

西安作为一线城市,随着5G标准的落地应用,未来五年产业互联网将逐渐落地到广大的传统行业,以辅助传统行业的结构性升级。产业互联网的核心技术包括大数据、云计算、物联网和人工智能等技术,...

osc_4eht81t7
41分钟前
0
0
三网竞对测试仪在多网室分中的应用(移动网络竞对测试)

三网竞对测试仪在多网室分中的应用 现代城市的高楼大厦,栉次鳞比,一片繁华的背后是室分人的焦虑,随着网络的发展室分系统更注重精细化的室内覆盖及优化,系统指标不仅要关注场强覆盖,而且...

osc_k3vwonkw
42分钟前
0
0
B的时代过去了,新的时代已经来临

BAT中的B的时代基本上已经过去了,看起来是败于移动时代,但本质是传统的文字搜索已经到了顶峰,走下坡路了。百度没有抓住移动互联网,也没有抓住视频时代,这里面,其实也包括谷歌,谷歌比百...

osc_mzickfah
44分钟前
0
0
OSP单区域通信(骨干区域)

第一步设置IP地址 R1 undo terminal monitor [Huawei]user-interface console 0 [Huawei-ui-console0]idle-timeout 0 0 [Huawei]sysname R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add......

osc_m6gaz63w
45分钟前
28
0
5G来电奥秘

5G 电话是怎样传播声音的? The number you are trying to reach is turned off ! 电话是怎样传播声音的? 首先,电话有bai一个听筒和一个话筒,话筒内有du一个磁圈可以将人的声波转化zhi为...

osc_kvlhvh2u
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部