前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android入门 — Service

android入门 — Service

作者头像
Mister24
发布2018-05-14 11:00:12
5270
发布2018-05-14 11:00:12
举报
文章被收录于专栏:java初学java初学

  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

代码语言:javascript
复制
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
    {

    }
}

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

代码语言:javascript
复制
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;
        }
    }
}

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档