我有一个实现以下回调方法的服务。
public bound = false;
@Override
public IBinder onBind(Intent intent) {
bound = true;
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_NOT_STICKY;
}
@Override
public boolean onUnbind(Intent intent) {
bound = false;
return true;
}
@Override
public void onRebind(Intent intent) {
bound = true;
}
@Override
public void onDestroy() {
//super.onDestroy();
}
在我的活动中,我有以下三个按钮点击代码。
if(v.getId() == R.id.bind)
{
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
else if(v.getId() == R.id.unbind)
{
unbindService(mConnection);
}
else if (v.getId() == R.id.rebind)
{
Intent intent = new Intent(this, LocalService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
我首先绑定,取消绑定然后调用rebind。在绑定和重新绑定的情况下,调用onCreate()
和onBind()
服务方法。永远不会调用onRebind()
。我错过了什么吗?
答案 0 :(得分:1)
您可以按照以下步骤操作:
示例代码:
MyService.java
package com.example.service_lifecycle;
public class MyService extends Service {
@Override
public void onCreate() {
Toast.makeText(getApplicationContext(), "I am in on create method.", Toast.LENGTH_SHORT).show();
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "I am in on start command method. " + mStartMode, Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(getApplicationContext(), "I am in on bind method. " + mBinder, Toast.LENGTH_SHORT).show();
return null;
}
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(getApplicationContext(), "I am in on unbind method. " + mAllowRebind, Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onRebind(Intent intent) {
Toast.makeText(getApplicationContext(), "I am in on rebind method.", Toast.LENGTH_SHORT).show();
super.onRebind(intent);
}
@Override
public void onDestroy() {
Toast.makeText(getApplicationContext(), "I am in on destroy method.", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
}
ServiceLifeCycleActivity.java
package com.example.service_lifecycle;
import com.example.androidpractice.R;
public class ServiceLifeCycleActivity extends ActionBarActivity implements OnClickListener{
private Button btnStartService;
private Button btnStopService;
private Button btnBindService;
private Button btnUnbindService;
private boolean isServiceBind = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service_life_cycle);
btnStartService = (Button)findViewById(R.id.btnStartService);
btnStartService.setOnClickListener(this);
btnStopService = (Button)findViewById(R.id.btnStopService);
btnStopService.setOnClickListener(this);
btnBindService = (Button)findViewById(R.id.btnBindService);
btnBindService.setOnClickListener(this);
btnUnbindService = (Button)findViewById(R.id.btnUnbindService);
btnUnbindService.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.service_life_cycle, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStartService:
startService(new Intent(this, MyService.class));
break;
case R.id.btnStopService:
stopService(new Intent(this, MyService.class));
break;
case R.id.btnBindService:
bindService(new Intent(this, MyService.class), mServiceConnection, Context.BIND_AUTO_CREATE);
isServiceBind = true;
break;
case R.id.btnUnbindService:
if(isServiceBind){
if(mServiceConnection != null){
unbindService(mServiceConnection);
}
isServiceBind = false;
}
else{
Toast.makeText(this, "Service is not bound.", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
// Code to manage Service lifecycle.
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName comName, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName comName) {
}
};
}
res/layout/activity_service_life_cycle.xml
<Button
android:id="@+id/btnStartService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Start Service" />
<Button
android:id="@+id/btnStopService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btnStartService"
android:layout_centerHorizontal="true"
android:layout_marginTop="19dp"
android:text="Stop Service" />
<Button
android:id="@+id/btnBindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btnStopService"
android:layout_below="@+id/btnStopService"
android:layout_marginTop="18dp"
android:text="Bind Service" />
<Button
android:id="@+id/btnUnbindService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btnBindService"
android:layout_centerVertical="true"
android:text="Unbind Service" />
如果您有任何疑问,请与我联系。
感谢。