Service启动,绑定与交互

1. Service的启动方式有startServcie和bindService两种。

startService时,会经历onCreate—onStartCommand—onDestroy生命周期,

bindService时,会经历onCreate—onBind—onUnbind—onDestroy生命周期。

2. Service与Activity之间交互时,可以通过bindService获取Service的连接的Binder,进而可以获取Service的引用,这样就可以与Service进行交互了。示例中,通过Service每秒更新TextView一次。

ICounterCallback接口

package com.fxb.servicetest;

public interface ICounterCallback {
    public void count(int val);
}

CountService类

package com.fxb.servicetest;

import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

public class CountService extends Service{

    private volatile boolean isRunning = true;
    private CounterBinder counterBinder = new CounterBinder();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(MainActivity.TAG, "on bind!");
        return counterBinder;
    }

    public void startCounter(final int value, final ICounterCallback callback){
        isRunning = true;
        new AsyncTask<Integer, Integer, Void>() {
            @Override
            protected Void doInBackground(Integer... params) {
                int count = params[0];
                while(isRunning){
                    try {
                        Thread.sleep(1000);
                        count++;
                        Log.i(MainActivity.TAG, Integer.toString(count));
                        publishProgress(count);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                callback.count(values[0]);
            }
        }.execute(0);
    }

    public void stopCounter(){
        isRunning = false;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(MainActivity.TAG, "on create!");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(MainActivity.TAG, "on start command!");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(MainActivity.TAG, "on unbind servcie!");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        isRunning = false;
        Log.i(MainActivity.TAG, "on destroy service");
        super.onDestroy();
    }

    @Override
    public boolean stopService(Intent name) {
        Log.i(MainActivity.TAG, "on stop service!");
        return super.stopService(name);
    }

    public class CounterBinder extends Binder{
        public CountService getService(){
            return CountService.this;
        }
    }
}

MainActivity类

package com.fxb.servicetest;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener, ICounterCallback{

    public static final String TAG = "ServiceTest";

    private TextView tvShow;
    private Button btnStartServie, btnStopService;
    private Button btnBindService, btnUnbindService;
    private Button btnStartCounter, btnStopCounter;
    private CountService countService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView(){
        tvShow = (TextView)findViewById(R.id.tvShow);
        btnStartServie = (Button)findViewById(R.id.btnStartService);
        btnStopService = (Button)findViewById(R.id.btnStopService);
        btnBindService = (Button)findViewById(R.id.btnBindService);
        btnUnbindService = (Button)findViewById(R.id.btnUnbindService);
        btnStartCounter = (Button)findViewById(R.id.btnStartCount);
        btnStopCounter = (Button)findViewById(R.id.btnStopCount);

        btnStartServie.setOnClickListener(this);
        btnStopService.setOnClickListener(this);
        btnBindService.setOnClickListener(this);
        btnUnbindService.setOnClickListener(this);
        btnStartCounter.setOnClickListener(this);
        btnStopCounter.setOnClickListener(this);
    }

    private void startCountService(){
        Intent intent = new Intent(MainActivity.this, CountService.class);
        startService(intent);
    }

    private void stopCountService(){
        Intent intent = new Intent(MainActivity.this, CountService.class);
        stopService(intent);
    }

    private void myBindService(){
        Intent intent = new Intent(MainActivity.this, CountService.class);
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    private void myUnbindService(){
        unbindService(serviceConnection);
    }

    @Override
    public void onClick(View v) {
        if(v == btnStartServie){
            Log.i(TAG, "start click");
            startCountService();
        }
        else if(v == btnStopService){
            stopCountService();
        }
        else if(v == btnBindService){
            myBindService();
        }
        else if(v == btnUnbindService){
            myUnbindService();
        }
        else if(v == btnStartCounter){
            if(countService != null){
                countService.startCounter(0, this);
            }
        }
        else if(v == btnStopCounter){
            if(v == btnStopCounter){
                countService.stopCounter();
            }
        }
    }

    @Override
    public void count(int val) {
        tvShow.setText("count:"+val);
    }

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(MainActivity.TAG, "service connected!");
            CountService.CounterBinder binder = (CountService.CounterBinder)service;
            countService = binder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(MainActivity.TAG, "service disconnected!");
        }
    };

}

在bindService之后,点击startCount后,tvShow每隔1s更新一次,点击stopCount后停止更新。

时间: 2024-10-19 21:01:18

Service启动,绑定与交互的相关文章

Android高级编程笔记(八)深入分析Service启动、绑定过程

Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是Android四大组件中与Activity最相似的组件,都代表可执行的程序,区别在于:Service一直运行在后台,没有界面,一旦Service被启动,即完全具有自己的生命周期. 一.创建一个Service 在创建Service时,步骤与Activity很像: 1.继承Service,创建Servi

Android深入四大组件(三)Service的绑定过程

相关文章 Android深入理解四大组件系列 前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大组件(二)Service的启动过程这篇文章,知识点重叠的部分,本篇文章将不再赘述. 1.ContextImpl到ActivityManageService的调用过程 我们可以用bindService方法来绑定Service,它的实现在ContextWra

Android Service的绑定过程

通常我们使用Service都要和它通信,当想要与Service通信的时候,那么Service要处于绑定状态的.然后客户端可以拿到一个Binder与服务端进行通信,这个过程是很自然的. 那你真的了解过Service的绑定过程吗?为什么可以是Binder和Service通信? 同样的先看一张图大致了解一下,灰色背景框起来的是同一个类的方法,如下: 我们知道调用Context的bindService方法即可绑定一个Service,而ContextImpl是Context的实现类.那接下来就从源码的角度

Activity与本地Service的绑定

在Android应用程序中,Activity负责界面的显示,Service负责后台工作,当然后台和界面是需要交互的,所以Activity需要和Service交互. 比较常用的是Activity和本地Service的交互,本文介绍的便是这种,最终实现Activity和Service都能很方便地调用对方的public方法. 其实只要让Activity和Service绑定之后,分别拥有对方的引用就可以了. 以MainActivity和MyService为例 创建一个服务类MyService.java

【起航计划 034】2015 起航计划 Android APIDemo的魔鬼步伐 33 App-&gt;Service-&gt;Local Service Binding 绑定服务 ServiceConnection Binder

本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为LocalServiceActivities 内部类实现的. 调用的Service为LocalService. LocalService既可以做为“Started” Service,也可以做为”Bound” Service. 一个“Bound” Service 可以通过Client/Service模式提供Service.它运行应用程序组件(比如

centos6.6中service启动gearman服务

#!/bin/bash # chkconfig: - 85 15 #descrīption: service(/usr/local/gearmand-1.1.12/sbin/gearmand) . /etc/rc.d/init.d/functions start() { echo -n $"Starting $prog" echo -e " gearman : [确定]" /usr/local/gearmand-1.1.12/sbin/gearmand &

Atitit.面向接口的web&#160;原理与设计重写&#160;路由启动绑定配置url&#160;router&#160;rewriting&#160;urlpage&#160;&#160;mvc&#160;mvp的&#160;java&#160;c#.net&#160;php&#160;js

Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js 原理 通过vm带入启动参数    制定ioc配置文件 绑定各项.. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <ifra

linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动

启动一些程序服务的时候,有时候直接去程序的bin目录下去执行命令,有时候利用service启动. 比如启动mysql服务时,大部分喜欢执行service mysqld start.当然也可以去mysql下执行bin命令带上几个参数什么的. 那么service是啥呢?linux可以man一下,看出来就是去/etc/init.d下执行了可执行的shell脚本. service执行的服务脚本都是在/etc/init.d目录下,各个程序下脚本里执行的命令仍然是在各个bin下. 这样我们也可以在这个目录下

【Android】Activity切换效果——当通过Service启动自己Activity的时候怎么控制

1原因: 当你在网上搜activity切换效果的时候基本就是告诉你要么是XML要么是overridePendingTransition,但是如果你是Service启动的Activity怎么办,这个网上没有一个给出答案了,所以就自己想了下,发现其实很简单. 2解决方案: 其实很简单,让我们了解下原理,所谓的activity切换也无非是activity根据theme或者别人startactivity的时候调用了overridePendingTransition修改了activity切换的参数,所以很