读书人

了解Service的生命周期以及在startS

发布时间: 2013-07-30 12:05:31 作者: rapoo

了解Service的生命周期,以及在startService和bindService时,Service如何响应

/**  * Android Service 示例  *   */  public class MusicService extends Service {      private static final String TAG = "MusicService" ;      public static final String ACTION = "com.game.music.service.MusicService";            @Override      public IBinder onBind(Intent intent) {          Log.v(TAG, "MusicService onBind");          return null;      }            @Override      public void onCreate() {          Log.v(TAG, "MusicService onCreate");          super.onCreate();      }            @Override      public void onStart(Intent intent, int startId) {          Log.v(TAG, "MusicService onStart");          super.onStart(intent, startId);      }            @Override      public int onStartCommand(Intent intent, int flags, int startId) {          Log.v(TAG, "MusicService onStartCommand");          return super.onStartCommand(intent, flags, startId);      }  }  


2、在AndroidManifest.xml文件中声明Service组件:
<service android:name="com.game.music.service.MusicService">              <intent-filter>                  <action android:name="com.game.music.service.MusicService"/>              </intent-filter>              </service>  


3、在需要service的地方通过Context.startService(Intent)方法启动service或者Context.bindService方法来绑定service。

具体测试代码如下:
public class ServiceDemoActivity extends Activity {      private static final String TAG = "ServiceDemoActivity";            Button bindBtn;      Button startBtn;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);                    bindBtn = (Button)findViewById(R.id.bindBtn);          startBtn = (Button)findViewById(R.id.startBtn);                    bindBtn.setOnClickListener(new OnClickListener() {              public void onClick(View v) {                  bindService(new Intent(MusicService.ACTION), conn, BIND_AUTO_CREATE);              }          });                    startBtn.setOnClickListener(new OnClickListener() {              public void onClick(View v) {                  startService(new Intent(MusicService.ACTION));              }          });      }            ServiceConnection conn = new ServiceConnection() {          public void onServiceConnected(ComponentName name, IBinder service) {              Log.v(TAG, "onServiceConnected");          }          public void onServiceDisconnected(ComponentName name) {              Log.v(TAG, "onServiceDisconnected");          }      };      @Override      protected void onDestroy() {          Log.v(TAG, "onDestroy unbindService");          unbindService(conn);          super.onDestroy();      };  }  


4、日志输出:

面的截图是点击绑定服务时输出的。可以看出,只调用了onCreate方法和onBind方法,当重复点击绑定服务时,没有再输出任何日志,并且不报错。onCreate方法是在第一次创建Service时调用的,而且只调用一次。另外,在绑定服务时,给定了参数BIND_AUTO_CREATE,即当服务不存在时,自动创建,如果服务已经启动了或者创建了,那么只会掉调用onBind方法。

上面的截图是在多次点击启动服务时输出的。可以看出,在第一次点击时,因为Service还未创建,所以调用了onCreate方法,紧接着调用了onStartCommand和onStart方法。当再次点击启动服务时,仍然调用了onStartCommand和onStart方法,所以,在Service中做任务处理时需要注意这点,因为一个Service可以被重复启动。

这里说一下,平常使用多的是startService方法,可以把一些耗时的任务放到后台去处理,当处理完成后,可以通过广播来通知前台。

读书人网 >编程

热点推荐