Service(1)
在android开发中,Services是一个很重要的组成部分,它的作用就是当你正在做一件事而又想做另外一件事的时候,而你又不想让正在做的事停止,这时就用到了Service。如果某些程序需要的部分操作是很耗时间的,那么可以将这些程序定义在Service中,即:Service是一个没有图形界面的Activity程序,而且当用户要执行某些操作需要进行跨进程访问的时候也可以使用Service完成,Service的主要功能是为Activity程序提供一些必要的支持,就像一个得力帮手。
<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/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动service" />
<Button
android:id="@+id/but2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止service" />
<Button
android:id="@+id/but3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定service" />
<Button
android:id="@+id/but4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解除绑定service" />
</LinearLayout>
MainActivity.java文件内容。
package com.example.service1;
import com.example.service1.myServiceUtil.BinderImpl;
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.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button but1, but2, but3, but4;
/*
* 当我们在没有服务与Activity进行绑定就去解除绑定时,就会出现错误,所以
* 在解除绑定之前要先进行判断,所以在此新建了一个接口IsNull()用于判断。
* 在这个接口中什么抽象方法都没有,它仅仅是要实现判断的功能。
*/
private IsNull service = null;
/*
* ServiceConnection接口的主要功能是当一个Activity程序与Service建立连接后,可以通过
* ServiceConnection接口执行Service连接(或取消连接)的处理操作,在Activity连接到Service
* 程序上之后会触发Service类中的OnBind()方法,在此方法中要返回一个android.os.IBinder
* 接口的对象
*/
private ServiceConnection serviceConnection = new ServiceConnectionImpl();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//取得按钮组件
but1 = (Button)findViewById(R.id.but1);
but2 = (Button)findViewById(R.id.but2);
but3 = (Button)findViewById(R.id.but3);
but4 = (Button)findViewById(R.id.but4);
//设置事件监听器
but1.setOnClickListener(new OnStartClickListenerImpl());
but2.setOnClickListener(new OnStopClickListenerImpl());
but3.setOnClickListener(new OnBindClickListenerImpl());
but4.setOnClickListener(new OnUnBindClickListenerImpl());
}
private class OnStartClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
//Service由此开始
MainActivity.this.startService(new Intent(MainActivity.this,
myServiceUtil.class));
}
}
private class OnStopClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
//Service结束
MainActivity.this.stopService(new Intent(MainActivity.this,
myServiceUtil.class));
}
}
private class OnBindClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
/*
* bindService是用来绑定Service服务的,也就是说Service就和调用bindSevice的组件绑定在一起了。
* 同生共死了,参数解释:第一个参数:表示与服务类相关联的Intent对象,用于指定所要启动Service
* 第二个参数:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况
* 当访问者与Service之间连接成功时,将回调该ServiceConnection对象的onServiceConnected()
* 方法。第三个参数:指定绑定时是否自动创建Service(如果Service还未创建),该参数可以指定0(不自动创建)
* 或BIND_AUTO_CREATE(自动创建)
*/
MainActivity.this.bindService(new Intent(MainActivity.this,
myServiceUtil.class), MainActivity.this.serviceConnection,
Context.BIND_AUTO_CREATE);
}
}
private class OnUnBindClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
if (MainActivity.this.service != null) {
//unbindService是用来解除绑定Service服务的
MainActivity.this
.unbindService(MainActivity.this.serviceConnection);
//解除绑定后就把service设置为空,所以当再去点击解除绑定时就不会有错误出现
MainActivity.this.service = null;
}
}
}
private class ServiceConnectionImpl implements ServiceConnection {
@Override
// 此方法在连接正常关闭的情况下是不会被调用的,只有在Service被破坏或被杀死了才会调用,
// 例如资源不足,要关闭一些Services。
public void onServiceDisconnected(ComponentName name) {
}
@Override
// 建立Service服务连接时调用
public void onServiceConnected(ComponentName name, IBinder service) {
// BinderImpl是IBinder接口的子类,所以向下转型为BinderImpl
// 然后通过此类对象为Service接口实例化
MainActivity.this.service = (BinderImpl) service;
}
}
}
myServiceUtil.java文件的内容。
package com.example.service1;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
public class myServiceUtil extends Service {
private IBinder myBinder = new BinderImpl();
@Override
public IBinder onBind(Intent intent) {
System.out.println("-----onBind()方法被调用-----");
return this.myBinder;
}
/*
* BidnderImpl是IBinder和IsNull接口的共同子类 只要调用了OnBind()方法那么IsNull就不会为空,
* 没有调用就说明IsNull为空也就间接对是否绑定进行了判断。
*/
public class BinderImpl extends Binder implements IsNull {
@Override
public String getInterfaceDescriptor() {
return "myServiceUtil class-----";
}
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("-----onUnbind()方法被调用-----");
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) {
System.out.println("-----onRebind()方法被调用-----");
super.onRebind(intent);
}
@Override
public void onCreate() {
System.out.println("-----onCreate()方法被调用-----");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("-----onStartCommand()方法被调用-----");
//继续执行
return Service.START_CONTINUATION_MASK;
}
@Override
public void onDestroy() {
System.out.println("-----onDestroy()方法被调用-----");
super.onDestroy();
}
}
IsNull.java接口 的内容。
package com.example.service1;
public interface IsNull {
}
注:当我们启动Service的时候,onCreate()方法和onStartCommand()方法被调用。当我们停止Service的时候OnDestroy()方法被调用。当我们绑定Service的时候onBind()方法被调用,当接触绑定的时候onUnBind()方法被调用。