android后台服务的基本用法

Posted 故园的梨花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android后台服务的基本用法相关的知识,希望对你有一定的参考价值。

了解了安卓多线程编程的技术之后,作为安卓的四大组件之一,是十分重要的。

定义一个服务

首先看一下如何在项目中定义一个服务,

public class MyService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("myservice","oncreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("myservice","command");
        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("myservice","destroy");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

这里我们又重写了onCreate(),onStartCommand()和onDestroy()这个三个方法,他们是每个服务中最常用的三个方法,其中onCreate()方法会在服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候调用,通常我们服务销毁时,我们又应该在onDestroy方法中去回收那些不再使用的资源。

每一个服务必须要再陪你文件中注册之后才能使用

  <service android:name=".MyService" />

这样一个服务就完成了。

启动和停止服务:

定义好了服务之后,接下来就是如何去启动以及停止这个服务了,启动和停止的方法主要是借助Intent来实现的,

public class MainActivity extends Activity  implements View.OnClickListener {
  private  Button startService;
    private  Button stopService;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService=(Button)findViewById(R.id.start_service);
        stopService=(Button)findViewById(R.id.stop_service);
        startService.setOnClickListener(this);
        stopService.setOnClickListener(this);


    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.start_service:
                Intent startIntent=new Intent(this,MyService.class);
                startService(startIntent);
                break;
            case R.id.stop_service:
                Intent stopIntent=new Intent(this,MyService.class);
                stopService(stopIntent);
                break;
            default:
                break;
        }

    }

运行效果技术分享

onCreate()和onStartCommand()到底有什么区别呢?

其实onCreate()方法是再服务第一次创建的时候调用的,而onStartCommand()方法是再每次启动服务的时候调用的。

活动和服务进行通信

为了实现这个功能我们创建一乐意专门的Binder对象来下载功能进行管理,修改MyService中的代码,

  private  DownloadBinder binder=new DownloadBinder();
    
    class  DownloadBinder extends Binder{
        public  void  startDownload(){
            Log.d("MyService","startDownload executed");
        }
        public  int  getProgress(){
            Log.d("Myservice","getProgress execute");
            return 0;
        }
    }
 private  Button startService;
    private  Button stopService;
    private Button bindService;
    private Button unbindService;

    private  MyService.DownloadBinder downloadBinder;
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder=(MyService.DownloadBinder)service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService=(Button)findViewById(R.id.start_service);
        stopService=(Button)findViewById(R.id.stop_service);
        startService.setOnClickListener(this);
        stopService.setOnClickListener(this);
        bindService=(Button)findViewById(R.id.bind_service);
        unbindService=(Button)findViewById(R.id.unbinder_Service);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);


    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.start_service:
                Intent startIntent=new Intent(this,MyService.class);
                startService(startIntent);
                break;
            case R.id.stop_service:
                Intent stopIntent=new Intent(this,MyService.class);
                stopService(stopIntent);
                break;
            case R.id.bind_service:
                Intent bindIntent=new Intent(this,MyService.class);
                bindService(bindIntent,connection,BIND_AUTO_CREATE);
                break;
            case  R.id.unbinder_Service:
                unbindService(connection);
                break;
            default:
                break;
        }

    }

可以看大我们首先创建了一个serviceConnection的匿名类,在里面重写了onServiceConnectd()方法和onServiceDisconnected()方法,这两个方法会砸活动与服务成功绑定以及接触绑定的时候调用。

 

服务的最佳实践--后台执行的定时任务:

安卓中的定时任务一般有两种实现方式,一种使用java api里提供的timer类,一种是使用安卓的alarm机制,这两种方式在多数情况下都能实现的类似的效果,但是Timer有一个明显的短板,它并不太合适英语那些需要长时间在后台运行的定时任务。

以上是关于android后台服务的基本用法的主要内容,如果未能解决你的问题,请参考以下文章

当 FragmentActivity 在 Android 中进入后台时出现 NotSerializableException

使用Android导航组件时如何从后台获取片段?

Android从后台堆栈中删除事务

Android Service用法知识点的讲解

MvvmCross Android 片段添加到后台堆栈

在Android Studio片段之间切换时地图片段不隐藏