写过一些android程序,但是android中的Service的组件却不曾用过,因此,对它也不甚了解,所以,今天写个小例子来学习如何使用Service。这其实也是我学习新东西的一个方法,对于陌生的东西,看书只是理论只是的了解,但是实际的情况如何,还是需要写些程序来测试,那样的理解更深刻。
?
测试目的:了解Service的生命周期,以及在startService和bindService时,Service如何响应。
程序界面如下:
?
1、编写Android Service需要基础Service类,并实现其中的onBind方法
?
?
/** * Android Service 示例 * * @author dev * */public class ServiceDemo extends Service { private static final String TAG = "ServiceDemo" ; public static final String ACTION = "com.lql.service.ServiceDemo"; @Override public IBinder onBind(Intent intent) { Log.v(TAG, "ServiceDemo onBind"); return null; } @Override public void onCreate() { Log.v(TAG, "ServiceDemo onCreate"); super.onCreate(); } @Override public void onStart(Intent intent, int startId) { Log.v(TAG, "ServiceDemo onStart"); super.onStart(intent, startId); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v(TAG, "ServiceDemo onStartCommand"); return super.onStartCommand(intent, flags, startId); }}?
?
2、在AndroidManifest.xml文件中声明Service组件:
<service android:name="com.lql.service.ServiceDemo"> <intent-filter> <action android:name="com.lql.service.ServiceDemo"/> </intent-filter> </service>
? 其中的intent-filter中定义的action是用来启动服务的Intent。
?
3、在需要service的地方通过Context.startService(Intent)方法启动service或者Context.bindService方法来绑定service。
?
具体测试代码如下:
?
?
public class ServiceDemoActivity extends Activity { private static final String TAG = "ServiceDemoActivity"; Button bindBtn; Button startBtn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bindBtn = (Button)findViewById(R.id.bindBtn); startBtn = (Button)findViewById(R.id.startBtn); bindBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { bindService(new Intent(ServiceDemo.ACTION), conn, BIND_AUTO_CREATE); } }); startBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { startService(new Intent(ServiceDemo.ACTION)); } }); } ServiceConnection conn = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { Log.v(TAG, "onServiceConnected"); } public void onServiceDisconnected(ComponentName name) { Log.v(TAG, "onServiceDisconnected"); } }; @Override protected void onDestroy() { Log.v(TAG, "onDestroy unbindService"); unbindService(conn); super.onDestroy(); };}?
?
4、日志输出:
上面的截图是点击绑定服务时输出的。可以看出,只调用了onCreate方法和onBind方法,当重复点击绑定服务时,没有再输出任何日志,并且不报错。onCreate方法是在第一次创建Service时调用的,而且只调用一次。另外,在绑定服务时,给定了参数BIND_AUTO_CREATE,即当服务不存在时,自动创建,如果服务已经启动了或者创建了,那么只会掉调用onBind方法。
?
上面的截图是在多次点击启动服务时输出的。可以看出,在第一次点击时,因为Service还未创建,所以调用了onCreate方法,紧接着调用了onStartCommand和onStart方法。当再次点击启动服务时,仍然调用了onStartCommand和onStart方法,所以,在Service中做任务处理时需要注意这点,因为一个Service可以被重复启动。
?
这里说一下,平常使用多的是startService方法,可以把一些耗时的任务放到后台去处理,当处理完成后,可以通过广播来通知前台。
而onBind方法更多的是结合AIDL来使用,这样一个应用可以通过绑定服务获得的IBinder来拿到后台的接口,进而调用AIDL中定义的方法,进行数据交换等。
?
后面将来学习AIDL!
?
?