http://blog.csdn.net/etzmico/article/details/7317695
之前我们有篇关于介绍 Android 如何实现开机自启动,不过都写的是关于如何启动 Activity,本篇文章将介绍如何启动 Service。
先附上之前文章的链接,以便参考:【Android】开机自启动。
Service 的启动相比 Acitivty 而言较为繁琐,其实都是通过别的类去调用被启动类,只不过可能 Activity 大家更为熟悉,Service 比较陌生吧。
不了解 Android Service 的童鞋可以先参考下【Android】Service 生命周期 和 【Android】Service学习之本地服务 两篇文章。
下面回到正题,看看 Service 是如何实现自启动的。
和自启动 Activity 一样,我们也先需要静态注册一个广播。
随后,创建一个继承于 BroadcastReveiver 的启动类。
[java] view plain copy print ?
- context.startService(new Intent("cn.etzmico.Etzmico_AutoRunService"));
context.startService(new Intent("cn.etzmico.Etzmico_AutoRunService")); // 调用 Service 调用/启动一个 Service 比 启动一个 Activity 要容易的多。intent中的参数是一个“标签”,详情下面的内容会介绍到。
在 Manifest.xml 静态注册。
[java] view plain copy print ?
- <receiver android:name="cn.etzmico.autorunservice.BootReceiver" >
- <intent-filter >
- <action android:name="android.intent.action.BOOT_COMPLETED" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </receiver>
<receiver android:name="cn.etzmico.autorunservice.BootReceiver" > <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </receiver>
同样,需要加入权限。
[java] view plain copy print ?
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" >
- </uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" > </uses-permission>
下面就来看 Service 了。
创建一个继承于 Service 的类。为了验证,我们可以在 onCreate() 方法中,打印一句话。
这里简单的说下 Service 的生命周期。
Service 也有生命周期,也有 onCrate() 等……不过 Service 还有 onStart() 和 onBind() 。
onCreate() 和 onStart() 的区别是:
onCreate() 只有在首次调用 Service 时调用。
onStart()每次调用 Service 时均调用,首次调用 Service 时也不例外。
onBind() 在bindService() 时调用(本文不涉及)。
因此我们可以根据自己所需要的,在 onCreate() , onStart() 以及 onBind() 中写入方法。
另外,Service 也是需要声明的。
我们都知道,当新建 Activity 的时候,我们需要在 Manifest.xml 中声明, Service 亦然如此,不过 Service 与之不同的是,每个 Service 都需要添加一个“标签”,这个标签在一个工程中要是唯一的,用于让系统知道我们需要调用的是哪个 Service。
[java] view plain copy print ?
- <service android:name="cn.etzmico.autorunservice.Etzmico_AutoRunService" >
- <intent-filter >
- <action android:name="cn.etzmico.Etzmico_AutoRunService" />
-
- <category android:name="android.intent.category.default" />
- </intent-filter>
- </service>
<service android:name="cn.etzmico.autorunservice.Etzmico_AutoRunService" > <intent-filter > <action android:name="cn.etzmico.Etzmico_AutoRunService" /> <category android:name="android.intent.category.default" /> </intent-filter> </service>
intent-filter 的 actiong android:name 中的内容就是“标签”了。如果我们想启动的是这个 Service,那么在广播类中 startService() 方法中 intent 的参数就是这个“标签”;否则启动服务时会提示new Intent找不到"cn.etzmico.Etzmico_AutoRunService"(引号中具体内容视当时情况而定,即 startService() 时 intent 的参数)。