服务跟活动的区别其实差别不大,主要的区别在于一个有界面一个没有界面。
生命周期:
想对于活动来说,生命周期多了两个方法,onbind()和onunbind()。
活动:
public class Main extends Activity implements OnClickListener {
private Intent intent;
private Button start;
private Button stop;
private Button skip;
// 保持启动的binder对象
MyBinder binder;
// 定义服务连接对象
ServiceConnection conn = new ServiceConnection() {
// 当活动与服务连接断开时,回调该方法
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "断开连接", 1000).show();
}
// 当活动与服务连接成功时,回调该方法
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
// 获取onbind()放回的对象
binder = (MyBinder) service;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
public void initView() {
start = (Button) findViewById(R.id.btn_start);
stop = (Button) findViewById(R.id.btn_stop);
skip = (Button) findViewById(R.id.btn_skip);
start.setOnClickListener(this);
stop.setOnClickListener(this);
skip.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
intent = new Intent();
intent.setAction("service_myservice");
if (v == start) {
// 绑定指定的服务
bindService(intent, conn, Service.BIND_AUTO_CREATE);
} else if (v == stop) {
// 获取serviec内容
Log.i("geti:", binder.getI() + "***");
// 解除绑定
unbindService(conn);
} else if (v == skip) {
intent = new Intent(this, Second.class);
startActivity(intent);
this.finish();
}
}
}
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="start" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="stop" />
<Button
android:id="@+id/btn_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转" />
</LinearLayout>
自定义服务:
public class MyService extends Service {
int i = 0;
MyBinder myBinder = new MyBinder();
// 必须实现的方法
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return myBinder;
}
// 创建的时候,回调该方法
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
i = 10;
Log.i("onCreate", "******");
}
// 断开连接的时候,回调该方法
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.i("onUnbind", "******");
return super.onUnbind(intent);
}
// 关闭之前,回调该方法
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("onDestroy", "******");
}
class MyBinder extends Binder {
public int getI() {
return i;
}
}
}
注意:
1.绑定的服务,随着访问者的生命消亡而消亡(是指的是访问者被调用了finish而消亡,而不是stop())。
2.其实更普遍的做法是ibinder返回的是service服务本身,那样能更简单的调用服务的方法。