学习android之Service

长平狐 发布于 2012/10/08 15:24
阅读 523
收藏 1

学习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.csdn.net/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.csdn.net.nuptboyzhb.StartService”Service

                Intentintent1=newIntent("blog.csdn.net.nuptboyzhb.StartService");

                startService(intent1);

                break;

            case R.id.stop:

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

                Intentintent2=new Intent("blog.csdn.net.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.csdn.net.nuptboyzhb.StartService" />

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

         </intent-filter>

      </service>

    </application>

</manifest>

小节

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

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

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



原文链接:http://blog.csdn.net/nuptboyzhb/article/details/7840822
加载中
返回顶部
顶部