Service完全在后台运行,没有用户界面。使用的时候先创建Service子类,然后在AndroidManifest.xml中进行注册,同时可以通过<intent-filter.../>进行限制启动的Intent。
Service中重要的方法有:
1.IBinder onBind(Intent intent):这是Service子类必须实现的方法,这个方法返回一个IBinder对象,应用程序可以通过该对象与Service对象进行通信;
2.void onCreate():在Service第一次被创建的时候调用;
3.void onDestroy():在Service被关闭之前调用;
4.void onStartCommand(Intent intent, int flags, int startId):该方法在客户端调用startService(Intent)来启动Service的时候调用;
5.boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接的时候调用这个方法。
第一种方式:使用Activity访问Service
启动Service:startService(Intent intent)
关闭Service:stopService(Intent intent)
第二种方式:绑定本地Service并与之通信
如果Service和访问者之间需要进行方法调用和数据交换,则应该使用bindService()和unbindService()来启动和关闭Service。
Context的bindService()方法
bindService(Intent service, ServiceConnection conn, int flags)
(1)service指定需要启动的Service
(2)conn是一个ServiceConnection对象,这个对象用于监听访问者和Service之间的连接情况。当访问者与Service之间连接成功之后会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法,当Service所在的宿主进程异常中断或其他原因停止的时候,会回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。
(3)flags指定绑定的时候是否自动创建Service(如果Serivice没有创建)。这个参数可以指定为0,或者BIND_AUTO_CREATE(自动创建)。
ServiceConnection对象的onServiceConnected()方法中有一个IBinder对象,这个对象可实现与被绑定的Service之间的通信。
Service有两种方式调用:
1.start
一旦某个组件start一个Service,Service开始独立运行,不再与原来的组件产生任何联系;
2.bind
一旦某个组件bind一个Service,Service会为组件提供一个接口,近似于客户端,会进行交互。
MyService.java
public class MyService extends Service { private static final String TAG = "MyService"; //只有在第一次的时候才会被调用 public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate"); } //在销毁的时候才会被调用 @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestroy"); } //每次请求的时候都会被调用 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind"); return new MyBinder(); } class MyBinder extends Binder { } }
重写了一系列的方法,实现了输出功能。
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button button_start; Button button_stop; Button button_bindservice; Button button_unbindservice; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //连接失败 Log.i("Activity", "onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { //连接成功 Log.i("Activity", "onServiceDisconnected"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建启动Service的Intent final Intent intent = new Intent(this, MyService.class); init(); //设置监听事件 } public void init() { button_start = (Button)findViewById(R.id.StartService); button_start.setOnClickListener(this); button_stop = (Button)findViewById(R.id.StopService); button_stop.setOnClickListener(this); button_bindservice = (Button)findViewById(R.id.BindService); button_bindservice.setOnClickListener(this); button_unbindservice = (Button)findViewById(R.id.UnbindService); button_unbindservice.setOnClickListener(this); } public void onClick(View view) { Intent intent = new Intent(MainActivity.this, MyService.class); switch (view.getId()) { case R.id.StartService: startService(intent); break; case R.id.StopService: stopService(intent); break; case R.id.BindService: bindService(intent, conn, BIND_AUTO_CREATE); break; case R.id.UnbindService: //只需要关闭连接即可 unbindService(conn); break; } } }
可以对各个按钮单独设置监听点击的事件,也可以直接统一进行操作。