欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Anroid四大组件service之本地服务的示例代码

程序员文章站 2023-12-02 17:37:10
服务是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的子类。它使用工作线程逐一处理所有启动请求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。