首先让我们来假设这样一种情况:用户正在使用你的音乐播放器播放着优美的歌曲,突然用户听说日本现在9级地震了想去浏览器中看看相关的新闻。也就是说用户想边听音乐边看新闻。如果按照我们前面讲过的使用Activity来做这个音乐播放器的话,你的播放代码只能放到按钮的事件中执行。这样做的缺点是如果播放的时间超过10秒左右,应用程序就会自动弹出对话框说什么该程序无响应问你是强制关闭还是继续等待。也就说说Android不允许在Activity中执行耗时比较长的操作。那么我们的这段音乐代码应该放到哪里你?答案当然是我们今天要将的Service上面啦。
Service从字面上是服务的意思,通俗一点说Service就是一直默默的运行的后台执行一些操作的东西。Service的优先级比Activity要高,比如说当系统空间不足时,Android系统会优先关闭优先级比较低的东西,比如说某些Activity。Service没有用户界面,所以它一般都被用来执行一些比较耗时的操作,比如我们上面说到的音乐播放。我也没有引用官方的解释,希望大家能够明白Service的作用。
要实现一个Service很简单, 相信有了前面学习广播的例子,学习Service对您一定不会有问题的,呵呵。要实现一个Service一共有三步:
首先所有的Service都必须继承一个Service类,例如:
public class Service01 extends Service { @Override public IBinder onBind(Intent arg0) { Log.i("qlf", "service onBind"); return null; } /** * 当服务被启动的时候首先执行的方法 * 在这个方法中可以进行一些资源的初始化 * */ @Override public void onCreate() { Log.i("qlf", "service created"); super.onCreate(); } /** * 服务被停止的时候执行的方法,通常 * 在这里销毁使用的资源 * */ @Override public void onDestroy() { Log.i("qlf", "service destroyed"); super.onDestroy(); } /** * 当启动服务的时候要调用的方法,在这个 * 方法中我们可以得到从Activity中穿过来 * 的Intent,从而进行相关的操作 * */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("qlf", "service command"); return super.onStartCommand(intent, flags, startId); } }
一些方法的注释我已经在程序里面标明了。然后在AndroidManifest.xml配置文件中添加这个Service的使用信息:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qlf.test" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".mainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--需要使用的Service信息--> <service android:name=".Service01"></service> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
最后在需要使用的Activity中调用就行了,具体的调用方法如下:
public class btnOk_Click implements OnClickListener { @Override public void onClick(View arg0) { Intent service = new Intent(); service.setClass(mainActivity.this, Service01.class); mainActivity.this.startService(service); } }
最后执行的效果如下:
关于如何关闭已经运行的Service,只要将mainActivity.this.startService(service);中的startService改为stopService就行了。怎么样,是不是超级简单?实现简单,不过您也别大意了。下面有几个点您应该留意下,避免在Service中放一些低级的错误就不好了。
1.在Service不能直接调用某个Acitivty,如果要从Service中发出消息通知客户可以使用Thoast或者通知栏来通知用户,让用户来打开Acitivty。
2.在Service中运行的代码都是在主进程中的,所以如果您需要在Service中执行耗时的操作请启动新线程来操作,否则会影响到主进程的运行。