用bind的方法启动service,调用者退出后,service也销毁?

sis_ying 2011-03-19 11:29:01
资料上说有两种方式启动一个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,还在运行,这是为什么呢?
...全文
979 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangwm1219_ 2013-09-26
  • 打赏
  • 举报
回复
我试过按Back的话,Service 调用onUnbind,但是如果用手机任务管理器中直接清除程序,就不会调到onUnbind
ameyume 2011-03-21
  • 打赏
  • 举报
回复
看来这个问题还是需要实际验证下,退出activtiy时,到底会不会执行onUnbind,onDestroy.
ameyume 2011-03-20
  • 打赏
  • 举报
回复
bind方式启动的service,activity退出后,service还是可以继续运行的。
DrSmart 2011-03-20
  • 打赏
  • 举报
回复
贴代码,老实说服务的3种,我只有以一种和AIDL,简单绑定型还真没试过,你贴代码,我分析下
zzbinfo 2011-03-20
  • 打赏
  • 举报
回复
很多资料上都是象楼主贴的那样说的,绑定启动Service()后,就同生共死了。但是,如果,在biand 之前已经有startService()了,那就会直到,unbindService()和stoptService()之后Service才会被结束
sis_ying 2011-03-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 minyong86 的回复:]
Activity中是不是没写这个注销绑定的方法吧
unbindService(_connection);

bindService这种方式启动,在手机上按Home键Activity是不会退出的,再次进来点击绑定也不会执行任何方法,他是不执行onStart的,但是要按back的话,Activity会直接退出,Service调用onUnbind-->onDestroy
[/Quote]
Activity中没写注销绑定的方法是什么意思,我把activity中的代码贴出来:

private ServiceConnection mServiceConnection = new ServiceConnection() {

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);
}
}
活着便精彩 2011-03-20
  • 打赏
  • 举报
回复
Activity中是不是没写这个注销绑定的方法吧
unbindService(_connection);

bindService这种方式启动,在手机上按Home键Activity是不会退出的,再次进来点击绑定也不会执行任何方法,他是不执行onStart的,但是要按back的话,Activity会直接退出,Service调用onUnbind-->onDestroy
youngwolf 2011-03-20
  • 打赏
  • 举报
回复
我也觉得文档里面说的有问题。
activity退出时,不会影响Service(通过bind方式创建的)的运行,也不会自动调用UnbindService,相反,如果手动调用UnbindService,反而会让Service崩溃。

80,469

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧