1 前言

最近学习到了安卓的service,记录一下自己对BindService的理解,学习教程以及部分代码来自菜鸟教程的android教程:菜鸟教程安卓端BindService链接

2 正文

先贴一下布局代码和MainActivity.java代码,在分别解释

布局xml:activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9.  
  10. <Button
  11. android:id="@+id/startbtn"
  12. android:gravity="center"
  13. android:textSize="20sp"
  14. android:text="@string/btnstart"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content" />
  17.  
  18. <Button
  19. android:id="@+id/stopbtn"
  20. android:gravity="center"
  21. android:textSize="20sp"
  22. android:text="@string/btnstop"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content" />
  25. <Button
  26. android:id="@+id/getservice"
  27. android:gravity="center"
  28. android:textSize="20sp"
  29. android:text="@string/get"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content" />
  32. </LinearLayout>

MainActivity.java

  1. package com.example.app4;
  2.  
  3. import android.app.Service;
  4. import android.content.ComponentName;
  5. import android.content.Intent;
  6. import android.content.ServiceConnection;
  7. import android.os.IBinder;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.Toast;
  13.  
  14. public class MainActivity extends AppCompatActivity {
  15.  
  16. private Button startbtm;
  17. private Button syopbtn;
  18. private Button getbtn;
  19. Testservice.MyBinder binder;
  20. private ServiceConnection conn = new ServiceConnection() {
  21. @Override
  22. public void onServiceConnected(ComponentName name, IBinder service) {
  23. System.out.println("-----------Service Connected--------------");
  24. binder = (Testservice.MyBinder)service;
  25. }
  26.  
  27. @Override
  28. public void onServiceDisconnected(ComponentName name) {
  29. System.out.println("-----------Service DisConnected--------------");
  30. }
  31. };
  32.  
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. setContentView(R.layout.activity_main);
  37. final Intent intent = new Intent(this,Testservice.class);
  38. intent.setAction("com.example.app4.service.testservice");
  39. startbtm = (Button)findViewById(R.id.startbtn);
  40. syopbtn = (Button)findViewById(R.id.stopbtn);
  41. getbtn = (Button)findViewById(R.id.getservice);
  42. startbtm.setOnClickListener(new View.OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. bindService(intent,conn, Service.BIND_AUTO_CREATE);
  46. }
  47. });
  48. syopbtn.setOnClickListener(new View.OnClickListener() {
  49. @Override
  50. public void onClick(View v) {
  51. unbindService(conn);
  52. }
  53. });
  54. getbtn.setOnClickListener(new View.OnClickListener() {
  55. @Override
  56. public void onClick(View v) {
  57. Toast.makeText(getApplicationContext(),"Service的count值为:"+binder.getCount(),Toast.LENGTH_LONG).show();
  58. }
  59. });
  60. }
  61. }

activity_main.xml分别设置了三个Button,在MainActivity.java中分别以这三个按钮来说明一下我对BindService的流程以及数据传输过程的理解吧

(1)第一个按钮(id为startbtn,也就是下图中绑定服务那个按钮)

先上一张执行截图

该按钮在被点击之时会调用bindService方法,在绑定服务时,我们可以从截图中看到(红色处)首先调用了oncreate方法,然后调用了onbind方法,最后如果整个过程未出现错误,即连接成功的情况下,会回调ServiceConnection类的onServiceConnected方法,当然,如果整个过程出现错误的情况下,就会回调onServiceDisConnected方法。对于这个过程中,通过Binder对象来传输数据,在bindService方法被调用后,在调用onbind方法时,会返回一个Binder对象,在这之后,ServiceConnection类的onServiceConnected方法被调用,该方法接收了返回来的Binder对象,自此,整个数据被传输,我们即可在相关的代码中读取数据即可。例如,在我的代码中(相关代码在本文末尾),在service中,我在service的oncreate方法中创建了一条线程,该线程作用是每隔一秒就对count变量加一,在onbind方法中返回了MyBinder对象(MyBinder对象为Binder对象的子类,是自定义的类,拥有getCount方法,返回变量count的值),最后在onServiceConnected方法中接收,最后调用getCount方法即可得到count的值。

(2)第二个按钮(下图中第二个按钮)

同样,先贴上截图

同上面基本差不多,该按钮在被点击后,会调用unbindservice方法,该方法被调用后,我们可以从截图上面看到,首先调用了onunbind方法,用于解除绑定,最后调用了onderstory方法。

(3)最后一个按钮(下图中最后一个按钮)

该按钮作用只是展现了一下数据传输,在第一个按钮哪里数据传输以及讲了,这里就不再写了。

3  相关代码

strings.xml

  1. <resources>
  2. <string name="app_name">app4</string>
  3. <string name="btnstart">绑定服务</string>
  4. <string name="btnstop">解绑服务</string>
  5. <string name="get">获取service状态</string>
  6. </resources>

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.app4">
  4.  
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:roundIcon="@mipmap/ic_launcher_round"
  10. android:supportsRtl="true"
  11. android:theme="@style/AppTheme">
  12. <activity android:name=".MainActivity">
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15.  
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. <service android:name=".Testservice">
  20. <intent-filter>
  21. <action android:name="com.example.app4.service.testservice"/>
  22. </intent-filter>
  23. </service>
  24. </application>
  25.  
  26. </manifest>

Testservice.java(服务相关代码)

  1. package com.example.app4;
  2.  
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.Binder;
  6. import android.os.IBinder;
  7. import android.util.Log;
  8. import android.widget.Toast;
  9.  
  10. public class Testservice extends Service {
  11.  
  12. private final String tag = "testservice";
  13. private int count;
  14. private boolean quit;
  15. private MyBinder binder = new MyBinder();
  16. public class MyBinder extends Binder{
  17. public int getCount(){
  18. return count;
  19. }
  20. }
  21. @Override
  22. public IBinder onBind(Intent intent) {
  23. Log.i(tag,"onbind方法被调用");
  24. return binder;
  25. }
  26.  
  27. @Override
  28. public void onCreate() {
  29. Log.i(tag,"oncreate方法被调用");
  30. super.onCreate();
  31. new Thread(){
  32. @Override
  33. public void run() {
  34. while(!quit){
  35. try{
  36. Thread.sleep(1000);
  37. }catch (InterruptedException e){
  38. e.printStackTrace();
  39. }
  40. count++;
  41. }
  42. };
  43. }.start();
  44. }
  45.  
  46. @Override
  47. public boolean onUnbind(Intent intent) {
  48. Log.i(tag,"onunbind方法被调用");
  49. return true;
  50. }
  51.  
  52. @Override
  53. public void onDestroy() {
  54. Log.i(tag,"ondestroy方法被调用");
  55. super.onDestroy();
  56. }
  57.  
  58. @Override
  59. public void onRebind(Intent intent) {
  60. Log.i(tag,"onRebind方法被调用");
  61. super.onRebind(intent);
  62. }
  63. }

安卓BindService笔记的更多相关文章

  1. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  2. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  3. 安卓第六天笔记--ListView

    安卓第六天笔记--ListView 1.AdapteView AdapteView 继承ViewGroup它的本质是容器 AdapterView派生了3个子类: AbsListView AbsSpin ...

  4. 安卓开发笔记——丰富多彩的TextView

    随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...

  5. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  6. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  7. 安卓开发笔记——关于Handler的一些总结(上)

    接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...

  8. 安卓开发笔记——Fragment+ViewPager组件(高仿微信界面)

    什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再 ...

  9. 安卓学习笔记---Activity

    由于学期实训的要求,我开始学习安卓了.从本月一号开始,学了五天了.时间短,刚学到的东西容易忘,我记一下笔记. 首先是对Activity的理解.activity首先是一个java类,我们创建一个新的ac ...

随机推荐

  1. Qt+QZXing编写识别二维码的程序

    本人最近在用Qt编写程序,需要用编写二维码识别功能.在网上搜寻一番,找到了QZXing.配置过程中确实出了一大把汗,这里我写这篇文章记录配置方法,替后人省一把汗吧!我的开发环境:MSVC2010 + ...

  2. C# 对字段忽略模型校验

    1.在if (!ModelState.IsValid)之前给字段赋值,然后TryUpdateModel()2.使用如下方法 public ActionResult Create([Bind(Exclu ...

  3. es6基本语法,vue基本语法

    一.es6基本语法 0.es6参考网站 http://es6.ruanyifeng.com/#README 1.let 和 const (1)const特点: 只在局部作用域起作用 不存在变量提升 不 ...

  4. Linux上vim的使用

    .........以下是我在使用vim时的操作经验........... (首先要了解vim主要是命令模式,输入模式,可视化模式,主要区别就是在不同模式下可以完成不同的操作,只是个编辑器,没有必要太纠 ...

  5. scala class中孤立代码块揭秘

    在 scala class中,经常会有很多的代码块需要执行,它们不在任何方法中,只是孤立的代码块. 案例: class Tester(val name:String, num:Integer) { p ...

  6. oracle 和 mysql 常用语句对比汇总

    文章目录 一.数据库管理 1.1 用户管理 1.1.1 mysql用户.权限管理 1.1.2 oracle 用户.角色.权限管理 二.DQL 语句 2.1 基础查询 1.常量查询的区别: 2.字符串拼 ...

  7. 长春理工大学第十四届程序设计竞赛(重现赛)I

    I.Fate Grand Order 题目链接:https://ac.nowcoder.com/acm/contest/912/I 题目: Fate Grand Order是型月社发行的角色扮演类手机 ...

  8. 模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群

    如果你想看 Tomcat 源码但又无从入手,不妨从这个项目开始,代码量不多,但包含了 Tomcat 的核心处理流程,并且源码中有相当丰富的注释.相信通过此项目你能了解: NIO 基本编程.HTTP 协 ...

  9. Angular中input和output使用

    // 写法一: 1 @Components({ 2 ...., 3 inputs:['init'], 4 outputs:['finish'] 5 }) 6 export class xxx(){ 7 ...

  10. 通过CDN引入jQuery的几种方式

    百度 CDN <head> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" ...