从上一篇文章我们学会了如何创建Service,我们通过监听一个按钮,然后再按钮里面通过意图来启动Service。但是我们有没有发现,启动服务以后,Activity和Service之间的联系好像就断开了。两个组建么有太多的关联。那么,这一篇文章我们来介绍,服务和活动之间的绑定。BYW,服务可以和任何一个活动绑定,而且绑定后都可以获取到相同的Binder实例。

关于服务的一点小知识:

一个服务,如果我们调用了startService(),然后再去调用stopService(),那么onDestroy()就会执行,

如果我们调用了bindService()方法后,又去调用unbindService(),那么onDestroy()就也执行,

但是,如果你同时调用了startService()和bindService(),然后只是调用了stopService()或只是调用了unbindService(),那么onDestory()是不会执行的。也就是说,如果你同时调用了startService()和bindService(),那么你就必须同时调用stopService()和unbindService(),onDestory()才会执行。

下面我们还是一样,先看代码吧.

首先是布局文件,布局文件没什么,就是放置四个按钮而已

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.servicedemo.MainActivity" > <Button
android:onClick="onclick"
android:id="@+id/bt_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开启服务"
/> <Button
android:onClick="onclick"
android:id="@+id/bt_stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭服务"
/> <Button
android:onClick="onclick"
android:id="@+id/bt_bind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="绑定服务"
/> <Button
android:onClick="onclick"
android:id="@+id/bt_unbind"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="解绑服务"
/> </LinearLayout>

activity_main.xml

然后是Service文件

  package com.example.servicedemo;

 import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast; /**
***************************************************************
*
* @版权 LinFeng
*
* @作者 LinFeng
*
* @版本 1.0
*
* @创建日期 2016-6-8
*
* @功能描述
*****************************************************************
*/
public class MyService extends Service{ private MusuicBinder mBinder = new MusuicBinder();
/**
* Service中唯一的抽象方法,必须在子类中实现,这里返回一个MusicBinder的实例是为了能和活动绑定
*/
@Override
public IBinder onBind(Intent intent) {
return mBinder;
} /**
* 服务创建的时候调用
*/
@Override
public void onCreate() {
super.onCreate();
} /**
* 每一次服务启动的时候调用,这个案例中,每点击一次start service都会执行的方法
* oncreate只是第一次点击的时候执行
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
} /**
* 服务销毁的时候调用
*/
@Override
public void onDestroy() {
super.onDestroy();
} /**
* 这里我们虚拟出一个后台播放音乐的服务
*/
class MusuicBinder extends Binder{ /**
* 虚拟方法,假装我在播放音乐。。。。
*/
public void playMusic(){
Toast.makeText(MyService.this, "音乐在后台播放", Toast.LENGTH_SHORT).show();
} /**
* 虚拟方法,假装我能拿到播放的进度。。。
*/
public void getProgress(){
Toast.makeText(MyService.this, "播放到80%", Toast.LENGTH_SHORT).show();
}
} }

MyService

然后就是主界面的文件

 package com.example.servicedemo;

 import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { private MyService.MusuicBinder mBinder; boolean bindService ;//用于判断是否有绑定服务 private ServiceConnection connection = new ServiceConnection() { /**
* 解除绑定服务的时候回掉
*/
@Override
public void onServiceDisconnected(ComponentName name) { } /**
* 服务被绑定的时候回掉
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (MyService.MusuicBinder) service; /**
* 调用服务里面的方法
* 成功绑定服务的时候,就会执行这个方法
*/
mBinder.playMusic();
// mBinder.getProgress();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } public void onclick(View v) { switch (v.getId()) {
case R.id.bt_start : /**
* 服务和活动一样,都是用Intent来启动的, 其实可以把服务理解为没有界面的活动
*/
Intent startintent = new Intent(this, MyService.class);
startService(startintent); break;
case R.id.bt_stop : Intent stopintent = new Intent(this, MyService.class);
stopService(stopintent); break;
case R.id.bt_bind : Intent bindIntent = new Intent(this, MyService.class);
bindService = bindService(bindIntent, connection,
BIND_AUTO_CREATE);
if (bindService) {
Toast.makeText(this, "服务已经绑定", Toast.LENGTH_SHORT).show();
}
break;
case R.id.bt_unbind : /**
* 在调用这个unbindService接触绑定的方法的时候一定要十分注意
* 做非空判断,没有绑定服务的情况下去调用解除绑定的方法,会导致
* 程序直接崩溃
*/
if (bindService) {
bindService = false;
unbindService(connection);
Toast.makeText(this, "绑定已经解除", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "服务没有绑定绑定", Toast.LENGTH_SHORT).show();
} break; default :
break;
}
} }

MainActivity

然后就是运行截图了。由于这个例子很简单,讲解就看注释可以了

浅谈Android四大组建之一Service---Service与Activity的绑定的更多相关文章

  1. 浅谈Android四大组建之一Service---Service的创建

    Service是安卓四大组件之一,个人觉得Service的使用还是比较简单的额,可以理解为看不见的Activity,因为Service的使用和Activity十分接近.启动啊,生命周期等,都十分简单. ...

  2. Android四大组件初识之Service

    Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...

  3. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆   代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...

  4. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  5. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  6. 浅谈Android应用性能之内存

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...

  7. 浅谈Android五大布局

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  8. [转]浅谈Android五大布局(二)——RelativeLayout和TableLayout

    在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...

  9. [转]浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

随机推荐

  1. Neutron新进展|DragonFlow在Mitaka版本中的Roadmap

    OpenStack网络在Mitaka版本中将有哪些新变化?1月11日到12日,DragonFlow的PTL——Eran Gampel,Kuryr的PTL——Gal Sagie,和他们的老大从以色列来到 ...

  2. html5 pc端参考网址

    http://huodong.baidu.com/zhuanpan/?SEM&PC&refer=107255

  3. python基础5 - 产生随机数

    随机数 在 Python 中,要使用随机数,首先需要导入 随机数 的 模块 —— “工具包” import random 导入模块后,可以直接在 模块名称 后面敲一个 . 然后按 Tab 键,会提示该 ...

  4. Linux命令之sort用法

    linux之sort用法   sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内 ...

  5. Java 模拟ATM(修正)

    ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0). 模拟AT ...

  6. JVM_总结_03_Java发展史

    一.前言 通过上一节,我们对整个java的技术体系有了一定的了解. 这一节我们来看下Java的发展史. 二.Java发展史 1.时间线 序号 发布日期 JDK 版本 新特性 详细说明 0 1991.0 ...

  7. Codeforces Round #271 (Div. 2)D(递推,前缀和)

    很简单的递推题.d[n]=d[n-1]+d[n-k] 注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时. 所以用预处理前缀和来解决重复累加问题. 最后一个细节坑了我多次: print ...

  8. Linux中几个实用快捷键

    返回上层目录: cd .. 命令提示符: user@ubuntu: @之前的部分为当前用户ID名称:  @之后冒号之前是主机名称 sudo :(Superusers Do) 以超级用户执行 在相对路径 ...

  9. RedHat 6.8 内核编译

    /*************************************************************************** * RedHat 6.8 内核编译 * 说明: ...

  10. Reinforcement Learning Q-learning 算法学习-2

    在阅读了Q-learning 算法学习-1文章之后. 我分析了这个算法的本质. 算法本质个人分析. 1.算法的初始状态是随机的,所以每个初始状态都是随机的,所以每个初始状态出现的概率都一样的.如果训练 ...