问题  ????????????" />
当前位置: 代码迷 >> Android >> 问题  ????????????
  详细解决方案

问题  ????????????

热度:1000   发布时间:2016-04-28 06:19:16.0
Android 服务(service)的生命周期以及利用bindservice调用服务里面的方法

服务的生命周期

服务的生命周期跟启动服务的方法有关:
 当采用Context.startService()方法启动服务,与之有关的生命周期方法
onCreate() onStart()  onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
 当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate() onBind()  onUnbind()  onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate()onStart()onBind()onUnbind()[重载后的方法需返回true]onRebind()

利用bindservice()调用服务里面的方法:

开启服务 (startservice) 
服务一旦开启与调用者没有任何的关系 , 调用着的activity 即便是退出了 不会影响。后台的service的运行.在activity里面 不能去调用服务里面的方法 .

通过绑定方式开启服务(bindservice)

服务跟调用者不求同生 ,但求同死.如果调用者(activity)退出了 那他绑定的服务呢 也会跟着退出.我们可以在activity里面调用服务里面的方法.利用 serviceSonnection 接口 返回一个ibinder对象 , 拿着ibinder对象获取到服务里面方法的引用(自定义了一个接口信息) ,调用服务里面的方法 。


代码示例:

自定义接口IService.java:

package cn.itcast.servicelife;public interface IService {	public void callMethodInService();}
MyService.java:

package cn.itcast.servicelife;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class MyService extends Service {	// 初始化服务时运行	@Override	public IBinder onBind(Intent intent) {		System.out.println("on bind");		return new MyBinder();	}	public class MyBinder extends Binder implements IService {		@Override		public void callMethodInService() {			sayHelloInService();		}	}	/**	 * 服务里面的一个方法	 */	public void sayHelloInService() {		System.out.println("hello in service");	}	@Override	public boolean onUnbind(Intent intent) {		System.out.println("on  unbind");		return super.onUnbind(intent);	}	@Override	public void onCreate() {		System.out.println("oncreate");		super.onCreate();	}	@Override	public void onStart(Intent intent, int startId) {		System.out.println("onstart");		super.onStart(intent, startId);	}	@Override	public void onDestroy() {		System.out.println("ondestroy");		super.onDestroy();	}}
DemoActivity.java:

package cn.itcast.servicelife;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 DemoActivity extends Activity implements OnClickListener {	Button bt_start;	Button bt_stop;	Button bt_bind_service; // 绑定服务	Button bt_unbind_service; // 解除绑定服务	Button bt_call_service;	Intent intent;	MyConn conn;	IService iService;	int flag = 0;	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.main);		bt_start = (Button) this.findViewById(R.id.button1);		bt_stop = (Button) this.findViewById(R.id.button2);		bt_bind_service = (Button) this.findViewById(R.id.button3);		bt_unbind_service = (Button) this.findViewById(R.id.button4);		bt_call_service = (Button) this.findViewById(R.id.button5);		bt_start.setOnClickListener(this);		bt_stop.setOnClickListener(this);		bt_bind_service.setOnClickListener(this);		bt_unbind_service.setOnClickListener(this);		bt_call_service.setOnClickListener(this);		intent = new Intent(this, MyService.class);		conn = new MyConn();	}	@Override	public void onClick(View v) {		switch (v.getId()) {		case R.id.button1: // 开启服务			startService(intent);			break;		case R.id.button2: // 停止服务			stopService(intent);			break;		case R.id.button3: // 绑定服务			bindService(intent, conn, Context.BIND_AUTO_CREATE);			break;		case R.id.button4: // 解除绑定服务			if (flag == 0) {				Toast.makeText(getBaseContext(), "还没有绑定服务,无需解绑", 0).show();			} else {				unbindService(conn);				flag = 0;			}			break;		// 绑定开启		case R.id.button5: // 调用服务里面的方法			iService.callMethodInService();			break;		}	}	private class MyConn implements ServiceConnection {		// 绑定一个服务成功的时候 调用 onServiceConnected		@Override		public void onServiceConnected(ComponentName name, IBinder service) {			flag = 1;			iService = (IService) service;		}		@Override		public void onServiceDisconnected(ComponentName name) {		}	}	// DemoActivity的销毁方法	@Override	protected void onDestroy() {		if (flag == 1) {			unbindService(conn);		}		super.onDestroy();	}}
清单文件:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cn.itcast.servicelife"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="8" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".DemoActivity"            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></manifest>

问题  ????????????

1.通过实验证明在bindService之后在模拟器的设置中的“正在运行的服务”中找不到相应的服务,是因为和activity绑定的所以不显示吗?

2.在unbindService之后还可以调用服务里面的方法,为什么?服务不是已经被销毁了吗?

  相关解决方案