Android四大组件之Service

本文介绍了Android系统中的Service组件,强调其后台运行特性但并非在子线程,详细解析了通过startService()和bindService()启动Service的生命周期,并提供了示例代码展示如何与Service交互。注意Service的耗时操作应在子线程中执行,以避免ANR问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Service介绍

    Service是android 系统中的四大组件之一,它跟Activity的级别差不多,但不能页面显示只能后台运行,并且可以和其他组件进行交互。
    比如:下载、播放音乐等
    我们一定要知道的是这里Service的后台运行并不是子线程。Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR(application not response–程序没有响应)。
     我们要知道的是主线程的内容包括UI和后台。只要程序中的UI或后台其中一个在跑,程序都算是在运行状态。

服务有两种方式启动

Context.startService() 和 Context.bindService()

startService()生命周期分析

(1)启动服务startService : –>onCreate()–> onStart()
(2)停止服务stopService : –>onDestroy()
   如果调用者直接退出而没有停止Service,则Service 会一直在后台运行。这里的退出只是关闭了UI界面。
   startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方 法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用 startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用 startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时 会调用生命周期的onDestroy()方法。

bindService()生命周期分析

(1)绑定bindService : –> onCreate() –> onBind()
(2)解绑unbindService: –>onUnbind()
(3)正常停止程序服务的方法是先解绑unbindService,再停止服务stopService。
(4)如果绑定后调用stopService 方法,这时是不能停止服务的,如果这时再调用解绑unbindService,程序后先解绑,后停止服务。
    用bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate() 方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,
调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说 onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑 定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()->onDestroy()方法。

第二种方式启动

public class MyService extends Service {
    public MyService() {
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("tag", "onCreate: 服务");
    }

    public class MyBinder extends Binder {
        public MyService getMyserver(){
            return MyService.this;
        }
    }

    public void time(){
        Toast.makeText(this, "你好世界", Toast.LENGTH_SHORT).show();
    }
}

清单文件

        <service
            android:name=".server.MyService"
            android:enabled="true"
            android:exported="true"></service>

绑定

public class DataFragment extends BaseFragment {


    private MyService myserver;
    private ServiceConnection serviceConnection;
    private Button btn;

    @Override
    public int layoutId() {
        return R.layout.fragment_data;
    }

    @Override
    public void initView() {
        //1.绑定服务
        Intent intent = new Intent(getActivity(), MyService.class);
        //绑定服务连接
        serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyService.MyBinder myBinder = (MyService.MyBinder) service;
                myserver = myBinder.getMyserver();
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
        //参数一:intent意图  参数二:绑定服务连接  参数三:flag标记BIND_AUTO_CREATE 绑定的时候自动创建服务
        getActivity().bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
        btn = (Button) findViewById(R.id.btn);
    }

    @Override
    public void initData() {
        //调用服务方法
        btn.setOnClickListener(v ->{
            myserver.time();
        });
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //解除绑定
        getActivity().unbindService(serviceConnection);

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值