Anroid四大组件service之本地服务的示例代码
程序员文章站
2023-12-14 16:13:46
服务是android四大组件之一,与activity一样,代表可执行程序。但service不像activity有可操作的用户界面,它是一直在后台运行。用通俗易懂点的话来说:...
服务是android四大组件之一,与activity一样,代表可执行程序。但service不像activity有可操作的用户界面,它是一直在后台运行。用通俗易懂点的话来说:
如果某个应用要在运行时向用户呈现可操作的信息就应该选择activity,如果不是就选择service。
service的生命周期如下:
service只会被创建一次,也只会被销毁一次。那么,如何创建本地服务呢?
实现代码如下:
package temp.com.androidserivce; import android.app.service; import android.content.intent; import android.os.ibinder; import android.os.systemclock; import android.support.annotation.nullable; import android.util.log; /** * created by administrator on 2017/8/18. */ public class myservice extends service { @override public void oncreate() { log.i("test", "服务被创建"); super.oncreate(); } @override public int onstartcommand(intent intent, int flags, int startid) { log.i("test", "服务被启动"); new thread(new myrunnable(startid)).start(); return super.onstartcommand(intent, flags, startid); } @override public void ondestroy() { log.i("test", "服务被销毁"); super.ondestroy(); } @nullable @override public ibinder onbind(intent intent) { return null; } class myrunnable implements runnable { int startid; public myrunnable(int startid) { this.startid = startid; } @override public void run() { for (int i = 0; i < 10; i++) { systemclock.sleep(1000); log.i("test", i + ""); } //停止服务 //stopself(); stopself(startid); //当用无参数的停止服务时,将会销毁第一次所启动的服务; //当用带参数的停止服务时,将会销毁最末次所启动的服务; } } }
要声明服务,就必须在manifests中进行配置
<manifest ... > ... <application ... > <service android:name=".myservice" android:exported="true"/> ... </application> </manifest>
android:exported="true" 设置了这个属性就表示别人也可以使用你的服务。
还有一个需要注意的小点,在myservice中可以看见我启动时用了一个子线程去帮我实现工作,那么我为什么没有直接把for循环的那段代码写在onstartcommand方法中呢,是因为写在onstartcommand中将会报anr程序无响应的错误。就是当你所有的事情都去交给主线程做时,就会造成主线程内存溢出,它就会炸了。这个时候也可以用intentservice来取代service。
package temp.com.androidserivce; import android.app.intentservice; import android.content.intent; import android.os.systemclock; import android.util.log; /** * created by administrator on 2017/8/18. */ public class myservice2 extends intentservice { public myservice2() { super(""); } public myservice2(string name) { super(name); } @override protected void onhandleintent(intent intent) { for (int i = 0; i <10 ; i++) { systemclock.sleep(1000); log.i("test",i+""); } } }
使用这个相对而言会比较简单。intentservice是service的子类。它使用工作线程逐一处理所有启动请求。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。