1 前言

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

2 正文

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

布局xml:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <Button
android:id="@+id/startbtn"
android:gravity="center"
android:textSize="20sp"
android:text="@string/btnstart"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <Button
android:id="@+id/stopbtn"
android:gravity="center"
android:textSize="20sp"
android:text="@string/btnstop"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/getservice"
android:gravity="center"
android:textSize="20sp"
android:text="@string/get"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

MainActivity.java

package com.example.app4;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private Button startbtm;
private Button syopbtn;
private Button getbtn;
Testservice.MyBinder binder;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("-----------Service Connected--------------");
binder = (Testservice.MyBinder)service;
} @Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("-----------Service DisConnected--------------");
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent intent = new Intent(this,Testservice.class);
intent.setAction("com.example.app4.service.testservice");
startbtm = (Button)findViewById(R.id.startbtn);
syopbtn = (Button)findViewById(R.id.stopbtn);
getbtn = (Button)findViewById(R.id.getservice);
startbtm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(intent,conn, Service.BIND_AUTO_CREATE);
}
});
syopbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(conn);
}
});
getbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Service的count值为:"+binder.getCount(),Toast.LENGTH_LONG).show();
}
});
}
}

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

<resources>
<string name="app_name">app4</string>
<string name="btnstart">绑定服务</string>
<string name="btnstop">解绑服务</string>
<string name="get">获取service状态</string>
</resources>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app4"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".Testservice">
<intent-filter>
<action android:name="com.example.app4.service.testservice"/>
</intent-filter>
</service>
</application> </manifest>

Testservice.java(服务相关代码)

package com.example.app4;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast; public class Testservice extends Service { private final String tag = "testservice";
private int count;
private boolean quit;
private MyBinder binder = new MyBinder();
public class MyBinder extends Binder{
public int getCount(){
return count;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.i(tag,"onbind方法被调用");
return binder;
} @Override
public void onCreate() {
Log.i(tag,"oncreate方法被调用");
super.onCreate();
new Thread(){
@Override
public void run() {
while(!quit){
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
count++;
}
};
}.start();
} @Override
public boolean onUnbind(Intent intent) {
Log.i(tag,"onunbind方法被调用");
return true;
} @Override
public void onDestroy() {
Log.i(tag,"ondestroy方法被调用");
super.onDestroy();
} @Override
public void onRebind(Intent intent) {
Log.i(tag,"onRebind方法被调用");
super.onRebind(intent);
}
}

安卓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. 跨进程访问VCL的一个用例(Delphi6、TurboDelphi测试通过)

    Controls.pas单元中有一个FindControl函数,通过句柄获得对应的TWinControl对象. function FindControl(Handle: HWnd): TWinCont ...

  2. JavaScript语言核心--词法结构

    编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序.作为语法的基础,它规定了诸如变量名是什么样的.怎么写注释,以及程序语言之间如何分隔等规则. 1. 字符集 JavaScript程 ...

  3. qtchooser - a wrapper used to select between Qt development binary(2种方法)

    ---------------------------------------------------------------------------------------------------- ...

  4. Microsoft Development Platform Technologies

  5. Windows10 下运行Linux子系统

    关于Windows10 下运行Linux子系统: Windows10内置Linux子系统初体验:http://www.jianshu.com/p/bc38ed12da1d Win10运行Ubuntu版 ...

  6. python列表的内建函数

    list.append(obj) 向列表中添加一个对象obj list.count(obj) 返回一个对象obj 在列表中出现的次数 list.extend(seq)a 把序列seq 的内容添加到列表 ...

  7. 【设计模式】【最后一个】结构型07适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 推荐一个很全面的博客:https://blog.csdn.net/zxt0601/article/details/52848004 定义:将一个类的接口转 ...

  8. 跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh

    SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Gre ...

  9. spark入门(二)RDD基础操作

    1 简述 spark中的RDD是一个分布式的元素集合. 在spark中,对数据的所有操作不外乎创建RDD,转化RDD以及调用RDD操作进行求值,而这些操作,spark会自动将RDD中的数据分发到集群上 ...

  10. Codeforces Gym100543L:Outer space invaders(区间DP)

    题目链接 题意 有n个人,每个人有一个出现时间a和一个开枪时间b和一个距离d,在任意一个时刻,你可以选择炸人,你要炸一个人的花费是和他的距离d,并且所有的已经出现并且还没开枪的和你距离<=d的人 ...