资料上说有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate -> onStart
stopService的时候直接onDestroy
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。2 通过bindService
Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起
调用者退出了,Service就会调用onUnbind->onDestroyed,所谓绑定在一起就共存亡了。并且这种方式还可以使得调用方(例如)调用服务上的其他的方法。
关于第2点说调用者退出了,那么Service就会调用onUnbind->onDestroyed。我写了一个demo查看生命周期发现并不是这样的,调用的activity退出了,service并没有调用onDestroyed,还在运行,这是为什么呢?
1 通过startService
Service会经历 onCreate -> onStart
stopService的时候直接onDestroy
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。2 通过bindService
Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起
调用者退出了,Service就会调用onUnbind->onDestroyed,所谓绑定在一起就共存亡了。并且这种方式还可以使得调用方(例如)调用服务上的其他的方法。
关于第2点说调用者退出了,那么Service就会调用onUnbind->onDestroyed。我写了一个demo查看生命周期发现并不是这样的,调用的activity退出了,service并没有调用onDestroyed,还在运行,这是为什么呢?
解决方案 »
- 按下 Power 键, 当前Activity 就被销毁了,怎么做到不销毁
- webView的一个小问题
- android 系统源码中的/android2.3.4/packages/apps/VoiceDialer 如何才能用起来?
- android drawText无法显示文字
- 如何唤醒在后台运行的activity
- 请问如何在设置VideoView的全屏播放和保持视频原尺寸播放
- 关于Android中的时间监听问题
- 使用Navigation Up功能返回导致父activity重新创建
- Android和JS交互的问题
- 使用属性动画不停旋转图片的时候出现内存泄漏,跪求帮助该怎么解决!!!
- 甲骨文状告谷歌Android侵犯Linux开源许可
- 用intent切换界面时socket连接的问题
activity退出时,不会影响Service(通过bind方式创建的)的运行,也不会自动调用UnbindService,相反,如果手动调用UnbindService,反而会让Service崩溃。
unbindService(_connection);bindService这种方式启动,在手机上按Home键Activity是不会退出的,再次进来点击绑定也不会执行任何方法,他是不执行onStart的,但是要按back的话,Activity会直接退出,Service调用onUnbind-->onDestroy
public void onServiceConnected(ComponentName name,IBinder service)
{
mMyService = ((MyService.MyBinder)service).getService();
mTextView.setText("I am from Service : "+ mMyService.getSystemTime());
}
public void onServiceDisconnected(ComponentName name)
{
}
};
@Override
public void onCreate(Bundle saveInstanceState)
{
super.onCreate(saveInstanceState);
setContentView(R.layout.main);
setupViews();
Log.e(TAG, "start onCreate...");
Toast.makeText(getBaseContext(), "Activity onCreate", Toast.LENGTH_SHORT).show();
}
@Override
public void onStart()
{
super.onStart();
Log.e(TAG, "start onStart...");
Toast.makeText(getBaseContext(), "Activity onStart", Toast.LENGTH_SHORT).show();
}
@Override
public void onResume()
{
super.onResume();
Log.e(TAG, "start onResume...");
Toast.makeText(getBaseContext(), "Activity onResume", Toast.LENGTH_SHORT).show();
}
@Override
public void onPause()
{
super.onPause();
Log.e(TAG, "start onPause...");
Toast.makeText(getBaseContext(), "Activity onPause", Toast.LENGTH_SHORT).show();
}
@Override
public void onStop()
{
super.onStop();
Log.e(TAG, "start onStop...");
Toast.makeText(getBaseContext(), "Activity onStop", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e(TAG, "start onDestroy...");
Toast.makeText(getBaseContext(), "Activity onDestroy", Toast.LENGTH_SHORT).show();
}
public void setupViews()
{
mContext = ServiceLifeCycle.this; //通过debug,发现mContext id=8300604484368,类似于Win32的句柄
mTextView = (TextView)findViewById(R.id.text);
startServiceButton = (Button)findViewById(R.id.startservice);
stopServiceButton = (Button)findViewById(R.id.stopservice);
bindServiceButton = (Button)findViewById(R.id.bindservice);
unbindServiceButton = (Button)findViewById(R.id.unbindservice);
startServiceButton.setOnClickListener(this);
stopServiceButton.setOnClickListener(this);
bindServiceButton.setOnClickListener(this);
unbindServiceButton.setOnClickListener(this);
}
public void onClick(View v) //这样也是一种注册事件的方法,一般的写法就直接写在setOnClickListener的后面了,这里单独写出来也是可以的
{
if (v == startServiceButton)
{
//Intent i = new Intent();
//i.setClass(ServiceLifeCycle.this, MyService.class); //从Activity跳转到Service
//mContext.startService(i);
//startService(i); 这里直接用也可以,不要mContext来调,二者有何区别
//以上代码和下面一句代码等效
startService(new Intent(this, MyService.class));
}
else if (v == stopServiceButton)
{
Intent i = new Intent();
i.setClass(ServiceLifeCycle.this, MyService.class);
mContext.stopService(i);
}
else if (v == bindServiceButton)
{
Intent i = new Intent();
i.setClass(ServiceLifeCycle.this, MyService.class);
mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
}
else
{
mContext.unbindService(mServiceConnection);
}
}