Android四大组件之Service全面解析(一)

 在阿杰的上一篇博文中给大家讲了一下Android四大组件之一的Activity,也是最重要的,这一篇文章,给大家讲一下Service。

什么是Service

 Service是Android的四大组件之一应用广泛,它是一个能在后台进行一个长时间的操作并且不提供用户界面的一个组件,应用相当广泛。其他应用组件可以启动Service,当用户切换到另一个应用程序时,Service依然可以在后台运行。

Service的作用

组件能够绑定到服务与之交互,甚至执行进程间通信(IPC)。

Service的生命周期

Service有自己的生命周期,它的生命周期方法比Activity少一些,只有onCreate()、onStartCommand()、onDestroy()。

Service的启动方式以及生命周期

1、通过startService()启动服务

  • onCreat()  --------当服务第一次创建的时候,优先调用onCreat()方法,然后在调用onStartCommand()方法,如果说,服务已经启动,再次调用startService()则不会调用onCreat()方法,直接调用onStartCommand(),onCreat()主要用来做一些初始化的操作。
  • onStartCommand()  -----------执行一次startService(),就会执行一次onStartCommand(),这个方法很重要,我们在服务进行的后台操作,比如下载音乐等等,都是在这个方法中进行。
  • onBind() --------Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。
  • onDestory() --------在销毁的时候会执行Service的该方法。

2、通过bindService启动Service

    bindService启动服务的特点:

  1. 可以绑定多个组件到Service,比如几个Activity
  2. Activity可以通过IBinder接口来获取Service的实例,从而调用Service中的方法进行交互,通过StartService()启动Service则不能这样
  3. 某个组件(Activity)与Service绑定后,当Activity销毁时自动与Service解除绑定,Activity也可以调用UnBindService主动解除绑定。当没有组件与Service绑定时,Service自动销毁。
  4. 通过bindService启动Service不会调用onStartCommand()方法。

我们来测试一下,我们写一个Service:

public class MyService extends Service {
    private final static String TAG = "Service_Text-----";

    /**
     * 创建MyBind,通过getMyService()获取Service实例
     */
    public class MyBind extends Binder {
        public MyService getMyService() {
            return MyService.this;
        }
    }

    /**
     * 实例化MyBind
     * 通过myBind实现Activity与Service之间的通信
     */
    MyBind myBind = new MyBind();

    /**
     * @param intent
     * @return 在onBind中返回MyBind
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return myBind;
    }

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

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

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

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

在写两个Activity ,ActivityA ActivityB

public class ActivityA extends AppCompatActivity implements View.OnClickListener {
    private final static String TAG = "Service_Text-----";
    private Service mService = null;
    private boolean isBind = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        findViewById(R.id.btn1).setOnClickListener(this);
        findViewById(R.id.btn2).setOnClickListener(this);
        findViewById(R.id.btn3).setOnClickListener(this);
        findViewById(R.id.btn4).setOnClickListener(this);

    }

    /**
     * 绑定Service后,会执行ServiceConnection,可以通过onServiceConnected中的IBinder获取Service实例
     */
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            isBind = true;
            MyService.MyBind myBind = (MyService.MyBind) service;
            //获取Services实例
            mService = myBind.getMyService();
            Log.d(TAG, "onServiceConnected: ------------------------Activity A");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBind = false;
            Log.d(TAG, "onServiceDisconnected: ------------------------Activity A");
        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //绑定Service
                Intent intent = new Intent(this, MyService.class);
                intent.putExtra("activity", "Activity_A");
                Log.d(TAG, "Activity A------执行了bindService");
                bindService(intent, serviceConnection, BIND_AUTO_CREATE);
                break;
            case R.id.btn2:
                if (isBind) {
                    Log.d(TAG, "Activity A------unbindService");
                    unbindService(serviceConnection);
                }
                break;
            case R.id.btn3:
                Intent intent1 = new Intent(this, ActivityB.class);
                startActivity(intent1);
                Log.d(TAG, "Activity A------跳转到了B");
                break;
            case R.id.btn4:
                finish();
                Log.d(TAG, "Activity A------结束");
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "ActivityA - onDestroy");
    }
}
public class ActivityB extends AppCompatActivity implements View.OnClickListener{
    private final static String TAG = "Service_Text-----";
    private Service mService = null;
    private boolean isBind = false;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        findViewById(R.id.btn1).setOnClickListener(this);
        findViewById(R.id.btn2).setOnClickListener(this);
        findViewById(R.id.btn3).setVisibility(View.GONE);
        findViewById(R.id.btn4).setOnClickListener(this);
    }
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            isBind = true;
            MyService.MyBind myBind = (MyService.MyBind) service;
            //获取Services实例
            mService = myBind.getMyService();
            Log.d(TAG, "onServiceConnected: ------------------------Activity B");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isBind = false;
            Log.d(TAG, "onServiceDisconnected: ------------------------Activity B");
        }
    };
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //绑定Service
                Intent intent = new Intent(this, MyService.class);
                intent.putExtra("activity", "Activity_B");
                Log.d(TAG, "Activity B------执行了bindService");
                bindService(intent, serviceConnection, BIND_AUTO_CREATE);
                break;
            case R.id.btn2:
                if (isBind) {
                    Log.d(TAG, "Activity B------unbindService");
                    unbindService(serviceConnection);
                }
                break;
            case R.id.btn4:
                finish();
                Log.d(TAG, "Activity B------结束");
                break;
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "Activity B - onDestroy");
    }
}

OK,现在我们运行项目启动ActivityA

我们点击bindService,可以看到控制台的输出:

我们点击UnBindService按钮,控制台输出:

我们点击bindService后点击finish,控制台输出:

我们在Activity中bindService后在跳转到ActivityB,在ActivityB中bindService

我们在点击unBindService:

我们在ActivityB中点击bindService后点击finish:

这时我们回到ActivityA了,service还存在,我们在点击finish:

Service销毁了


测试总结

 经过上述的测试,我们来总结一下,当我们通过bindService绑定Service后,Service启动,并且会回调onServiceConnected()方法,我们可以通过这个回调获取到Service实例从而进行一些Service里面的操作。Service可以绑定多个Activity,连续多次调用bindService除第一次外其他绑定操作则没有任何方法执行(因为已经是绑定状态,不会重复绑定)。第一个绑定Service时,因为Service是首次绑定,所以Service会执行onCreat()方法,然后onBind(),onServiceConnected(),而后面的Activity执行BindService的时候,Service只会执行onServiceConnected()。当Activity与Service解除绑定是,会调用onUnBind(),当Service没有绑定的Activity时,会执行onUnBind(),OnDestory()。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值