我有一个非常简单的活动:
public class MainActivity extends Activity
{
private Intent serviceIntent;
public MainService mainService;
public ServiceConnection sc = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName className, IBinder service)
{
mainService = ((MainService.MainServiceBinder)service).getService();
Log.v("xxx", "[MainActivity]: onServiceConnected()");
}
@Override
public void onServiceDisconnected(ComponentName arg0)
{
mainService = null;
Log.v("xxx", "[MainActivity]: onServiceDisconnected()");
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
serviceIntent = new Intent(this, MainService.class);
}
@Override
public void osStart()
{
super.onStart();
// To call onServiceConnected() if the service already started
bindService(serviceIntent, sc, BIND_DEBUG_UNBIND)
}
@Override
public void onStop()
{
unbindService(sc);
super.onStop();
}
// android:onClick procedure for Button in layout/main.xml
public void doStartStopService(View Sender)
{
if(null == mainService)
{
startService(serviceIntent);
}
else
{
stopService(serviceIntent);
}
}
}
一个非常简单的服务:
public class MainService extends Service implements Runnable
{
private boolean isInterrupted = false;
private Thread thread;
class MainServiceBinder extends Binder
{
MainService getService()
{
return MainService.this;
}
}
@Override
public void onCreate()
{
Log.v("xxx", "[MainService]: onCreate()");
super.onCreate();
thread = new Thread(this);
thread.start();
}
// 1.6 only
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Log.v("xxx", "[MainService]: onStart()");
}
@Override
public void onDestroy()
{
Log.v("xxx", "[MainService]: onDestroy()");
if(thread.isAlive())
{
isInterrupted = true;
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0)
{
Log.v("xxx", "[MainService]: onBind()");
return new MainServiceBinder();
}
@Override
public boolean onUnbind(Intent intent)
{
Log.v("xxx", "[MainService]: onUnbind()");
return true;
}
@Override
public void run()
{
Log.v("xxx", "[MainService]: run() started");
while(!isInterrupted)
{
// ...
}
Log.v("xxx", "[MainService]: run() exiting");
}
}
当我在一个周期内调用doStartStopService()时,我得到了下一个日志:
[1]First StartService():
02-10 07:31:49.775: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:49.975: V/xxx(16306): [MainService]: onBind()
02-10 07:31:50.005: V/xxx(16306): [MainService]: onStart()
02-10 07:31:50.165: V/xxx(16306): [MainActivity]: onServiceConnected()
02-10 07:31:50.175: V/xxx(16306): [MainService]: run() started
[2]第一次停止服务():
02-10 07:31:52.205: V/xxx(16306): [MainActivity]: onServiceDisconnected()
02-10 07:31:52.205: V/xxx(16306): [MainService]: onUnbind()
02-10 07:31:52.215: V/xxx(16306): [MainService]: onDestroy()
02-10 07:31:52.235: V/xxx(16306): [MainService]: run() exiting
[3]第二个startService()-没有onBind()和onServiceConnect()调用:
02-10 07:31:54.355: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:54.365: V/xxx(16306): [MainService]: onStart()
02-10 07:31:54.365: V/xxx(16306): [MainService]: run() started
为什么当我调用startService()秒一次时,函数onBind()和onServiceConnected()没有调用?
最佳答案
如果绑定到服务,则服务onBind
将调用,因此第二个startService
调用(不绑定到此服务)需要再次调用bindService(serviceIntent, sc, BIND_DEBUG_UNBIND)
。