【发布时间】:2017-12-24 03:37:23
【问题描述】:
我想从 Activity 启动服务,然后让它继续运行,即使在 Activity 退出/完成时也是如此。然后,当我再次启动应用程序活动时,它会重新附加到现有服务。
我已经阅读了有关 bindService 的文档,但每次我点击后退按钮退出活动时,都会自动调用服务的 onUnBind,从而有效地终止服务。我想我必须在服务解除绑定之前手动调用 unbindService。
我确实知道,一旦 Activity 被销毁,成员变量 mService、mBound 和 tv 必须在新 Activity 创建后重新填充,因此下面的简单代码将显示 "bindService 已启动也就不足为奇了。 " 但我原以为 LocalService 实例中的所有成员变量都是相同的,未更改,因此 "bindService 已经启动。Val = " + mService.myval; 应该保持每次我重新启动一个新活动时都一样,不是吗?
MainActivity
public class MainActivity extends AppCompatActivity
{
LocalService mService;
Boolean mBound = false;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.textView);
}
@Override
protected void onStart()
{
super.onStart();
}
@Override
protected void onStop()
{
super.onStop();
}
@Override
protected void onDestroy()
{
super.onDestroy();
}
public void onButtonStart(View v)
{
String str;
// Bind to LocalService
if (!mBound)
{
Intent intent = new Intent(this, LocalService.class);
if (!bindService(intent, mConnection, Context.BIND_AUTO_CREATE))
{
unbindService(mConnection);
str = "bindService failed?!";
}
else
{
str = "bindService started.";
}
}
else
str = "bindService already Started. Val = " + mService.myval;
tv.setText(str);
}
public void onButtonStop(View v)
{
if (mBound)
{
mService.stop();
unbindService(mConnection);
mBound = false;
tv.setText("Stopped Service");
}
else
tv.setText("Service is not running");
}
private ServiceConnection mConnection = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName className, IBinder service)
{
// We've bound to LocalService, cast the IBinder and get LocalService instance
LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0)
{
mBound = false;
}
};
}
本地服务
public class LocalService extends Service
{
private final IBinder mBinder = new LocalBinder();
private final Random mGenerator = new Random();
public int myval = getRandomNumber();
@Override
public void onCreate()
{
super.onCreate();
}
// Service is being Destroyed
@Override
public void onDestroy()
{
super.onDestroy();
}
public int getRandomNumber()
{
return mGenerator.nextInt(100);
}
@Override
public IBinder onBind(Intent intent)
{
return mBinder;
}
// Client is Unbinding via the unbindService() call
@Override
public boolean onUnbind(Intent intent)
{
return super.onUnbind(intent);
}
public class LocalBinder extends Binder
{
public LocalService getService()
{
return LocalService.this;
}
}
}
【问题讨论】:
标签: android service binding destroy