Services 01

来源:互联网 发布:nodejs 搭配nginx 编辑:程序博客网 时间:2024/06/06 15:37
 服务,那什么是服务呢?用身边的例子来说,马路上的清洁工,餐厅里的服务员,都是属于为人民服务的,官方的说法就是:Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

服务基本上分为两种形式:一个是启动和绑定,今天我们了解启动服务

启动:当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。(网站:https://developer.android.google.cn有详细说法)

要创建服务,就必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务(如适用)。 应重写的最重要的回调方法包括:

1.onStartCommand():当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)
2.onBind()当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。
3.onCreate()首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法。
4.onDestroy()当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

如果组件通过调用 startService() 启动服务(这会导致对 onStartCommand() 的调用),则服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止它为止。如果组件是通过调用 bindService() 来创建服务(且调用 onStartCommand(),则服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。

下面我写了个启动服务(启动服务的方法:startService)、停止服务(停止服务有两种方法一个是stopService,一个是stopSelf
)的例子:
1.写个两个Button,onClink事件,
MainActivity里写两个方法(启动和暂停):
 public void start(View view){        intent.putExtra("data","下载的路径");        startService(intent);    }     public void stop(View view){        stopService(intent);    }}
2.新建一个类MyServices,继承Service,重写onBind(),剩下几个得自己写:
public class MyServices extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {  //onBind()绑定服务        Log.i("test","onBind");        return null;    }    @Override    public void onCreate() {        super.onCreate();        Log.i("test","onCreate");    }       @Override    public int onStartCommand(Intent intent, int flags, int startId) {  //onStartCommand()开启服务        String data=intent.getStringExtra("data");        Log.i("test","onStartCommand,"+data);        new MyThread(startId).start();        return super.onStartCommand(intent, flags, startId);    }    class MyThread extends Thread{        private int startId;        public MyThread(int startId) {            this.startId = startId;        }        @Override        public void run() {            super.run();            //耗时操作            for (int i = 0; i <10 ; i++) {                Log.i("test","i="+i);                SystemClock.sleep(1000);            }            //停止服务            //stopSelf();//当第一个线程执行完毕,则会停止服务            //所有的线程都执行完毕,才停止服务            stopSelf(startId);        }    }    @Override    public void onDestroy() {        super.onDestroy();        Log.i("test","onDestroy");    }}写完服务就去AndroidManifest.xml里配:
<service android:name=".MyServices"            android:exported="true"            ></service>
还有一个服务类是继承IntentService,IntentService重写了一个方法:
public class MyServices2 extends IntentService {    public MyServices2() {        super("");    }    public MyServices2(String name) {        super(name);    }    //类似Service中的:onStartCommand    @Override    protected void onHandleIntent(Intent intent) {        for (int i = 0; i <10 ; i++) {            Log.i("test","i="+i);            SystemClock.sleep(200);        }    }}



 
0 0