• Android之 服务(1)


    1 简介

    服务是Android四大组件之一。不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行。

    有两种方式来启动系统服务。

    一种是调用 Context.startService() 方法。另一种是调用 Context.bindService() 方法。

    2 服务的生命周期

    下面这张图说明了服务的生命周期。当用户调用Context.startService()或者Context.binService()时,系统会启动服务。

    如果服务没有创建,那么系统首先会调用Service类中的onCreate()方法,然后onStart()方法或者onBind()方法将会执行,开启一个服务。

    服务会一直默默地在后台进行,调用Context.stopService()或stopSelf()方法,服务中的onDestroy()会执行,销毁服务。

    当通过Context.bindService()开启服务后,必须通过Context.unbindService()停止服务。

     

    3 实例

    3.1 通过Context.startService()启动服务

    首先新建一个类,继承Service类。

    public class MyService extends Service{
        
        @Override
        public IBinder onBind(Intent intent){
            return null;
        }
        
        @Override
        public void onCreate(){
            super.onCreate();
            Log.d("MyService","onCreate executed!");
        }
        
        @Override
        public void onStart(Intent intent, int startId){
            super.onStart();
            Log.d("MyService","onStart executed!");
        }
        
        @Override
        public void onDestroy(){
            super.onDestroy();
            Log.d("MyService","onDestroy executed!");
        }
        
    }

    然后在活动中通过点击按钮,实现活动的启动或停止。

     3.1 通过Context.bindService()启动服务

     上面的方式,我们只能通过活动界面的按钮来启动和停止服务。如果服务想要跟活动更多的交流,就需要采用另外一种方式来开启活动。

    1、通过Context.bindService()启动服务,我们同样需要继承Service类,重写onBind()方法。

    在onBind()方法中我们返回一个Binder对象。Binder类的API定义如下:

    下面是具体代码:

    public class MyService extends Service {
        private DownloadBinder mBinder = new DownloadBinder();
        
        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,在这个类中我们实现了两个方法,用于启动下载和获取进度。

    2、接下来就是在活动中通过Context.bindService()启动服务,并且用上面的DownloadBinder中定义的方法,与服务随时交互。

    下面是具体代码

    public class MainActivity extends Activity implements OnClickListener {
    
        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;
            }
        }
    }
  • 相关阅读:
    Linux的学习--系统目录
    PHP内核的学习--创建PHP扩展
    PHP的学习--连接MySQL的三种方式
    MIME Type
    颜色的命名
    JavaScript的学习--生成二维码
    MySQL的学习--触发器
    Google Guava之--cache
    java代码调用oracle存储过程
    oracle序列
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6526043.html
Copyright © 2020-2023  润新知