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后停止更新。

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

  1. 深入分析Service启动、绑定过程

    Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...

  2. Android学习笔记(八)深入分析Service启动、绑定过程

    Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...

  3. Service启动过程分析

    Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...

  4. 探索 OpenStack 之(11):cinder-api Service 启动过程分析 以及 WSGI / Paste deploy / Router 等介绍

    OpenStack 中的每一个提供 REST API Service 的组件,比如 cinder-api,nova-api 等,其实是一个 WSGI App,其主要功能是接受客户端发来的 HTTP R ...

  5. Service的绑定过程

    --摘自<Android进阶解密> 第一步:ContextImpl到AMS的调用过程 第二步:Service的绑定过程 1)几个与Service相关的对象类型 * ServiceRecor ...

  6. Android深入四大组件(七)Service的绑定过程

    前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大 ...

  7. Service 启动Activity

    1, 在BroadcastReceiver中启动Activity的问题  *  * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity  * Inten ...

  8. Service(一):认识service、绑定Service

    Activity是与用户打交道的,而Service是在后台运行的. 这个程序介绍了下如何启动和停止一个Service,以及在后台打印消息,我添加了一些注释. 在activity_main中将布局改为线 ...

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

    本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为LocalServiceActivities ...

随机推荐

  1. [Python] wxPython 基本控件 (转)

    转自:http://www.cnblogs.com/wangjian8888/p/6028777.html 一.静态文本控件 wx.StaticText(parent, id, label, pos= ...

  2. PHP 生成器语法

    一般你在迭代一组数据的时候,需要创建一个数据,假设数组很大,则会消耗很大性能,甚至造成内存不足. //Fatal error: Allowed memory size of 1073741824 by ...

  3. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  4. SQL Server 一致性读

    我们在Oracle和MySQL数据库中已经对一致性读的概念比较熟悉了,但是在SQL Server中却鲜少提及,但SQL Server自2005版本以来其实也实现了一致性读,几乎所有关系型数据库产品的一 ...

  5. windows平台下实现高可用性和可扩展性-ARR和HLB

    本文档提供了关于如何将应用程序请求路由(ARR)与硬件负载均衡器一起使用以实现高可用性和可伸缩性的说明性指导.本文采用F5大IP负载均衡器来说明ARR与硬件负载平衡器之间的工作关系. IIS7.0及以 ...

  6. LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

    这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共 ...

  7. Unity基础(5) Shadow Map 概述

    这篇是自己看shadow map是的一些笔记,内容稍稍凌乱,如有错误请帮忙纠正 1.常见阴影处理方式 Shadow Map : using Z-Buffer Shadow Mapping 的原理与实践 ...

  8. Docker: dockerfile常用关键字

    Dockerfile指令 Dockfile执行和shell命令一行,一行一行执行- 写Dockerfile注意点: 1.           尽量少RUN 2.           多个命令拼接在一起 ...

  9. MATLAB一元线性回归分析

    MATLAB一元线性回归分析应用举例 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ huigui.m function [b,bint,r,rint, ...

  10. Socket引子

    === ''' Socket网络编程: --应用层:http smtp dns ftp ssh snmp dhcp... 无论协议是什么本质上都是数据交换,总结为两种方式:收和发 --传输层(端口Po ...