从上一篇文章我们学会了如何创建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. QMouseEvent 的坐标__Win

    1. QMouseEvent.x() 和 QMouseEvent.y() 是窗口里面的坐标,相当于 Windows API 里面的 ClientX和ClientY . 2. QMouseEvent.G ...

  2. SPOJ - BALNUM 数位dp

    题意:求某一区间内的平衡数个数(指一个数,其中出现过的数,如果是偶数,那么必须出现奇数次,反之偶数次) 题解:用三进制来枚举(0到9)所有情况,0代表没有出现,1代表出现奇数次,2代表出现偶数次dp[ ...

  3. jquery清空form表单

    //在form表单中添加一个隐藏的reset按钮, <button type="reset" style="display:none;"></ ...

  4. Leetcode 969. Pancake Sorting

    每次找到当前最大数,转两下把最大数转到最右边.重复这个操作,直到都转完. 时间复杂度O(n**2) class Solution(object): def pancakeSort(self, A): ...

  5. python中读写LMDB数据库

    LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件: LMDB文件可以同时由多个进程打开,具有 ...

  6. POJ - 2079:Triangle (旋转卡壳,求最大三角形)

    Given n distinct points on a plane, your task is to find the triangle that have the maximum area, wh ...

  7. HihoCoder1337 动态第k大(treap)

    描述 小Ho:小Hi,之前你不是讲过Splay和Treap么,那么还有没有更简单的平衡树呢? 小Hi:但是Splay和Treap不是已经很简单了么? 小Ho:是这样没错啦,但是Splay和Treap和 ...

  8. Spring框架环境搭建

    环境要求:jdk  1.7 及以上.Spring版本:4.3.2 1.建立普通的java 工程 2.新建lib目录,并将一下5个核心jar包拷贝过来,并加入classpath中 下载地址: http: ...

  9. 编码不规范之将request传参到sevice中

    最近审核团队成员代码,发现确实有很多不规范的地方,其中问题之一就是将request.response.session等参数到传入到sevice层处理,在sevice中通过request对象获取到参数后 ...

  10. [转]HTTP详解(1)-工作原理

    1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...