关于service,我在bindService这里卡了一下,这里总结一下bindService。可以参见这篇文章(http://que2010.iteye.com/blog/1339791)
那么我自己的总结:先来说一下MyService里要怎么写:
MyService类
public class MyService extends Service {
private MyBinder mbinder = new MyBinder() ;
public class MyBinder extends Binder{
MyService getMyService(){
Log.e("MyService","getMyService");
return MyService.this;
}
}
@Override
public IBinder onBind(Intent arg0) {
Log.e("MyService","onBind");
// TODO Auto-generated method stub
return mbinder;
}
public void play(){
Log.e("MyService","play");
}
@Override
public void onCreate() {
Log.e("MyService","onCreate");
// TODO Auto-generated method stub
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("MyService","onDestroy");
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public void onRebind(Intent intent) {
Log.e("MyService","onRebind");
// TODO Auto-generated method stub
super.onRebind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
Log.e("MyService","onStart");
// TODO Auto-generated method stub
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("MyService","onStartCommand");
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("MyService","onUnbind");
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
}
BindServiceTestActivity类,主要用于绑定Service
public class BindServiceTestActivity extends Activity {
/** Called when the activity is first created. */
private Button but1;
private Button but2;
private MyService myService;
private MyBinder binder;
private Context mcontext;
private boolean isBind ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
but1 = (Button) findViewById(R.id.but1);
but2 = (Button) findViewById(R.id.but2);
Intent intent1 = new Intent(BindServiceTestActivity.this,MyService.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
isBind = bindService(intent1, conn,Context.BIND_AUTO_CREATE);//如果这里用getApplicationContext()那么unbind时也要用这个,将这个上下文提升到 //全局,而不仅仅是当前Activity的Context
but1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.e("BindServiceTestActivity", "bind");
myService.play();
}
});
but2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isBind){
unbindService(conn);
Log.e("BindServiceTestActivity", "unbind");
isBind = false ;
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("BindServiceTestActivity", "onServiceConnected");
// TODO Auto-generated method stub
binder = (MyBinder) service;
myService = binder.getMyService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
binder = null ;
}
};
}
当点击bind按钮时:直接就调用了play方法
当点击unbind时:onUnbind-->onDestroy
这里没有调用onCreate(),是因为之前在调用的时候就指定了AUTO_CREATE,那为啥没得onStart()呢?
另外一种方式:
通过startService(),的话:onCreate()-->onStartCommand-->onStart() (多次startService,只执行一次onCreate())
stopService()的话: onDestroy()