• android入门 — Service


      Service完全在后台运行,没有用户界面。使用的时候先创建Service子类,然后在AndroidManifest.xml中进行注册,同时可以通过<intent-filter.../>进行限制启动的Intent。

      Service中重要的方法有:

      1.IBinder onBind(Intent intent):这是Service子类必须实现的方法,这个方法返回一个IBinder对象,应用程序可以通过该对象与Service对象进行通信;

      2.void onCreate():在Service第一次被创建的时候调用;

      3.void onDestroy():在Service被关闭之前调用;

      4.void onStartCommand(Intent intent, int flags, int startId):该方法在客户端调用startService(Intent)来启动Service的时候调用;

      5.boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接的时候调用这个方法。

    第一种方式:使用Activity访问Service

      启动Service:startService(Intent intent)

      关闭Service:stopService(Intent intent)

    第二种方式:绑定本地Service并与之通信

      如果Service和访问者之间需要进行方法调用和数据交换,则应该使用bindService()和unbindService()来启动和关闭Service。

      Context的bindService()方法

        bindService(Intent service, ServiceConnection conn, int flags)

      (1)service指定需要启动的Service

      (2)conn是一个ServiceConnection对象,这个对象用于监听访问者和Service之间的连接情况。当访问者与Service之间连接成功之后会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法,当Service所在的宿主进程异常中断或其他原因停止的时候,会回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。

      (3)flags指定绑定的时候是否自动创建Service(如果Serivice没有创建)。这个参数可以指定为0,或者BIND_AUTO_CREATE(自动创建)。

          ServiceConnection对象的onServiceConnected()方法中有一个IBinder对象,这个对象可实现与被绑定的Service之间的通信。

      

    Service有两种方式调用:

      1.start

      一旦某个组件start一个Service,Service开始独立运行,不再与原来的组件产生任何联系;

      2.bind

      一旦某个组件bind一个Service,Service会为组件提供一个接口,近似于客户端,会进行交互。

    MyService.java

    public class MyService extends Service
    {
        private static final String TAG = "MyService";
    
        //只有在第一次的时候才会被调用
        public void onCreate()
        {
            super.onCreate();
            Log.i(TAG, "onCreate");
        }
    
        //在销毁的时候才会被调用
        @Override
        public void onDestroy()
        {
            super.onDestroy();
            Log.i(TAG, "onDestroy");
        }
    
        //每次请求的时候都会被调用
        @Override
        public int onStartCommand(Intent intent, int flags, int startId)
        {
            Log.i(TAG, "onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent)
        {
            Log.i(TAG, "onBind");
            return new MyBinder();
        }
    
        class MyBinder extends Binder
        {
    
        }
    }
    

      重写了一系列的方法,实现了输出功能。

    public class MainActivity extends AppCompatActivity implements View.OnClickListener
    {
        Button button_start;
        Button button_stop;
        Button button_bindservice;
        Button button_unbindservice;
        private ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
            //连接失败
                Log.i("Activity", "onServiceConnected");
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
            //连接成功
                Log.i("Activity", "onServiceDisconnected");
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //创建启动Service的Intent
            final Intent intent = new Intent(this, MyService.class);
    
            init();
            //设置监听事件
        }
    
        public void init()
        {
            button_start = (Button)findViewById(R.id.StartService);
            button_start.setOnClickListener(this);
            button_stop = (Button)findViewById(R.id.StopService);
            button_stop.setOnClickListener(this);
            button_bindservice  = (Button)findViewById(R.id.BindService);
            button_bindservice.setOnClickListener(this);
            button_unbindservice = (Button)findViewById(R.id.UnbindService);
            button_unbindservice.setOnClickListener(this);
        }
    
        public void onClick(View view)
        {
            Intent intent = new Intent(MainActivity.this, MyService.class);
            switch (view.getId())
            {
                case R.id.StartService:
                    startService(intent);
                    break;
                case R.id.StopService:
                    stopService(intent);
                    break;
                case R.id.BindService:
                    bindService(intent, conn, BIND_AUTO_CREATE);
                    break;
                case R.id.UnbindService:
                    //只需要关闭连接即可
                    unbindService(conn);
                    break;
            }
        }
    }
    

      可以对各个按钮单独设置监听点击的事件,也可以直接统一进行操作。

  • 相关阅读:
    【2020-04-14】吃一折,长一智吧
    对“沟通成本”模型的一个重新假设
    【2020-04-13】稀缺才能让人珍惜
    【2020-04-12】决策都是当前认知的反映
    hhhhh我进步啦!
    求后序遍历(信息学奥赛一本通 1339)
    数的划分(信息学奥赛一本通 1304 洛谷 1025)
    memset函数怎么用嘞↓↓↓
    stack函数怎么用嘞?↓↓↓
    终于开通博客啦!
  • 原文地址:https://www.cnblogs.com/Mr24/p/6895456.html
Copyright © 2020-2023  润新知