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;
}
}
}
可以对各个按钮单独设置监听点击的事件,也可以直接统一进行操作。