Service

来源:互联网 发布:大意失荆州知乎 编辑:程序博客网 时间:2024/06/16 19:29
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();@Overrideprotected 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 {@Overridepublic void onClick(View v) {//Service由此开始MainActivity.this.startService(new Intent(MainActivity.this,myServiceUtil.class));}}private class OnStopClickListenerImpl implements OnClickListener {@Overridepublic void onClick(View v) {//Service结束MainActivity.this.stopService(new Intent(MainActivity.this,myServiceUtil.class));}}private class OnBindClickListenerImpl implements OnClickListener {@Overridepublic 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 {@Overridepublic 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();   @Overridepublic IBinder onBind(Intent intent) {System.out.println("-----onBind()方法被调用-----");return this.myBinder;}/* * BidnderImpl是IBinder和IsNull接口的共同子类 只要调用了OnBind()方法那么IsNull就不会为空, * 没有调用就说明IsNull为空也就间接对是否绑定进行了判断。 */public class BinderImpl extends Binder implements IsNull {@Overridepublic String getInterfaceDescriptor() { return  "myServiceUtil class-----";}}@Overridepublic boolean onUnbind(Intent intent) {System.out.println("-----onUnbind()方法被调用-----");return super.onUnbind(intent);}@Overridepublic void onRebind(Intent intent) {System.out.println("-----onRebind()方法被调用-----");super.onRebind(intent);}@Overridepublic void onCreate() {System.out.println("-----onCreate()方法被调用-----");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("-----onStartCommand()方法被调用-----");//继续执行return Service.START_CONTINUATION_MASK;}@Overridepublic 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()方法被调用。

0 0