Service生命周期的学习

来源:互联网 发布:机电软件 编辑:程序博客网 时间:2024/05/17 08:02



有两个方法使用service。

方法1是使用Context.startService()会启动service,如果service没有创建,首先会调用onCreate()方法,然后调用onStartCommand(Intent,int,int)方法,service会一直存在直到stopService()或stopSelf()调用。
方法2是使用Context.bindService(),如果service没有创建,首先也会调用onCreate()方法,但是如果已经创建则会调用onBind(Intent)方法返回客户端一个IBinder接口。

未调用stopService来停止服务,这个服务就会随着Android系统的启动而启动,随着Android系统的关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭,这就需要将Activity和Service绑定。

关闭应用程序后,会看到在Sysout视图中输出了onUnbind和onDestroy信息,表明在关闭Activity后,服务先被解除绑定,最后被销毁。

如果先启动(调用startService方法)一个服务,然后再绑定(调用bindService方法)服务,会怎么样呢?在这种情况下,虽然服务仍然会成功绑定到Activity上,但在Activity关闭后,服务虽然会被解除绑定,但并不会被销毁,也就是说,MyService类的onDestroy方法不会被调用。


activity

package com.zeph.android.services;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class ServicesActivity extends Activity {private Button myButton;private Button myButton2;private Button myButton3;private Button myButton4;private ServiceConnection conn;private MyService service;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);conn = new ServiceConnection() {// 连接服务失败后,该方法被调用@Overridepublic void onServiceDisconnected(ComponentName name) {System.out.println("ServiceConnection Disconnected");Toast.makeText(getApplicationContext(),"ServiceConnection Disconnected", Toast.LENGTH_LONG).show();service = null;}// 成功连接服务后,该方法被调用。@Overridepublic void onServiceConnected(ComponentName name, IBinder ibinder) {System.out.println("ServiceConnection Connected");Toast.makeText(getApplicationContext(),"ServiceConnection Connected", Toast.LENGTH_LONG).show();service = ((MyService.MyBinder) ibinder).getMyService();}};myButton = (Button) findViewById(R.id.myButton);myButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent();intent.setClass(getApplicationContext(), MyService.class);startService(intent);Toast.makeText(getApplicationContext(), "启动一个Service",Toast.LENGTH_LONG).show();}});myButton2 = (Button) findViewById(R.id.myButton2);myButton2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(getApplicationContext(), MyService.class);stopService(intent);Toast.makeText(getApplicationContext(), "关闭一个Service",Toast.LENGTH_LONG).show();}});myButton3 = (Button) findViewById(R.id.myButton3);myButton3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent();intent.setClass(getApplicationContext(), MyService.class);bindService(intent, conn, Context.BIND_AUTO_CREATE);Toast.makeText(getApplicationContext(), "绑定一个Service",Toast.LENGTH_LONG).show();System.out.println("绑定一个Service");}});myButton4 = (Button) findViewById(R.id.myButton4);myButton4.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {unbindService(conn);Toast.makeText(getApplicationContext(), "取消绑定一个Service",Toast.LENGTH_LONG).show();System.out.println("取消绑定一个Service");}});}}
service
package com.zeph.android.services;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class MyService extends Service {private MyBinder binder = new MyBinder();@Overridepublic IBinder onBind(Intent intent) {System.out.println("onBind");return binder;}@Overridepublic void onCreate() {super.onCreate();System.out.println("onCreate");}@Overridepublic void onDestroy() {super.onDestroy();System.out.println("onDestroy");}@Overridepublic void onRebind(Intent intent) {super.onRebind(intent);System.out.println("onRebind");}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);System.out.println("onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {System.out.println("onUnbind");return super.onUnbind(intent);}public class MyBinder extends Binder {MyService getMyService() {return MyService.this;}}}

账号被冻结了,今天才找回来,以前的邮箱不记得了。。。CSDN这次真是遇到了麻烦!!!






原创粉丝点击