首页 > 移动开发 > Android中Activity与服务Service绑定

Android中Activity与服务Service绑定

核心代码

Activity

[java][/java] view plaincopy

  1. public class MusicActivity extends Activity implements OnClickListener{
  2.     @Override
  3.     public void onClick(View v) {connection(); }
  4.     private void connection() {
  5.             Intent intent = new Intent("david.bindService");
  6.             bindService(intent, sc, Context.BIND_AUTO_CREATE);
  7.     }
  8.     //在客户端覆写onServiceConnected方法,当服务绑定成功会调用此回调函数
  9.     private ServiceConnection sc = new ServiceConnection() {
  10.             @Override
  11.             public void onServiceConnected(ComponentName name, IBinder service) {
  12.                 MyBinder binder = (MyBinder)service; //通过IBinder获取Service
  13.                 musicService = binder.getService();
  14.                 if(musicService != null){ musicService.play(); }
  15.             }
  16.         };
  17.     }
  18. }

Service

[java][/java] view plaincopy

  1. public class MusicService extends Service {
  2.     //需用内部类继承Binder,并定义方法获取Service对象
  3.     private final IBinder binder = new MyBinder();
  4.     public class MyBinder extends Binder {
  5.         BindMusicService getService() {
  6.             return BindMusicService.this;
  7.         }
  8.     }
  9.     @Override
  10.     public IBinder onBind(Intent intent) {//当客户端调用bindService()方法时调用此函数
  11.         return binder;
  12.     }
  13.     @Override
  14.     public void onCreate() { }
  15.     @Override
  16.     public void onDestroy() { }
  17. }

应用范例

Activity文件

[java][/java] view plaincopy

  1. package com.app.myservice;
  2. import com.app.myservice.service.MyService;
  3. import com.app.myservice.service.MyService.MyBind;
  4. import android.os.Bundle;
  5. import android.os.IBinder;
  6. import android.app.Activity;
  7. import android.content.ComponentName;
  8. import android.content.Intent;
  9. import android.content.ServiceConnection;
  10. import android.view.Menu;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.Toast;
  15. public class ServiceDemo03_Bind extends Activity implements OnClickListener{
  16.     private Button startservice,stopservice,binderservice,unbinderservice,getService;
  17.     private boolean mIsBound;
  18.     @Override
  19.     protected void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         setContentView(R.layout.activity_first);
  22.         startservice = (Button) findViewById(R.id.button1);
  23.         stopservice = (Button) findViewById(R.id.button2);
  24.         binderservice = (Button) findViewById(R.id.button3);
  25.         unbinderservice = (Button) findViewById(R.id.button4);
  26.         getService = (Button) findViewById(R.id.button5);
  27.         startservice.setOnClickListener(this);
  28.         stopservice.setOnClickListener(this);
  29.         binderservice.setOnClickListener(this);
  30.         unbinderservice.setOnClickListener(this);
  31.         getService.setOnClickListener(this);
  32.     }
  33.     @Override
  34.     public void onClick(View v) {
  35.         // TODO Auto-generated method stub
  36.         Intent intent = new Intent(ServiceDemo03_Bind.this,MyService.class);
  37.         switch (v.getId()) {
  38.         case R.id.button1:
  39.             startService(intent);
  40.             break;
  41.         case R.id.button2:
  42.             stopService(intent);
  43.             break;
  44.         case R.id.button3:
  45.             //绑定Service
  46.             //BIND_AUTO_CREATE表示自动创建
  47.             bindService(intent, connection, BIND_AUTO_CREATE);
  48.             mIsBound = true;
  49.             break;
  50.         case R.id.button4:
  51.             //解除绑定Service
  52.             if (mIsBound == true) {
  53.                 unbindService(connection);
  54.             }
  55.             mIsBound = false;
  56.             break;
  57.         case R.id.button5:
  58.             //提示框
  59.             Toast.makeText(ServiceDemo03_Bind.this, "当前Service的值为"+mService.getIndex(), 1000).show();
  60.             break;
  61.         default:
  62.             break;
  63.         }
  64.     }
  65.     private MyService mService = new MyService();
  66.     ServiceConnection connection = new ServiceConnection() {
  67.         @Override
  68.         public void onServiceDisconnected(ComponentName name) {
  69.             // TODO Auto-generated method stub
  70.             Toast.makeText(ServiceDemo03_Bind.this, "这里是:onServiceDisconnected", 1000).show();
  71.         }
  72.         @Override
  73.         public void onServiceConnected(ComponentName name, IBinder service) {
  74.             // TODO Auto-generated method stub
  75.             Toast.makeText(ServiceDemo03_Bind.this, "这里是:onServiceConnected", 1000).show();
  76.             System.out.println("onServiceConnected");
  77.             MyService.MyBind myBind = (MyBind) service;
  78.             mService = myBind.getMyService();
  79.         }
  80.     };
  81. }

Service文件

[java][/java] view plaincopy

  1. package com.app.myservice.service;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.R.integer;
  5. import android.app.Service;
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.os.Binder;
  9. import android.os.IBinder;
  10. import android.widget.Toast;
  11. public class MyService extends Service{
  12.     private Timer timer;
  13.     private TimerTask task;
  14.     private int index=0;
  15.     Context context;
  16.     @Override
  17.     public IBinder onBind(Intent intent) {
  18.         // TODO Auto-generated method stub
  19.         return mBind;
  20.     }
  21.     private MyBind mBind = new MyBind();
  22.     public class MyBind extends Binder {
  23.         public MyService getMyService() {
  24.             return MyService.this;
  25.         }
  26.     }
  27.     @Override
  28.     public void onCreate() {
  29.         // TODO Auto-generated method stub
  30.         super.onCreate();
  31.         context = getApplicationContext();
  32.         Toast.makeText(context, "这里是:onCreate", 1000).show();
  33.         System.out.println("onCreate");
  34.     }
  35.     @Override
  36.     public int onStartCommand(Intent intent, int flags, int startId) {
  37.         // TODO Auto-generated method stub
  38.         System.out.println("onStartCommand");
  39.         Toast.makeText(context, "这里是:onStartCommand", 1000).show();
  40.         startTimer();
  41.         return super.onStartCommand(intent, flags, startId);
  42.     }
  43.     @Override
  44.     public void onDestroy() {
  45.         // TODO Auto-generated method stub
  46.         System.out.println("onDestroy");
  47.         Toast.makeText(context, "这里是:onDestroy", 1000).show();
  48.         super.onDestroy();
  49.         stopTimer();
  50.     }
  51.     public void startTimer() {
  52.         timer = new Timer();
  53.         task = new TimerTask() {
  54.             @Override
  55.             public void run() {
  56.                 // TODO Auto-generated method stub
  57.                 index++;
  58.                 System.out.println(index);
  59.             }
  60.         };
  61.         // 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行
  62.         timer.schedule(task, 1000, 1000);
  63.     }
  64.     public void stopTimer() {
  65.         timer.cancel();//取消此计时器任务
  66.     }
  67.     public int getIndex() {
  68.         return index;
  69.     }
  70. }

XML布局文件

[html][/html] view plaincopy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:paddingBottom="@dimen/activity_vertical_margin"
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"
  7.     android:paddingRight="@dimen/activity_horizontal_margin"
  8.     android:paddingTop="@dimen/activity_vertical_margin"
  9.     tools:context=".FirstActivity"
  10.     android:background="#fff" >
  11.     <Button
  12.         android:id="@+id/button1"
  13.         android:layout_width="wrap_content"
  14.         android:layout_height="wrap_content"
  15.         android:layout_alignParentLeft="true"
  16.         android:layout_alignParentTop="true"
  17.         android:layout_marginLeft="38dp"
  18.         android:layout_marginTop="14dp"
  19.         android:text="开始service" />
  20.     <Button
  21.         android:id="@+id/button2"
  22.         android:layout_width="wrap_content"
  23.         android:layout_height="wrap_content"
  24.         android:layout_alignLeft="@+id/button1"
  25.         android:layout_below="@+id/button1"
  26.         android:text="停止cervice" />
  27.     <Button
  28.         android:id="@+id/button3"
  29.         android:layout_width="wrap_content"
  30.         android:layout_height="wrap_content"
  31.         android:layout_alignLeft="@+id/button2"
  32.         android:layout_below="@+id/button2"
  33.         android:text="绑定service" />
  34.     <Button
  35.         android:id="@+id/button4"
  36.         android:layout_width="wrap_content"
  37.         android:layout_height="wrap_content"
  38.         android:layout_alignLeft="@+id/button3"
  39.         android:layout_below="@+id/button3"
  40.         android:text="解除绑定service" />
  41.     <Button
  42.         android:id="@+id/button5"
  43.         android:layout_width="wrap_content"
  44.         android:layout_height="wrap_content"
  45.         android:layout_alignLeft="@+id/button4"
  46.         android:layout_below="@+id/button4"
  47.         android:text="获取service" />
  48. </RelativeLayout>

本文固定链接: http://www.devba.com/index.php/archives/3106.html | 开发吧

报歉!评论已关闭.