浅谈Service

一。生命周期:

startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart()。当用户在发出意图使之销毁时会经历onDestroy();( onCreate-->onStart-->onDestory )

bindService()方式启动,与Activity绑定的时候,会经历onCreate()和onBind(),而当Activity被销毁的时候,Service会先调用onUnbind()然后是onDestroy()。( onCreate-->onBind -->onUnbind-->onDestory)

二。控制方式:

StartService的控制方式需要使用固定的方法,对Service进行单一的操作。

而BindService由于与Activity绑定,不用考虑其生命周期问题,并且从发送Intent的被动操作,变为可以主动对Service对象进行操作,我们甚至可以建立一个Handler类,对Service进行相关的操作。大大加强了Service的灵活性、可操作性。

总结:对于简单的应用startService()启动方式能带来更少的代码,简单的操作。对于复杂的应用bindService()方式,虽然带来的更多的编码,但同时也带来了更好的可操作性,使其使用起来更像Activity。

注意:

Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy 我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService 
Service会经历 onCreate --> onStart

stopService的时候直接onDestroy,如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行,下次调用者再起来仍然可以stopService。

2 通过bindService 
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起,调用者退出了,Srevice就会调用onUnbind-->onDestroyed,所谓绑定在一起就共存亡了。

注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

代码:

一。startService -->service内容:

public class MyService extends Service{

    private static final String TAG = "MyService";
    MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    //服务启动前进行的配置
    public void onCreate() {
        Toast.makeText(this, "My Service created", Toast.LENGTH_LONG).show();
        Log.i(TAG, "onCreate");  

        //播放设置
        player = MediaPlayer.create(this, R.raw.music);//提供音乐的位置
        player.setLooping(false);  //是否循环播放音乐
    }  

    @Override
    //关闭服务
    public void onDestroy() {
        Toast.makeText(this, "My Service Stoped", Toast.LENGTH_LONG).show();
        Log.i(TAG, "onDestroy");
        player.stop();
    }  

    @Override
    //启动服务
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "My Service Start", Toast.LENGTH_LONG).show();
        Log.i(TAG, "onStart");
        player.start();
    }  

}

Activity的内容:
public class Activityone extends Activity{

    private static final String TAG = "ServiceDemo";
    private Button mybuttonone1;
    private Button mybuttonone2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one);

        mybuttonone1 = (Button)findViewById(R.id.buttonone1);
        mybuttonone2 = (Button)findViewById(R.id.buttonone2);

        //service通过startservice启动服务
        //首先调用mybuttonone1的onclick方法,然后调用myservice的onclick()方法,再然后调用onstart()方法
        mybuttonone1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(TAG, "onClick: starting service");
                startService(new Intent(Activityone.this, MyService.class));
            }
        });

        //service通过startservice关闭服务
        //首先调用mybuttonone2的onclick方法,然后调用myservice的onstop()方法

        mybuttonone2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.i(TAG, "onClick: stopping service");
                stopService(new Intent(Activityone.this, MyService.class));
            }
        });

        mybuttonone1.setOnClickListener(new myclicklistener());
        mybuttonone2.setOnClickListener(new myclicklistener());

    }

    class myclicklistener implements OnClickListener{
        public void onClick(View src) {
            switch (src.getId()) {
                case R.id.buttonone1:
                    Log.i(TAG, "onClick: starting service");
                    startService(new Intent(Activityone.this, MyService.class));
            //startservice  执行的步骤:  onclick()-->onstart()
                    break;
                case R.id.buttonone2:
                    Log.i(TAG, "onClick: stopping service");
                    stopService(new Intent(Activityone.this, MyService.class));
            //startservice  执行的步骤:  onDestroy()
                    break;
            }
        }
    }

}

二。BindService -->service内容:
public class BindService extends Service {

    private MyBinder myBinder = new MyBinder();
    private static final String TAG = "BindService";
    private MediaPlayer play;

    @Override
    public IBinder onBind(Intent intent) {
            Log.i(TAG, "BindService-->onBind()");

            play=MediaPlayer.create(this, R.raw.music);
            play.setLooping(false);

            return myBinder;
        }

    public class MyBinder extends Binder{

        public BindService getService(){
            Log.i(TAG, "BindService-->getService()");
            return BindService.this;
        }
    }

    public void MyMethod(){
        Log.i(TAG, "BindService-->MyMethod()");
        play.start();
    }

}

Activity的代码:
public class Activitytwo extends Activity{

    private Button mybutton1;
    private Button mybutton2;
    private boolean flag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);

        mybutton1=(Button)findViewById(R.id.buttontwo1);
        mybutton2=(Button)findViewById(R.id.buttontwo2);

        mybutton1.setOnClickListener(new myclicklistener());
        mybutton2.setOnClickListener(new myclicklistener());

    }

    class myclicklistener implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
            case R.id.buttontwo1:
                System.out.println("打开bind1");
                bindService();
                break;

            case R.id.buttontwo2:
                System.out.println("关闭bind1");
                unBind();
                break;    

            default:
                break;
            }
        }
    }

    private void bindService(){
        System.out.println("打开bind2");
        Intent intent = new Intent(Activitytwo.this,BindService.class);
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    private void unBind(){
        System.out.println("关闭bind2");
        if(flag == true){
            unbindService(conn);
            flag = false;
        }
    }

    private ServiceConnection conn = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("关闭bind3");
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("打开bind3");
            MyBinder binder = (MyBinder)service;
            BindService bindService = binder.getService();
            bindService.MyMethod();
            flag = true;
        }
    };

}
时间: 2024-09-27 17:19:07

浅谈Service的相关文章

安卓开发_浅谈Service

一.Service(服务) Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件. public abstract class Service extends ContextWrapper implements ComponentCallbacks java.lang.Object ? android.content.Context ? android.content.ContextWrapper ?

浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Manager和驱动程序Binder四个组件构成.本文着重介绍组件Service Manager,它是整个Binder机制的守护进程,用来管理

浅谈Service层为何要有接口

被人随意问了一句,为何每个service层都要写一个接口呢,多麻烦~虽然想说点什么,但是又不知道从何说起,只好从新整理一下思绪. 情景1:在开源框架中有很多这种情况,就是某个功能支持用户自定义扩展.说白了,它提供了一个接口,我们只需要实现这个接口,把我们自己的实现逻辑补上,就可以让框架按照我们的逻辑来执行.问题来了,框架的作者并不知道我们的实现类是什么,如果不定义一个接口,那么要如何在框架中调用我们的实现类呢? 情景2:我和同事分别做项目的2个不同功能模块,但是同事的功能中却需要调用我这头实现的

Android Service(一)--浅谈Service

一.Service简介 service可以说是一个在后台运行的Activity,它不是一个单独的进程,它只需要应用告诉它要在后台做什么就可以了,它要实现和用户的交互的话需要通过通知栏或则是发送广播,UI去接收显示.它的应用十分广泛,尤其是在框架层,应用更多的是对系统服务的调用.它用于处理一些不干扰用户使用的后台操作.如下载,网络获取.播放音乐,他可以通过INTENT来开启,同时也可以绑定到宿主对象(调用者例如ACTIVITY上)来使用.服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,

浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路中,介绍了Service Manager是如何成为Binder机制的守护进程的.既然作为守护进程,Service Manager的职责当然就是为Server和Client服务了.那么,Server和Client如何获得S

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源

浅谈 kubernetes service 那些事(上篇)

欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8s service 什么是service 是发现后端pod服务: 是为一组具有相同功能的容器应用提供一个统一的入口地址: 是将请求进行负载分发到后端的各个容器应用上的控制器. 对service的访问来源 访问service的请求来源有两种:k8s集

Service Cloud 零基础(一)Case 浅谈

本片参考:https://resources.docs.salesforce.com/222/latest/en-us/sfdc/pdf/salesforce_case_implementation_guide.pdf 练习可用:https://trailhead.salesforce.com/content/learn/projects/set-up-case-escalation-entitlements 我们在工作和生活中会经历很多销售流程,买过很多产品.比如作为公司的采购部采购一批电脑,