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 ...
随机推荐
- 使用Visual Studio Team Services进行压力和性能测试(一)——创建基础的URL压力测试
使用Visual Studio Team Services进行压力和性能测试(一)--创建基础的URL压力测试 概述 压力测试使应用程序更加健壮,并审核在用户负载下的行为,这样我们可以在当前的基础设施 ...
- LeetCode题解之Clone Graph
1.题目描述 2.问题分析 要遍历图,然后标记没有被复制的节点. 3.代码 class Solution { private: unordered_map<Node*, Node*> m; ...
- SQL Server -- 回忆笔记(一):初见数据库
SQL Server知识点回忆篇(一):初见数据库 1. 主键 primary key 唯一标识, 不会重复的值才会用来当做主键使用. 表可以没有主键,但建议每张表都有主键. 2. 数据冗余 ...
- UGUI Set Anchor And Pivot
我的环境 Unity 5.3.7p4 在运行时动态的设置UI元素的锚点和中心点. 设置Anchor 修改offsetMax不生效 使用下面这段代码设置Anchor并不会生效,尽管他和你在属性面板看到的 ...
- Emacs中多个golang项目的配置方法
概述 最近使用golang开发项目时, 发现有时需要同时进行多个golang项目. 在这种情况下, 如果把所有的项目都放在 GOPATH 之下, 不仅管理麻烦(因为各个项目需要提交到不同的代码库), ...
- May 30. 2018 Week 22nd Wednesday
Never forget to say "Thanks." 永远不要忘记说谢谢. Don't take anything we get for granted, and never ...
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创 2017-08-26 翟永超 Spring Cloud 被围观 ...
- poj2635
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/chaoweilanmao/article/details/33417423 这道题一看是大数题就知道 ...
- UVA1374-Power Calculus(迭代加深搜索)
Problem UVA1374-Power Calculus Accept:323 Submit:2083 Time Limit: 3000 mSec Problem Description I ...