android 学习笔记 服务的基本用法

来源:互联网 发布:json.js下载 编辑:程序博客网 时间:2024/05/20 19:16

新增一个名为MyService的类,并让它继承自Service

 既然是定义一个服务,自然应该在服务中去处理一些事情了,那处理事情的逻辑应该写在哪里呢?这时就可以重写Service中的另外一些方法了,如下所示: 

public class MyService extends Service {         @Override         public IBinder onBind(Intent intent) {            return null;         }         @Override        public void onCreate() {            super.onCreate();         }         @Override        public int onStartCommand(Intent intent, int flags, int startId) {               return super.onStartCommand(intent, flags, startId);         }        @Override        public void onDestroy() {         super.onDestroy();        }  } 
      可以看到,这里重写了onCreate()、onStartCommand()和onDestroy()这三个方法, 它们是每个服务中最常用到的三个方法了。其中onCreate()方法会在服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候 调用。 
      通常情况下,如果我们希望服务一旦启动就立刻去执行某个动作,就可以将逻辑写在onStartCommand()方法里。而当服务销毁时,我们又应该在onDestroy()方法中去回收那些不再使用的资源。 
      另外需要注意,每一个服务都需要在AndroidManifest.xml文件中进行注册才能生效,于是应该修改AndroidManifest.xml文件,代码如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"                package="com.example.servicetest"                android:versionCode="1"                android:versionName="1.0" >                ……                <application                    android:allowBackup="true"                    android:icon="@drawable/ic_launcher"                    android:label="@string/app_name"                    android:theme="@style/AppTheme" >                    ……                    <service android:name=".MyService" >                    </service>                </application>            </manifest> 

 希望在MyService里提供一个下载功能,然后在活动中可以决定何时开始下载,以及随时查看下载进度。实现这个功能的思路是创建一个专门的Binder对象来对下载功能进行管理,修改MyService中的代码,如下所示: 

 public class MyService extends Service {        private DownloadBinder mBinder = new DownloadBinder();        class DownloadBinder extends Binder {            public void startDownload() {                Log.d("MyService", "startDownload executed");            }            public int getProgress() {                Log.d("MyService", "getProgress executed");                return 0;            }         }       @Override           public IBinder onBind(Intent intent) {              return mBinder;        }         …… }                                             

 可以看到,这里我们新建了一个DownloadBinder类,并让它继承自Binder,然后在它 的内部提供了开始下载以及查看下载进度的方法。当然这只是两个模拟方法,并没有实现真正的功能,我们在这两个方法中分别打印了一行日志。 
在activity 中绑定服务 代码如下所示:

public class MainActivity extends Activity implements OnClickListener {     private Button startService;     private Button stopService;     private Button bindService;     private Button unbindService;     private MyService.DownloadBinder downloadBinder;     private ServiceConnection connection = new ServiceConnection() {         @Override         public void onServiceDisconnected(ComponentName name) {          }         @Override         public void onServiceConnected(ComponentName name, IBinder service) {             downloadBinder = (MyService.DownloadBinder) service;             downloadBinder.startDownload();             downloadBinder.getProgress();          }      };     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         ……         bindService = (Button) findViewById(R.id.bind_service);         unbindService = (Button) findViewById(R.id.unbind_service);         bindService.setOnClickListener(this);         unbindService.setOnClickListener(this);      }     @Override     public void onClick(View v) {         switch (v.getId()) { 
                  case R.id.bind_service:                      Intent bindIntent = new Intent(this, MyService.class);                      bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务                      break;                   case R.id.unbind_service:                      unbindService(connection); // 解绑服务                      break;                   default:                      break;                   }               }           } 

   可以看到,这里首先创建了一个 ServiceConnection 的匿名类,在里面重写了 onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在活动与服务 成功绑定以及解除绑定的时候调用。在onServiceConnected()方法中,又通过向下转型得到了DownloadBinder的实例,有了这个实例,活动和服务之间的关系就变得非常紧密了。 现在我们可以在活动中根据具体的场景来调用DownloadBinder 中的任何public方法,即实现了指挥服务干什么,服务就去干什么的功能。这里仍然只是做了个简单的测试,在 onServiceConnected()方法中调用了DownloadBinder的startDownload()和getProgress()方法。 
     当然,现在活动和服务其实还没进行绑定呢,这个功能是在BindService按钮的点击事件里完成的。可以看到,这里我们仍然是构建出了一个Intent对象,然后调用bindService() 方法将MainActivity和MyService进行绑定。bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数则是一个标志位,这里传入BIND_AUTO_CREATE表示在活动和服务进行绑定后自动创建服务。这会使得MyService 中的onCreate()方法得到执行,但onStartCommand()方法不会执行。 
      然后如果我们想解除活动和服务之间的绑定该怎么办呢?调用一下unbindService()方法就可以了,这也是UnbindService按钮的点击事件里实现的功能。 

0 0
原创粉丝点击