浅谈Android四大组建之一Service---Service与Activity的绑定
从上一篇文章我们学会了如何创建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的绑定的更多相关文章
- 浅谈Android四大组建之一Service---Service的创建
Service是安卓四大组件之一,个人觉得Service的使用还是比较简单的额,可以理解为看不见的Activity,因为Service的使用和Activity十分接近.启动啊,生命周期等,都十分简单. ...
- Android四大组件初识之Service
Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- 浅谈Android五大布局
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
- [转]浅谈Android五大布局(二)——RelativeLayout和TableLayout
在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...
- [转]浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...
随机推荐
- python的常见排序
在python程序中,我们往往自始至终都在与序列(列表.字典.元组)打交道,而最常用的操作就是对序列排序了.在此简单总结一下python中的排序. 基本排序方法 在python中,list对象具有 s ...
- hzau 1206 MathematicalGame
1206: MathematicalGame Time Limit: 2 Sec Memory Limit: 1280 MBSubmit: 124 Solved: 15[Submit][Statu ...
- window上脚本到linux上不能用
window上的脚本一定要用dos2unix 文件名处理一下
- LeetCode OJ:Binary Tree Paths(二叉树路径)
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- OpenCV-Python在图片上输出中文
OpenCV中在图片上输出中文一般需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件.但使用FreeType ...
- 元素为指针的vector的使用说明
该程序演示了vector中的元素为指针的时候的对对象的操作. /* 功能说明: 元素为指针的vector的使用说明 实现方式: 使用this成员来显示各个对象的地址. 限制条件或者存在的问题: 无 * ...
- Centos7 安装 MongoDB4.0
目录 安装包下载 MongoDB安装 启动数据库 补充 小结 诚邀访问我的个人博客:我在马路边 更好的阅读体验点击查看原文:Centos7安装MongoDB4.0 原创博客,转载请注明出处 @ 由于项 ...
- jquery.tmpl的使用
jquery.tmpl是jQuery模板插件,http://plugins.jquery.com/tmpl/ (另外还有一个插件dot.js,不依赖与jquery,性能更佳,使用方法大同小异) 在网页 ...
- 学习动态性能表(20)--v$waitstat
学习动态性能表 第20篇--V$WAITSTAT 2007.6.15 本视图保持自实例启动所有的等待事件统计信息.常用于当你发现系统存在大量的"buffer busy waits" ...
- ubuntu更改用户登录密码
sudo passwd user(root或对应的用户名)