Android四大组件之Service

  • 请介绍下Service的生命周期?
    官方生命周期图
  • Services生命周期常用的方法

1. 4个手动调用的方法

手动调用 方法
startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务

2. 5个自动调用的方法

内部自动调用 方法
onCreate() 创建服务
onStartCommand() 开始服务
onDestroy() 销毁服务
onBind() 绑定服务
onUnbind() 解绑服务
  • Service生命周期调用方法详解
    示意图
  • Services生命周期使用
    示意图
  • Service两种启动方式的区别
  1. 两种启动方式不同
    第一种:startService

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的startService(Intent)方法启动该Service
4.不再使用时,调用stopService(Intent)方法停止该服务

onCreate()--->onStartCommand()(onStart()方法已过时)  ---> onDestory()

第二种:bindService

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的bindService(Intent, ServiceConnection, int)方法启动该Service
4.不再使用时,调用unbindService(ServiceConnection)方法停止该服务

onCreate() --->onBind()--->onunbind()--->onDestory()
  1. 两种生命周期不同
  • startService()开启的service,调用者退出后,service仍然存在
  • BindService()开启的service,调用者退出后,Service随着调用者退出销毁
  • startService()开启的service,无法操作service
  • BindService()开启的service,可以绑定,也可以操作service
  1. 绑定者如何调用服务里的方法呢
    1、首先自定义一个Service的子类
public class MyService extends Service {

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        //返回MyBind对象
        return new MyBinder();
    }

    private void methodInMyService() {
        Toast.makeText(getApplicationContext(), "服务里的方法执行了。。。",
                Toast.LENGTH_SHORT).show();
    }

    /**
     * 该类用于在onBind方法执行后返回的对象,
     * 该对象对外提供了该服务里的方法
     */
    private class MyBinder extends Binder implements IMyBinder {

        @Override
        public void invokeMethodInMyService() {
            methodInMyService();
        }
    }
}

自定义MyBinder接口用于保护服务中心不想让外界访问的方法。

public interface IMyBinder {

     void invokeMethodInMyService();

}

在Manifest.xml文件中配置该Service

<service android:name=".MyService"/>

Activity绑定并调用布局

<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:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="start"
        android:text="开启服务"
        android:textSize="30sp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="invoke"
        android:text="调用服务的方法"
        android:textSize="30sp" />
</LinearLayout>

绑定服务的Activity

public class MainActivity extends Activity {

    private MyConn conn;
    private Intent intent;
    private IMyBinder myBinder;

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

    //开启服务按钮的点击事件
    public void start(View view) {
        intent = new Intent(this, MyService.class);
        conn = new MyConn();
        //绑定服务,
        // 第一个参数是intent对象,表面开启的服务。
        // 第二个参数是绑定服务的监听器
        // 第三个参数一般为BIND_AUTO_CREATE常量,表示自动创建bind
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    //调用服务方法按钮的点击事件
    public void invoke(View view) {
        myBinder.invokeMethodInMyService();
    }

    private class MyConn implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //iBinder为服务里面onBind()方法返回的对象,所以可以强转为IMyBinder类型
            myBinder = (IMyBinder) iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
        }
    }
}

绑定本地服务调用方法的步骤

  • 在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
  • 实现服务的onbind方法,返回的就是这个内部类
  • 在activity 绑定服务。bindService();
  • 在服务成功绑定的回调方法onServiceConnected, 会传递过来一个 IBinder对象
  • 强制类型转化为自定义的接口类型,调用接口里面的方法。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。