Android笔记——Service的使用与生命周期

2019-03-02  本文已影响0人  麦香菌

Service的使用

Service:

当service未被启动过的情况下被启动时,会执行onCreate和onStartCommand,若已被启动过,则每次启动只执行onStartCommand。
Service的绑定通过在其内部创建一个MyBinder继承Binder,并通过onBind返回实例,这样绑定的活动就能执行MyBinder内部的方法。
而在MyBinder内部写一个获取MyService实例的getService方法,绑定的活动通过该方法获取MyService实例就能调用MyService的公共类。

public class MyService extends Service {

    private String TAG = "ServiceLife_service";

    private MyBinder myBinder = new MyBinder();

    class MyBinder extends Binder{

        public void doBinder(){
            Log.d(TAG,"doBinder");
        }

        public MyService getService(){
            return MyService.this;
        }

    }

    public MyService() {
    }

    public void doService(){
        Log.d(TAG,"doService");
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG,"onBind");
        // TODO: Return the communication channel to the service.
        return myBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG,"onUnbind");
        return super.onUnbind(intent);
    }

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

Activity:

首先创建ServiceConnection的匿名类,重写onSericeConnected()和onServiceDisconnected()方法。在onSericeConnected()内向下转型得到MyBinder,在通过MyBinder的getService方法获取Service实例,接下来就能调用Service里的公共方法了。而onServiceDisconnected()则是在断开绑定时将获得的Service实例置空

private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG,"onServiceConnected");
            myBinder = (MyService.MyBinder) service;
            myBinder.doBinder();
            myService = myBinder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myService = null;
        }
    };

绑定并执行Service的公共方法:

case R.id.btn_bindService:
                //绑定Service
                Intent bindIntent = new Intent(this, MyService.class);
                bindService(bindIntent, connection, BIND_AUTO_CREATE);
                break;
case R.id.btn_doService:
                //执行Service里的公共方法
                if (null != myService) {
                    myService.doService();
                }
                break;

结果:


Service的生命周期

五个Button分别执行startService,stopService,bindService,unBindService和doService(执行Service的公共方法)。


1.startService→stopService

多次启动Service,onCreate只会执行一次,onStartCommand会多次执行。若在未绑定的情况下解绑Service程序会崩溃,而在未启动的情况下stopService则没关系。
[图片上传中...(image.png-1759dd-1551576698431-0)]

2.bindService→unBindService

解绑后ServiceConnection的onServiceDisconnected并未执行,是因为只有在Service 被破坏了或者被杀死的时候调用,连接正常情况下不会执行。


3.startService→bindService→stopService→unBindService

被启动并绑定的Service只有在被stopService和unbindService的情况下才会被销毁(onDestroy)。只执行unbindService只会解绑(onUnbind),而只执行stopService则没有任何效果。


4.总结

startService


bindService


image.png

stopService



unbindService


其他

当Activity被销毁时

https://blog.csdn.net/weixin_40876113/article/details/83750212

BIND_AUTO_CREATE和BIND_WAIVE_PRIORITY

https://blog.csdn.net/pan11115111/article/details/70236354
在4.0之前,Service的优先级被默认视同后台任务,如果设置了BIND_AUTO_CREATE则Service的优先级将等同于宿主进程,也就是调用bindService的进程。
在4.0及以上就完全变了,Service的优先级默认等同于宿主进程,只有设置了BIND_WAIVE_PRIORITY才会使Service的被当做后台任务对待,WAIVE就是放弃的意思嘛。
优先级:https://blog.csdn.net/qpc908694753/article/details/71244334

上一篇下一篇

猜你喜欢

热点阅读