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后停止更新。
Service启动,绑定与交互的更多相关文章
- 深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- Android学习笔记(八)深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- Service启动过程分析
Service是一种计算型组件,用于在后台执行一系列的计算任务.由于工作在后台,因此用户是无法直接感知到它的存在.Service组件和Activity组件略有不同,Activity组件只有一种运行模式 ...
- 探索 OpenStack 之(11):cinder-api Service 启动过程分析 以及 WSGI / Paste deploy / Router 等介绍
OpenStack 中的每一个提供 REST API Service 的组件,比如 cinder-api,nova-api 等,其实是一个 WSGI App,其主要功能是接受客户端发来的 HTTP R ...
- Service的绑定过程
--摘自<Android进阶解密> 第一步:ContextImpl到AMS的调用过程 第二步:Service的绑定过程 1)几个与Service相关的对象类型 * ServiceRecor ...
- Android深入四大组件(七)Service的绑定过程
前言 我们可以通过调用Context的startService来启动Service,也可以通过Context的bindService来绑定Service,建议阅读此篇文章前请阅读Android深入四大 ...
- Service 启动Activity
1, 在BroadcastReceiver中启动Activity的问题 * * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity * Inten ...
- Service(一):认识service、绑定Service
Activity是与用户打交道的,而Service是在后台运行的. 这个程序介绍了下如何启动和停止一个Service,以及在后台打印消息,我添加了一些注释. 在activity_main中将布局改为线 ...
- 【起航计划 034】2015 起航计划 Android APIDemo的魔鬼步伐 33 App->Service->Local Service Binding 绑定服务 ServiceConnection Binder
本例和下列Local Service Controller 的Activity代码都定义在LocalServiceActivities.Java 中,作为LocalServiceActivities ...
随机推荐
- Android开发CheckBox控件,全选,反选,取消全选
在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...
- Android为TV端助力 deep link(深度链接)与自定义协议!
此自定义仅供参考! 首先打开androidManifest.xml 在MainActivity中添加如下内容: <activity android:name=".MainActivit ...
- android build 编译打印详细过程
我们在make otapackage编译android代码的时候,有时候需要跟踪详细的过程,包括所有的过程,可以修改build/core/Makefile,赋值hide := 为空即可
- 【PHPStorm使用手册】php interpreter is not configured
php interpreter is not configured 未配置php解析器 第一步: 引入下载好的php.exe 打开窗口 file -> settings -> Langua ...
- Scala隐式参数
Scala方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,将自动传递. Scal ...
- [20181206]关于一致性读取3.txt
[20181206]关于一致性读取3.txt --//简单演示一致性读取以及如何读取undo重构数据块的.我不想转储对应的undo块,解析那些复杂的过程. 1.环境:SCOTT@book> @ ...
- 洗礼灵魂,修炼python(87)-- 知识拾遗篇 —— 线程(1)
线程(上) 1.线程含义:一段指令集,也就是一个执行某个程序的代码.不管你执行的是什么,代码量少与多,都会重新翻译为一段指令集.可以理解为轻量级进程 比如,ipconfig,或者, python ...
- php快速定位当前调用的类的位置
php快速定位当前调用的类的位置 $func = new ReflectionMethod('类名', '方法名'); $start = $func->getStartLine() - 1; $ ...
- Kali 2.0 下 Metasploit 初始化配置
在kali 2.0中,命令行中直接输入msfconsole 提示不能连接到数据库 ,是由于postgresql 未启动.因此,需要开启postgresql,并且进行postgresql 的初始化配置. ...
- Vue学习之路4-v-bind指令
1. 定义 1.1 v-bind 指令被用来响应地更新 HTML 属性,其实它是支持一个单一 JavaScript 表达式 (v-for 除外). 2. 语法 2.1 完整语法:<span v- ...