服务客户端(Activity):
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.util.Log;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private final String TAG = "ActivityBindLocalService";
- private LocalService mLocalService;
- private boolean mIsBound;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Button bindLocalService = (Button) findViewById(R.id.bind_local_service);
- bindLocalService.setOnClickListener(bindClickListener);
- Button unBindLocalService = (Button) findViewById(R.id.unBind_local_service);
- unBindLocalService.setOnClickListener(unBindOnClickListener);
- }
- private final OnClickListener bindClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- doBindService();
- }
- };
- private final OnClickListener unBindOnClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- doUnBindService();
- }
- };
- private void doBindService(){
- //将此Activity和LocalService绑定,然后会执行ServiceConnection里面的onServiceConnected
- Log.i(TAG, "MainActivity ----> bindService");
- bindService(new Intent(MainActivity.this, LocalService.class),
- mServiceConnection, Context.BIND_AUTO_CREATE);
- mIsBound = true;
- }
- private void doUnBindService(){
- if (mIsBound) {
- //将此Activity和LocalService解除绑定,会直接执行LocalService的onDestory方法,将此Service销毁
- unbindService(mServiceConnection);
- mIsBound = false;
- }
- }
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- mLocalService = null;
- Toast.makeText(MainActivity.this,
- "Disconnected from local service, 只有在异常的情况才会调用onServiceDisonnected方法",
- Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- //获得LocalService实例,注意:此时仅仅是将Activity和LocalService绑定起来了,但并没有启动Service
- //如果要启动LocalService,
- //只需要执行mLocalService.startService(new Intent(MainActivity.this, LocalService.class));
- Log.i(TAG, "MainActivity ----> onServiceConnected");
- mLocalService = ((LocalService.LocalBinder)service).getLocalService();
- Toast.makeText(MainActivity.this, "Connected to local service", Toast.LENGTH_SHORT).show();
- }
- };
- /**
- * 此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。
- * 返回true则显示该menu,false 则不显示;
- * (只会在第一次初始化菜单时调用)
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- }
本地服务类(Service):
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.util.Log;
- public class LocalService extends Service {
- private final String TAG = "ActivityBindLocalService";
- private final IBinder mBinder = new LocalBinder();
- /**
- * 返回LocalBinder对象
- */
- @Override
- public IBinder onBind(Intent intent) {
- Log.i(TAG, "LocalService ----> LocalService onBind");
- return mBinder;
- }
- /**
- * 创建一个内部类用来返回LocalService实例
- * @author Simon Xu
- *
- * 2013-4-10下午2:34:33
- */
- public class LocalBinder extends Binder{
- LocalService getLocalService(){
- Log.i(TAG, "localService ----> return LocalService");
- return LocalService.this;
- }
- }
- @Override
- public void onCreate() {
- Log.i(TAG, "LocalService----> LocalService onCreate");
- super.onCreate();
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.i(TAG, "LocalService----> LocalService onStartCommand");
- return START_STICKY;
- }
- @Override
- public void onDestroy() {
- Log.i(TAG, "LocalService----> LocalService onDestroy");
- super.onDestroy();
- }
- }
(此图来源于<<Android框架揭秘>>一书)
转载于:https://blog.51cto.com/sinmo/1175616