从上一篇文章我们学会了如何创建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. python切片、迭代、生成器、列表生成式等高级特性学习

    python高级特性 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 当我们要取一个list中的前n各元素时,如果前n个少的话,我们还可以一个一个的取,但是若前n个元 ...

  2. ebs R12 支持IE11

    如果不考虑升级jdk到1.7的话,可以使用oracle推荐的方法. 1.兼容模式 2.Toolkit to Disable Automatic Delivery of Internet Explore ...

  3. Linux centos 6.5 搭建 svn服务器

    实例:web1 1.安装subversion #yum install subversion #mkdir -p /oop/svn/ //创建svn目录 #chmod -R 777 /oop/svn ...

  4. 实用工具类--第三方开源--Lazy

    下载地址 :https://github.com/ddwhan0123/Lazy 工具 描述 AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabas ...

  5. 23 Python 面向对象

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复 ...

  6. 《ASP.NET夜话》 - 书摘精要

    (P14) 如果客户端启用了Cookie,那么客户端与服务器之间通过Cookie来传递SessionID的值:如果客户端没有启用Cookie,就会通过URL来传递SessionID的值: (P15) ...

  7. 【SQL查询】查询结果分组_Group

    1. 概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组 示例 2. group by的简单操作 3. Group By中Select指定的字段限制 select指定的 ...

  8. poj2336

    题目大意:一个船要把n个车渡过河  船最多载m辆车  把车运过去需要t的时间 回来也要t的时间 给定n辆车依次到河边的时间 求最短运送时间  还有最短跑几趟 一维dp  可以直接d运送时间 dp[i] ...

  9. 在winform下实现左右布局多窗口界面的方法(一)

    在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,通过本文给大家介绍在winform下实现左右布局多窗口 ...

  10. 超时 CS-8610 中性笔

    超时 CS-8610 中性笔 最初觉得这款笔很简单,而且还认为有点丑,因为笔头比较短. 比较特别提这款中性笔比一般的中性笔要粗一点. 使用后才发现比其它的中性笔好用,因为笔杆粗,手感好,笔杆上并没有特 ...