Android 四大组件学习之Service三
上节我们学习了,怎样用StartService启动服务,这节学习怎样用BindService启动一个服务
首先看MyActivity的代码部分:
public class MyActivity extends Activity {
private Button btn_start;
private Button btn_end;
private MyServiceConnection sConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myservice);
btn_start = (Button)findViewById(R.id.button1);
btn_end = (Button)findViewById(R.id.button2);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 启动服务
Intent intent = new Intent(MyActivity.this, MyService.class);
//startService(intent);
Log.i("MyActivity", "创建服务按钮被按下!");
bindService(intent, sConnection, Context.BIND_AUTO_CREATE);
}
});
btn_end.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 销毁服务
Intent intent = new Intent(MyActivity.this, MyService.class);
//stopService(intent);
Log.i("MyActivity", "销毁服务按钮被按下!");
unbindService(sConnection);
}
});
}
public class MyServiceConnection implements ServiceConnection
{
@Override//当连接服务成功后调用
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
Log.i("MyActivity", "onServiceConnected");
}
@Override//当server所在的进程因为异常终止或者其它原因终止调用
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
Log.i("MyActivity", "onServiceDisconnected");
}
}
}
这次我们用的是bindService启动服务,而bindService和StartServer明显不同的就是传递的參数不同。bindService须要三个參数:
參数1: Intent不用多说
參数2:该參数是一个ServiceConnection的对象,该对象用于监听訪问者和Service之间的连接情况。
当中。OnServiceConnected是当调用者与服务连接成功后调用。注意的是OnserviceDisconnected不是调用者与服务断开时后调用,而是因为某种原因异常终止等才调用
參数3:指定绑定时是否自己主动创建service,当然了是service还没创建时。
布局文件和上一次的一样。不再多说
MyService的代码例如以下:
public class MyService extends Service {
private MyThread thread;
private boolean stopFlag = false;
@Override//必须实现的方法
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
//服务执行后。启动线程
if(!stopFlag)
{
thread.start();
thread.setFlag(true);
}
Log.i("MyService", "onBind------------");
return null;
}
@Override//被创建时的调用
public void onCreate() {
// TODO Auto-generated method stub
//服务创建时。实例化MyThread
thread = new MyThread();
Log.i("MyService", "onCreate------------");
super.onCreate();
}
@Override
@Deprecated//OnStart方法如今被OnStartCommd已经代替,事实上在OnStartCommand也调用了OnStart
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.i("MyService", "onStart------------");
}
@Override//启动时会调用
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i("MyService", "onStartCommand------------");
//服务执行后,启动线程
if(!stopFlag)
{
thread.start();
thread.setFlag(true);
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
//服务销毁时,停止线程任务
thread.setFlag(false);
Log.i("MyService", "onDestroy------------");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.i("MyService", "onUnbind------------");
return super.onUnbind(intent);
}
class MyThread extends Thread
{
//设置flag
public void setFlag(Boolean flag)
{
stopFlag = flag;
}
@Override
public void run() {
super.run();
while(stopFlag)
{
//设置时间的输出方式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(new Date());
//显示时间
Log.i("MyService", time);
try {
//延迟一秒
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}当然了记得在配置文件里注冊service
接下来看结果分析:
当点击启动服务后:
能够看到服务已经绑定
当点击销毁服务后:
能够看到服务已经解绑。同一时候服务销毁了。
今天关于bindService启动服务就到这里
浙公网安备 33010602011771号