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;
        }
    }
}

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯高校合作

【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

16220
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

22440
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13750
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

18430
来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

35230
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.2K20
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

30540
来自专栏怀英的自我修炼

考研英语-1-导学

英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

12310
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

44830
来自专栏腾讯社交用户体验设计

ISUX Xcube智能一键生成H5

51620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励