Android——service使用详解,经典实战教程

android:enabled=[“true” | “false”]

android:exported=[“true” | “false”]

android:icon=“drawable resource”

android:isolatedProcess=[“true” | “false”]

android:label=“string resource”

android:name=“string”

android:permission=“string”

android:process=“string” >

| 属性 | 说明 |

| — | — |

| description | 对服务进行描述,属性值应为对字符串资源的引用,以便进行本地化 |

| directBootAware | 设置是否可以在用户解锁设备之前运行,默认值为“false” |

| enabled | 设置是否可以由系统来实例化服务。< application >元素有自己的enabled属性,适用于包括服务在内的所有应用程序组件。要启用服务,< application >和< service >属性必须都为“true”(默认情况下都为true)。如果其中一个是“false”,则服务被禁用 |

| exported | 设置其他应用程序的组件是否可以调用本服务或与其交互,如果可以,则为“true”。当值为“false”时,只有同一个应用程序或具有相同用户ID的应用程序的组件可以启动该服务或绑定到该服务。该属性的默认值取决于服务是否包含Intent filters。没有任何过滤器意味着它只能通过指定其确切的类名来调用,这意味着该服务仅用于应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。 另一方面,如果存在至少一个过滤器,意味着该服务打算供外部使用,因此默认值为“true” |

| icon | 服务的图标,属性值应是对drawable资源的引用。如果未设置,则将使用应用程序图标 |

| isolatedProcess | 设置该服务是否作为一个单独的进程运行,如果设置为true,此服务将在与系统其余部分隔离的特殊进程下运行,并且没有自己的权限,与它唯一的通信是通过服务API(绑定和启动) |

| label | 可以向用户显示的服务的名称,属性值应是对字符串资源的引用 |

| name | 服务类的完全限定名 |

| permission | 设定组件必须具有的权限,得以启动服务或绑定服务。如果startService(),bindService()或stopService()的调用者没有被授予此权限,则该方法将不会工作,并且Intent对象不会传递到服务中 |

| process | 用来运行服务的进程的名称。通常,应用程序的所有组件都运行在应用程序创建的默认进程中,它与应用程序包名具有相同的名称。 < application >元素的process属性可以为所有组件设置不同的默认值,但组件可以使用自己的进程属性覆盖默认值,从而允许跨多个进程扩展应用程序 |

三、启动Service


启动服务由组件通过调用 startService() 启动,服务启动之后,其生命周期即独立于启动它的组件,并且可以在后台无限期地运行,即使启动服务的组件已被销毁也不受影响。因此,服务应通过调用 stopSelf() 来自行停止运行,或者由另一个组件调用 stopService() 来停止

可以通过扩展两个类来创建启动服务:

  • Service

这是所有服务的父类。扩展此类时,如果要执行耗时操作,必须创建一个用于执行操作的新线程,因为默认情况下服务将运行于UI线程

  • IntentService

这是 Service 的子类,它使用工作线程逐一处理所有启动请求。如果应用不需要同时处理多个请求,这是最好的选择。IntentService只需实现构造函数onHandleIntent() 方法即可,onHandleIntent()方法会接收每个启动请求的 Intent

3.1、继承Service

这里举一个音乐播放器的例子

继承Service类实现自定义Service,提供在后台播放音乐、暂停音乐、停止音乐的方法

public class MyService extends Service {

private final String TAG = “MyService”;

private MediaPlayer mediaPlayer;

private int startId;

public enum Control {

PLAY, PAUSE, STOP

}

public MyService() {

}

@Override

public void onCreate() {

if (mediaPlayer == null) {

mediaPlayer = MediaPlayer.create(this, R.raw.music);

mediaPlayer.setLooping(false);

}

Log.e(TAG, “onCreate”);

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

this.startId = startId;

Log.e(TAG, "onStartCommand—startId: " + startId);

Bundle bundle = intent.getExtras();

if (bundle != null) {

Contro

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值