您的位置:首页 > 移动开发 > Android开发

service全面解析(一)

2016-05-30 19:52 525 查看
Service Android程序的四大组件之一,它与Activity极为相似,它具有自己的生命周期,不同的是它没有Activity 类似的交互界面不能和用户进行交互
Service运行在后台,它可以和一些组建(Activity)绑定进行本地通信,也可以跨进程通信(AIDL),接下来我们详细看看service的功能。
1:启动方式:
Service的启动方式可以分为两种形式:
第一种只启动一个service,这时候service和启动它的组件之间就没有任何了
第二种通过bindService()方法启动一个service,它会将指定的Service和组件(Activity)关联起来,可以进行通信。




startService()方法启动的生命周期:

1.其他组件调用startService()方法:

2.onCreate()方法被调用,执行初始化

3.onStartCommand()方法触发。

3.调用stopService()方法,销毁service,onDestroy()方法触发

bindService()方式的生命周期:

1.其他组件调用bindService()方法

2.onCreate()方法被调用,执行初始化

3.onBind()方法被触发,并返回一个IBinder实现类的对象,这个对象在绑定的组件中获取,我们可以使用这个对象可以进行组件和service的通信

4.onUnBind()方法,在我们调用unBindService()的(解绑)时候触发

5.执行onDestroy()方法,销毁services

通过startService()方式启动方式相对简单,在此就不给例子演示了,下面我们来看下通过bindService()方式启动的一个例子

首先使用主界面布局文件service_main.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<Button
android:id="@+id/bt_start_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/start_service" />

<Button
android:id="@+id/bt_stop_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/stop_service" />

<Button
android:id="@+id/bt_bind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/bind_service" />

</LinearLayout>




如图只有三个按钮,获取services的属性值,绑定启动,解绑,这个比较简单。

接下来我们定义一个ServiceActivity类让它继承Service类

public class ServiceTest extends Service {
private String TAG = ServiceTest.class.getSimpleName();
private int count = -1;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "-----onbind-----");
return new MyBinder();
}

@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "----oncreate--");
count = 100;

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "---onStartCommant----");

return super.onStartCommand(intent, flags, startId);
}

@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "---------onunbinder()------");
count = -1;
return true;
}

public class MyBinder extends Binder {
public int getCount() {
return count;
}
}

@Override
public void onDestroy() {
Log.i(TAG, "---------ondestroy()------");
super.onDestroy();
}

@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
Log.i(TAG, "-----onRebind----");
super.onRebind(intent);
}
}


首先我们在每个回调的方法里里都打印一下,方便我们之后观察他们的执行次序,其次在onbind()方法中 返回了一个IBinder对象,我们继承了它的实现类Binder类实现了一个我自己的内部类Mybinder,MyBinder类里面有个一个方法返回了一个int 类型的count字段。
最后我们在一个Activity中绑定我们刚才的service组件


public class ServiceActivity extends Activity implements OnClickListener {
private ServiceTest.MyBinder binder;
Intent mintent;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.service_main);
Button start_service_bt = (Button) findViewById(R.id.bt_start_service);
Button stop_service_bt = (Button) findViewById(R.id.bt_stop_service);
Button bind_service_bt = (Button) findViewById(R.id.bt_bind_service);
start_service_bt.setOnClickListener(this);
stop_service_bt.setOnClickListener(this);
bind_service_bt.setOnClickListener(this);
}

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(this, ServiceTest.class);
switch (v.getId()) {
case R.id.bt_start_service:
Log.i("---count----",binder.getCount()+"");
break;
case R.id.bt_stop_service:
unbindService(connection);
break;
case R.id.bt_bind_service:
bindService(intent, connection, Service.BIND_AUTO_CREATE);
break;

}

}

private ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.i("---------", "-------disConnection-------");
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (ServiceTest.MyBinder) service;

}
};
}


这个Activity中我们使用bindService()方式绑定一个Service

bindService(Intent service, ServiceConnection conn, int flags),需要三个参数:

Intent:需要绑定的目标service的Intent的对象

ServiceConnection:该对象监听访问者和Service的连接情况,连接成功的时候回调onServiceConnected(ComponentName name, IBinder service)方法,当与之关联的组件崩溃等问题退出时调用onServiceDisconnected(ComponentName name)方法

flags:绑定的时候是否自动创建Service

看看运行结果:

但我们启动东应用点击“绑定service”按钮,控制台输出:



我们点击”组件通讯”:



我们会发现我能能在Activity中获取Service中的值,就是说我们能狗调用service中的方法和属性进行通信。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android