• 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;
            }
        }
    }
  • 相关阅读:
    006——数组(六)array_fill()array_filter()array_flip()array_key_exists()array_keys()
    005——数组(五)array_diff_ukey()array_diff_uassoc()array_intersect()array_intersect_assoc()array_intersect_key()array_intersect_ukey()array_intersect_uassoc()
    004——数组(四)array_search() array_change_key_case() array_chunk() array_combine() array_diff() array_diff_key() array_diff_assoc
    laravel中资源路由的控制器创建方法:
    003——数组(三)count()reset()end()prev()next()current()
    002——数组(二)each() list() implode() explode() in_array()
    001——数组(一)数组知识及foreach函数应用
    JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
    tomcat 启动参数 Xms, Xmx, XX:MaxNewSize, XX:PermSize, -XX:MaxPermSize, Djava.awt.headless
    CentOS 7 中firewall-cmd命令
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6526043.html
Copyright © 2020-2023  润新知