활동에서 서비스를 시작한 다음 활동이 종료되거나 종료 될 때도 서비스를 계속 실행하려고합니다. 그런 다음 앱 활동을 다시 시작하면 기존 서비스에 다시 연결됩니다.활동이 파괴되면 서비스가 자멸하는 이유는 무엇입니까?
나는 bindService에 대한 문서를 읽었지만 뒤로 버튼을 눌러 활동을 종료 할 때마다 서비스의 onUnBind가 자동으로 서비스를 효과적으로 종료한다고합니다. 서비스가 언 바운드되기 전에 수동으로 unbindService를 호출해야한다고 생각했습니다.
일단 Activity가 삭제되면 새로운 Activity가 생성되면 멤버 변수 mService, mBound 및 tv가 다시 채워 져야하므로 밑의 간단한 코드에서 "bindService started"가 표시된다는 사실을 놀랍지 않습니다.하지만 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;
}
};
}
LocalService를
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;
}
}
}