【Android】service入门讲解

来源:互联网 发布:财务报表数据分析范文 编辑:程序博客网 时间:2024/05/22 17:07

转载请注明出处:http://blog.csdn.net/h28496/article/details/44302053


Service是什么

安卓的四大组件之一。实际效果和Activity差不多。在实际的使用中来看,Service如同是一个没有界面的Activity。


什么时候使用Service

需要做和Activity差不多的事,但是又没必要占用一个界面时就可以使用Service。


初学者关于Service的常见认知错误

有初学者误以为Service是一个线程,实际上Service不是一个线程,它工作在主线程中。

和上面类似,有的初学者误以为Service是和进程分开的,实际上,一般情况下Service是作为启动它的进程的一部分。


启动Service的两种方式

Context.startService(Intent intent)

调用服务者与服务没有关联,即使调用者不存在了,服务依然运行。


Context.bindService(Intent intent)

调用服务者与服务绑定,调用者退出,服务也退出。


Service的生命周期

相比Activity简单得多


第一次启动Service之后,依次调用onCreate()、onStart(),之后运行。

当Service停止运行时,将会调用onDestroy()。

注意:

① 如果Service没有Destroy,无论启动多少次都只有第一次才会执行onCreate()。除了第一次以外的都只会执行onStart()。

② 在API5之后 onStart()就被废弃了,我们可以用onStartCommand()代替。


代码示例

MyService.java

package zhp.app.servicetest;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.Bundle;import android.os.IBinder;public class MyService extends Service {private MediaPlayer mediaPlayer;// ==============================// 继承或重写的方法// ==============================@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onCreate() {// 在创建Service的时候初始化MediaPlayerinitMediaPlayer();super.onCreate();}@Overridepublic void onDestroy() {// 在服务结束的时候停止播放音乐musicStop();super.onDestroy();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 接收数据指令,并按指令执行if (intent != null) {Bundle bundle = intent.getExtras();if (bundle != null) {String command = bundle.getString("message");switch (command) {case "play":musicPlay();break;case "pause":musicPause();break;}}}return super.onStartCommand(intent, flags, startId);}// ==============================// 方法// ==============================/** * 初始化MediaPlayer */private void initMediaPlayer() {if (mediaPlayer == null) {mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.bgm);}mediaPlayer.seekTo(0);}/** * 音乐播放 */public void musicPlay() {if (mediaPlayer == null) {initMediaPlayer();}mediaPlayer.start();}/** * 音乐暂停 */public void musicPause() {if (mediaPlayer != null) {mediaPlayer.pause();}}/** * 音乐结束 */public void musicStop() {if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}}

MainActivity.java

package zhp.app.servicetest;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic void onClick(View v) {// 和Activity的启动一样Intent intent = new Intent(this, MyService.class);Bundle bundle = new Bundle();switch (v.getId()) {case R.id.main_play:bundle.putString("message", "play");break;case R.id.main_pause:bundle.putString("message", "pause");break;case R.id.main_stop:stopService(intent);return;}// 在这里传送数据,Service在onStartCommand()中接收数据intent.putExtras(bundle);// Activity是startActivity(), Service是startService()// 也可以改为Service的另外一种启动方式: bindService()startService(intent);}}

Service和Activity都需要在manifest中注册:

    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >                <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>            <service          android:name=".MyService" >    </service>              </application>


0 0
原创粉丝点击