service全面解析(一)

原创 2016年05月30日 19:52:05
Service Android程序的四大组件之一,它与Activity极为相似,它具有自己的生命周期,不同的是它没有Activity 类似的交互界面不能和用户进行交互
Service运行在后台,它可以和一些组建(Activity)绑定进行本地通信,也可以跨进程通信(AIDL),接下来我们详细看看service的功能。
1:启动方式:
Service的启动方式可以分为两种形式:
第一种只启动一个service,这时候service和启动它的组件之间就没有任何了
第二种通过bindService()方法启动一个service,它会将指定的Service和组件(Activity)关联起来,可以进行通信。

生命周期
startService()方法启动的生命周期:
1.其他组件调用startService()方法:
2.onCreate()方法被调用,执行初始化
3.onStartCommand()方法触发。
3.调用stopService()方法,销毁service,onDestroy()方法触发
bindService()方式的生命周期:
1.其他组件调用bindService()方法
2.onCreate()方法被调用,执行初始化
3.onBind()方法被触发,并返回一个IBinder实现类的对象,这个对象在绑定的组件中获取,我们可以使用这个对象可以进行组件和service的通信
4.onUnBind()方法,在我们调用unBindService()的(解绑)时候触发
5.执行onDestroy()方法,销毁services
通过startService()方式启动方式相对简单,在此就不给例子演示了,下面我们来看下通过bindService()方式启动的一个例子
首先使用主界面布局文件service_main.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/bt_start_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/start_service" />

    <Button
        android:id="@+id/bt_stop_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/stop_service" />

    <Button
        android:id="@+id/bt_bind_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/bind_service" />

</LinearLayout>

这里写图片描述
如图只有三个按钮,获取services的属性值,绑定启动,解绑,这个比较简单。
接下来我们定义一个ServiceActivity类让它继承Service类

  public class ServiceTest extends Service {
    private String TAG = ServiceTest.class.getSimpleName();
    private int count = -1;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i(TAG, "-----onbind-----");
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "----oncreate--");
        count = 100;

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "---onStartCommant----");

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG, "---------onunbinder()------");
        count = -1;
        return true;
    }

    public class MyBinder extends Binder {
        public int getCount() {
            return count;
        }
    }

    @Override
    public void onDestroy() {
        Log.i(TAG, "---------ondestroy()------");
        super.onDestroy();
    }

    @Override
    public void onRebind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i(TAG, "-----onRebind----");
        super.onRebind(intent);
    }
}
首先我们在每个回调的方法里里都打印一下,方便我们之后观察他们的执行次序,其次在onbind()方法中 返回了一个IBinder对象,我们继承了它的实现类Binder类实现了一个我自己的内部类Mybinder,MyBinder类里面有个一个方法返回了一个int 类型的count字段。
最后我们在一个Activity中绑定我们刚才的service组件
    public class ServiceActivity extends Activity implements OnClickListener {
    private ServiceTest.MyBinder binder;
    Intent mintent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service_main);
        Button start_service_bt = (Button) findViewById(R.id.bt_start_service);
        Button stop_service_bt = (Button) findViewById(R.id.bt_stop_service);
        Button bind_service_bt = (Button) findViewById(R.id.bt_bind_service);
        start_service_bt.setOnClickListener(this);
        stop_service_bt.setOnClickListener(this);
        bind_service_bt.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.setClass(this, ServiceTest.class);
        switch (v.getId()) {
        case R.id.bt_start_service:
         Log.i("---count----",binder.getCount()+"");
            break;
        case R.id.bt_stop_service:
                unbindService(connection);
            break;
        case R.id.bt_bind_service:
            bindService(intent, connection, Service.BIND_AUTO_CREATE);
            break;

        }

    }

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            Log.i("---------", "-------disConnection-------");
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
                binder = (ServiceTest.MyBinder) service;

        }
    };  
}

这个Activity中我们使用bindService()方式绑定一个Service
bindService(Intent service, ServiceConnection conn, int flags),需要三个参数:
Intent:需要绑定的目标service的Intent的对象
ServiceConnection:该对象监听访问者和Service的连接情况,连接成功的时候回调onServiceConnected(ComponentName name, IBinder service)方法,当与之关联的组件崩溃等问题退出时调用onServiceDisconnected(ComponentName name)方法
flags:绑定的时候是否自动创建Service
看看运行结果:
但我们启动东应用点击“绑定service”按钮,控制台输出:
这里写图片描述
我们点击”组件通讯”:
这里写图片描述
我们会发现我能能在Activity中获取Service中的值,就是说我们能狗调用service中的方法和属性进行通信。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

service全面解析

  • 2014年02月17日 14:36
  • 6.04MB
  • 下载

Android Service全面解析

  • 2016年10月16日 14:02
  • 3.24MB
  • 下载

service全面解析(二)

前一篇我们分析了service的一些基本知识和用法,service全面解析(一),今天一起来看看如何提高service的进程优先级,跨进程通信的问题。 一:如何将service设置为前台进程:...

Service生命周期最全面解析

前言 Service作为Android四大组件之一,应用非常广泛本文将介绍Service最基础的知识:Service的生命周期  如果你对Service还未了解...
  • anmoyyh
  • anmoyyh
  • 2017年04月24日 15:02
  • 224

Android Service最全面的解析

刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Service Service是Android中一个类,它是Android四大组件之一,使用S...

Android Service生命周期,本地服务远程服务,前台服务后台服务,启动方式,与IntentService区别全面解析

脑子里记了太多,最近感觉不太够用了,还是决定来CSDN给存起来,方便自己以后翻阅也便利别人,一点知识总结,各位过客可在评论区指出。 什么是Service,相信大家应该不会陌生了,Service是A...

Android四大组件:Service史上最全面解析

前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识、生命周期、使用和应用场景) 目录1. 基础知识 定义:服务,属于Android中的计...

Service全面解析

Android Service定义 长期运行在后台 没有界面 讲到服务,那么就需要了解几个定义: 线程:按照操作系统来说,线程是CPU调度的最小,同时线程也是一种有限的系统资源 进程:一般指一...

Android Service非常全面的解析

原作者刘明渊的博客地址:http://blog.csdn.net/vanpersie_9987 Service是Android中一个类,它是Android四大组件之一,使...

Android 中 Service 全面解析与使用

一、概念:  Service(服务)是Android中四大组件之一。是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Servi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:service全面解析(一)
举报原因:
原因补充:

(最多只允许输入30个字)