学习android之Service

本文详细介绍了Android中的Service组件,包括其作用、启动方式及生命周期管理等内容。并通过一个音乐播放的例子展示了如何实现Service的基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习android之Service

综述

Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

启动方式

1 .context.startService() 方式

使用context.startService() 启动时,Service会经历如下生命周期:

Start: context.startService()onCreate()onStart()Servicerunning

Stop: context.stopService()onDestroy()Service stop

如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。所以调用startService的生命周期为:onCreate --> onStart(可多次调用)--> onDestroy

2. context.bindService()方式

使用使用context.bindService()启动时,Service会经历如下生命周期:

Start: context.bindService()onCreate()onBind()Servicerunning

Stop: onUnbind()onDestroy()Service stop

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 所以调用bindService的生命周期为:onCreate->onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

编程流程:

1.注册Service,在AndroidManifest.xml 文件中定义。

2.编写自己的Service类,该类必须继承Service类

3.在适当的位置启动Service。

举例1 音乐播放(下载地址:http://download.youkuaiyun.com/detail/nuptboyzhb/4483192)

MainActivityPlayService.java

package com.example.com.njupt.zhb.musicplay;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.view.Menu;

import android.view.View;

import android.widget.Button;

import android.view.View.OnClickListener;

publicclass PlayService extends Activity {

private Button PlayBtn;

private Button StopBtn;

OnClickListener listener=null;

@Override

publicvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_play_service);

PlayBtn=(Button)findViewById(R.id.start);

StopBtn=(Button)findViewById(R.id.stop);

listener=new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

// TODO Auto-generatedmethod stub

switch(v.getId()){

case R.id.start:

//启动在manifest.xml中注册为“blog.youkuaiyun.com.nuptboyzhb.StartService”Service

Intentintent1=newIntent("blog.youkuaiyun.com.nuptboyzhb.StartService");

startService(intent1);

break;

case R.id.stop:

//停止在manifest.xml中注册为“blog.youkuaiyun.com.nuptboyzhb.StartService”Service

Intentintent2=new Intent("blog.youkuaiyun.com.nuptboyzhb.StartService");

stopService(intent2);

break;

}

}

};

PlayBtn.setOnClickListener(listener);

StopBtn.setOnClickListener(listener);

}

@Override

publicboolean onCreateOptionsMenu(Menu menu){

getMenuInflater().inflate(R.menu.activity_play_service, menu);

returntrue;

}

}

Service Music.java

package com.example.com.njupt.zhb.musicplay;

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.IBinder;

import android.util.Log;

publicclass Music extends Service {

private MediaPlayer player;

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generatedmethod stub

returnnull;

}

@Override

publicvoid onStart(Intentintent, int startId) {

super.onStart(intent, startId);

player = MediaPlayer.create(this, R.raw.gequ);

player.start();

Log.e("1","play");

}

@Override

publicvoid onDestroy() {

super.onDestroy();

player.stop();

Log.e("2","stop");

}

}

XML :activity_play_service.xml

<?xml version="1.0"encoding="utf-8"?>

<AbsoluteLayout

android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android">

<Button

android:id="@+id/start"

android:layout_width="319dp"

android:layout_height="wrap_content"

android:text="Play"

android:layout_x="1dp"

android:layout_y="45dp"/>

<Button

android:id="@+id/stop"

android:layout_width="317dp"

android:layout_height="wrap_content"

android:text="Stop"

android:layout_x="2dp"

android:layout_y="99dp"/>

</AbsoluteLayout>

XML :AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.com.njupt.zhb.musicplay"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk

android:minSdkVersion="4"

android:targetSdkVersion="15"/>

<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

<activity

android:name=".PlayService"

android:label="@string/title_activity_play_service">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<! 注册service>

<serviceandroid:name=".Music">

<intent-filter>

<action android:name="blog.youkuaiyun.com.nuptboyzhb.StartService" />

<category android:name="android.intent.category.default"/>

</intent-filter>

</service>

</application>

</manifest>

小节

从上述代码中,我们应该注意如下几点:

1. startServicestopServiceIntent的参数,必须与AndroidManifest.xml文件中action项的name值保持完全一致。否则,不能启动Music服务。

2.服务Music必须继承Service类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值