免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1783 | 回复: 1
打印 上一主题 下一主题

[Android] Android服务之Service [复制链接]

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-28 13:14 |只看该作者 |倒序浏览
android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记录你地理信息位置的改变,或者启动一个服务来运行并一直监听某种动作。

Service和其他组件一样,都是运行在主线程中,因此不能用它来做耗时的请求或者动作。你可以在服务中开一一个线程,在线程中做耗时动作。

那么究竟Service怎么使用呢?

老规矩,先来点基础知识。

一.基础知识
服务一般分为两种:

1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次stopService()来停止。

2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
提供给可被其他应用复用,比如定义一个天气预报服务,提供与其他应用调用即可。

那么先来看Service的生命周期吧:如图:


context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
2 [报告]
发表于 2015-09-28 13:15 |只看该作者
二.实战
我们可以定义一个本地服务继承Service,然后在这个服务里播放媒体播放器或者记录地理位置变化。通常有时候我们的Service要与Activity交互,那么可以可以定义一个内部类,返回这个Service,当然我们要考虑到如果是以绑定方式启动服务,那么内部类可以定义为继承Binder,然后返回本地服务,具体代码如下。
  1. package com.dongzi;

  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.media.MediaPlayer;
  5. import android.os.Binder;
  6. import android.os.IBinder;
  7. import android.util.Log;

  8. public class LocalService extends Service {

  9.     private static final String TAG = "LocalService";
  10.     private IBinder binder=new LocalService.LocalBinder();
  11.    
  12.     @Override
  13.     public IBinder onBind(Intent intent) {
  14.          
  15.         return binder;
  16.     }
  17.     MediaPlayer mediaPlayer=null;
  18.     @Override
  19.     public void onCreate() {
  20.             Log.i(TAG, "onCreate");
  21.             //这里可以启动媒体播放器
  22.            // if(mediaPlayer==null)
  23.            //     mediaPlayer=MediaPlayer.create(this, uri);
  24.             super.onCreate();
  25.     }

  26.     @Override
  27.     public void onStart(Intent intent, int startId) {
  28.             Log.i(TAG, "onStart");
  29.             super.onStart(intent, startId);
  30.     }

  31.     @Override
  32.     public int onStartCommand(Intent intent, int flags, int startId) {
  33.           Log.i(TAG, "onStartCommand");
  34.         return START_STICKY;
  35.     }

  36.    
  37.    
  38.     @Override
  39.     public void onDestroy() {
  40.             Log.i(TAG, "onDestroy");
  41.             super.onDestroy();
  42.     }

  43.    
  44.     //定义内容类继承Binder
  45.     public class LocalBinder extends Binder{
  46.         //返回本地服务
  47.         LocalService getService(){
  48.             return LocalService.this;
  49.         }
  50.     }
  51.    
  52.    
  53. }
复制代码
我们可以从上面知道

//定义内容类继承Binder
    public class LocalBinder extends Binder{
        //返回本地服务
        LocalService getService(){
            return LocalService.this;
        }
    }

可以返回这个服务,然后activity可以通过服务调用服务的方法了。

那么如何启动服务呢?从上面基础知识中,我们知道有2种方法,如下:
  1. //启动服务
  2.     private void startCustomService(){
  3.          Intent intent=new Intent(this,LocalService.class);
  4.          startService(intent);
  5.     }
复制代码
或者
  1. LocalService localService=null;
  2.     //用bindService方法启动服务
  3.     private void BinderService(){
  4.          Intent intent=new Intent(this,LocalService.class);
  5.          bindService(intent, new ServiceConnection(){
  6.             @Override
  7.             public void onServiceConnected(ComponentName componentName, IBinder binder) {
  8.                 //调用bindService方法启动服务时候,如果服务需要与activity交互,
  9.                 //则通过onBind方法返回IBinder并返回当前本地服务
  10.                 localService=((LocalService.LocalBinder)binder).getService();
  11.                 //这里可以提示用户,或者调用服务的某些方法
  12.             }

  13.             @Override
  14.             public void onServiceDisconnected(ComponentName componentName) {
  15.                 localService=null;
  16.                 //这里可以提示用户
  17.             }     
  18.          }, Context.BIND_AUTO_CREATE);
  19.     }
复制代码
在绑定服务的时候,需要一个服务连接对象,ServiceConnection,服务一旦连接,就会调用onServiceConnected方法,我们可以在这个方法里面返回我们的本地服务对象,具体看代码;而在服务断开时候会调用onServiceDisconnected方法,我们可以清理一些服务资源。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP