zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6526043.html
Copyright © 2011-2022 走看看