美文网首页
Android四大组件——服务

Android四大组件——服务

作者: Aptitude | 来源:发表于2018-08-21 22:14 被阅读0次

学会了markdown,可以更加优雅的在这里显示代码了。
服务:服务属于计算型组件,提供需要在后台长期运行的服务(复杂计算、音乐播放和下载等),主要特点是无用户界面、在后台运行、生命周期长。

服务的基本用法

服务的基本定义

public class serviceExercise extends Service {
    public serviceExercise() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @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() 会在每次服务启动时调用;
  • onDestrory()会在服务销毁时调用。
  • onBind() 活动和服务进行通信

注意:service需要在AndroidManifest.xml中注册才能有效。

启动和停止服务

启动服务

//构建一个Intent对象
Intent startIntent = new Intent(this,serviceExercise.class);
//调用startService()启动服务,这个方法定义在Context类中
startService(startIntent);

停止服务

//构建一个Intent对象
Intent stopIntent = new Intent(this,serviceExercise.class);
//调用stopService()停止服务,这个方法定义在Context类中
stopService(stopIntent);

在serviceExercise中的任何位置调用stopSelf()都可以让服务停下来。

活动与服务进行通信

1. 创建一个Binder对象来对服务的一些功能进行一个管理

private DownloadBinder aBinder= new DownloadBinder();

    class DownloadBinder extends Binder {
        public void startDownload(){
            Log.d("MyService","startDownload executed");
        }
        public int getProgress(){
            Log.d("MyService","get Progress");
            return 0;
        }
    }
//在onBind()中返回创建的Binder对象
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return aBinder;
    }

2. 在活动中创建与服务联系的方法

//创建一个Binder的引用
    private serviceExercise.DownloadBinder downloadBinder;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //生成Binder实例
            downloadBinder = (serviceExercise.DownloadBinder)service;
            //调用DownloadBinder中的方法
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

3. 活动与服务进行绑定

//绑定服务
    Intent bindIntent = new Intent(this,serviceExercise.class);
    /*
    * bindIntent是指创建出的Intent对象
    * connection是指创建出的serviceConnection对象
    * BIND_AUTO_CREATE是指活动和服务进行绑定之后自动创建服务,即执行服务的onCreate(),不执行onStartCommand()
    * */
    bindService(bindIntent,connection,BIND_AUTO_CREATE);
    //解绑服务
    unbindService(connnection);

注意:使用startService()是启动服务开始工作,而bindService()是访问服务中的一些数据或使用其中的一些方法,是为了获取服务于活动的持久连接。

服务的使用技巧

服务是在后台运行的,而且服务的优先级比较低,当出现内存不足的情况下,服务会被回收,若想让服务保持一致运行的状态,可以使用前台服务。

前台服务

public class serviceExercise extends Service {
 @Override
    public void onCreate() {
        super.onCreate();
        Intent intent =new Intent(this, MainActivity.class);
        PendingIntent pi= PendingIntent.getActivity(this,0,intent,0);
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("This is content title")
                .setContentText("This is content text")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargerIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                .setContentIntent(Pi)
                .build();
        startForeground(1,notification);
    }
...
}

使用IntentService

服务中的代码是在主线程中运行的,但一般比较耗时,应使用Android多线程编程技术,在服务每个具体的方法中开启一个子线程。

public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //处理具体的逻辑
                stopSelf();
            }
        }).start();

        return super.onStartCommand(intent, flags, startId);
    }

为了避免程序员忘记开启县城以及自动停止服务,这里有一种更加方便简单的方式是使用IntentService

1. 新建继承于IntentService的类
//创建一个类继承于IntentService
    public class MyIntentService extends IntentService{
        //创建一个无参的构造函数
        public MyIntentService() {
            super("My IntentService");
        }
        //处理具体逻辑
//在这里打印出所使用的线程ID
        @Override
        protected void onHandleIntent(Intent intent) {
            Log.d("My IntentService","Thread id is"+Thread.currentThread().getId());

        }

        @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();
            Log.d("My IntentService","onDestroy executed");
        }
2. 启动服务

启动服务的方式和一般服务相同

Log.d("MainActivity","Thread id is"+Thread.currentThread().getId());
Intent intentService = new Intent(this,MyIntentService.class);
startService(intentService);

注意:

  • 打印出来的主线程的ID和执行服务中方法的线程ID不同,因此说明该服务是在子线程中执行的;
  • 执行完毕之后执行了onDestroy()服务停止;
  • 同样的服务也需要在AndroidManifest.xml中注册。
<service android:name=".MyIntentService"/>

服务就学习到这里,Ending.

相关文章

网友评论

      本文标题:Android四大组件——服务

      本文链接:https://www.haomeiwen.com/subject/idxsiftx.html