Android Service用法详解

本文详细介绍了Android中的Service组件,包括它的特点、生命周期以及启动方式。通过两个具体实例,对比了使用context.startService()和context.bindService()的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Service?

Service是 Android 系统中的一种组件,它和Activity的级别差不多,但又Activity不同,它是不能与用户交互的,但可以和其他组件进行交互。它不能自己运行,只能后台运行。


Service的特点:没有可视的UI、后台运行,运行不阻塞前台UI、拥有服务的进程具有较高的优先级


Service的生命周期:

Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。


服务启动的两种方式及用法:context.startService()和context.bindService()方式启动

提醒:使用Service之前必须在androidMainfest.xml 中注册


① context.startService()

     启动:context.startService() ---> onCreate() ---> onStartCommand()

     销毁:ontext.stopService()   ---> onDestroy();

     如果Service还没运行,则Android会先调用onCreate()方法,然后再调用onStartCommand();
     如果Service已经运行了,则只调用onStartCommand(),所以一个Service的onStartCommand(),方法      可能会调用多

实例代码:通过打印结果可知其执行顺序

com.liu.activity包:

public class ServiceTestActivity extends Activity {

	private Button btn_start, btn_end;

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.service_test);

		btn_start = (Button) findViewById(R.id.btn_satrt);
		btn_end = (Button) findViewById(R.id.btn_end);

		btn_start.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("--->启动服务");
				// 通过 Intent 启动已注册的 service
				startService(new Intent("com.sharpandroid.Music"));

			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("--->停止服务");
				stopService(new Intent("com.sharpandroid.Music"));

			}
		});

	}

}



com.liu.service包:

public class Service_MusicPlayer extends Service {

	private final String TAG = "Service_MusicPlayer";
	MediaPlayer mPlayer;

	public void onCreate() {
		Log.i(TAG, "--------->OnCreate()");
		super.onCreate();
	}

	public void onStart(Intent intent, int startId) {
		Log.i(TAG, "--------->OnStart()");
		// 在layout下创建raw文件夹,放一个音乐文件(自命名如music)在raw下
		mPlayer = MediaPlayer.create(this, R.raw.music);
		super.onStart(intent, startId);
		mPlayer.start();
	}

	public void onDestroy() {
		Log.i(TAG, "--------->onDestroy()");
		super.onDestroy();
		mPlayer.stop();
	}

	public IBinder onBind(Intent intent) {
		return null;
	}

}

结果: 

 





② context.bindService()

     启动:context.bindService() ---> onCreate() --->onBind();
     销毁:onUnibind() ---> onDestroy()
     onBind()方法将返回给客户端一个IBind接口实例,IBind允许客户端调用服务的方法,比如得到Service 允许状态或者其他操作这个时 ?       候调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Service就会调用onUnibind() ---> onDesytoy()相应退出 

实例代码:

com.liu.activity包

public class TestActivity extends Activity {

	private Button btn_satrt, btn_end;
	private Bind_Service Bind_Service = null;
	protected boolean isBound = false;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btn_satrt = (Button) findViewById(R.id.btn_start);
		btn_end = (Button) findViewById(R.id.btn_end);

		btn_satrt.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("Bind服务");
				Intent intent = new Intent(TestActivity.this,
						Bind_Service.class);
				// bindService(service, conn, flags)用来绑定一个服务
				TestActivity.this.bindService(intent, mConnection,
						Context.BIND_AUTO_CREATE);
				isBound = true;
			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
			if (isBound) {
				System.out.println("unBind服务");
				// unbindService(conn)解除绑定
				TestActivity.this.unbindService(mConnection);
                        }
                       }
		});
	}
    //ServiceConnection是bindService()的关键步骤,将Activity与Service捆绑在一起
	private ServiceConnection mConnection = new ServiceConnection() {

		public void onServiceDisconnected(ComponentName name) {
			Bind_Service = null;
        }

		public void onServiceConnected(ComponentName name, IBinder service) {
         Bind_Service = ((Bind_Service.LocalBinder) service).getService();
		}
	};
}
com.liu.service包:

public class Bind_Service extends Service {

	//内部类,作用返回Bind_Service对象
	public class LocalBinder extends Binder {
		public Bind_Service getService() {
			return Bind_Service.this;
		}
	}

	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("------->onBind()");
		return null;
	}

	@Override
	public void onCreate() {
		System.out.println("------->onCreate()");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		System.out.println("------->onDestroy()");
		super.onDestroy();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		System.out.println("------->onStart()");
		super.onStart(intent, startId);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.println("------->onStartCommand()");
		return super.onStartCommand(intent, flags, startId);
	}

}
结果:



总结:startService()启动方式代码少、简单,适用于简单的应用,而bindService()操作性强,使用起来想Activity。

两者区别:bindService()方式启动的Service随Activity的生命结束而结束,startService()则不 受影响。



                
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值