Android Service用法详解

来源:互联网 发布:淘宝店铺装修教程网站 编辑:程序博客网 时间:2024/04/29 20:01

什么是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 启动已注册的 servicestartService(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;}}@Overridepublic IBinder onBind(Intent arg0) {System.out.println("------->onBind()");return null;}@Overridepublic void onCreate() {System.out.println("------->onCreate()");super.onCreate();}@Overridepublic void onDestroy() {System.out.println("------->onDestroy()");super.onDestroy();}@Overridepublic void onStart(Intent intent, int startId) {System.out.println("------->onStart()");super.onStart(intent, startId);}@Overridepublic 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()则不 受影响。

	
				
		
原创粉丝点击